我正在 k8s 集群中的 tomcat 上运行 java 应用程序,我正在使用预停止生命周期 Hook 在容器终止之前运行 /usr/local/tomcat/bin/shutdown.sh
。还定义了 60 秒的终止宽限期。
预期行为:当我终止 pod 或删除部署时,tomcat 正常关闭。
实际行为:tomcat 突然关闭。
有什么想法吗?提前致谢。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
annotations:
spec:
replicas: 2
selector:
matchLabels:
app: sample
name: sample
template:
metadata:
labels:
app: sample
name: sample
spec:
hostname: sample-web
terminationGracePeriodSeconds: 60
volumes:
- name: splunk-inputs
configMap:
name: splunk-conf
items:
- key: inputs.conf
path: ./inputs.conf
- name: splunk-outputs
configMap:
name: splunk-conf
items:
- key: outputs.conf
path: ./outputs.conf
- name: docker-socket
hostPath:
path: /var/run/docker.sock
- name: tomcat-log-common
emptyDir: {}
containers:
- name: sample
image: sampleregistery.azurecr.io/root
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command: ["/usr/local/tomcat/bin/shutdown.sh"]
最佳答案
发现问题:
我正在运行这个停止前生命周期钩子(Hook):
生命周期: 停止前: 执行: 命令:["/usr/local/tomcat/bin/catalina.sh 停止"]
应该是这样的:
生命周期: 停止前: 执行: 命令:[“/usr/local/tomcat/bin/catalina.sh stop && sleep 30”]
在第一种情况下,K8s 试图在调用 shutdown.sh 时立即退出生命周期钩子(Hook),而不是等待 tomcat 耗尽所有线程。
它只需要大约 5-10 秒,具体取决于您的应用。 hibernate 30 秒将使预停止 Hook 保持 Activity 状态,这应该为 tomcat 提供足够的时间来完成关闭过程”。
关于java - 在 kubernetes 集群上正常关闭 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011947/