我正在k8s集群中的tomcat上运行Java应用程序,我正在使用prestop生命周期挂钩在容器终止之前运行/usr/local/tomcat/bin/shutdown.sh
。还定义了60秒的终止宽限期。
预期的行为:当我杀死吊舱或删除部署时,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"]
答案 0 :(得分:2)
发现了问题:
我正在运行此停止前生命周期挂钩:
生命周期: preStop: 执行: 命令:[“ / usr / local / tomcat / bin / catalina.sh”]
应该是这样的:
生命周期: preStop: 执行: 命令:[“ / usr / local / tomcat / bin / catalina.sh && sleep 30”]
在第一种情况下,K8试图在调用shutdown.sh时立即退出生命周期挂钩,而没有等待tomcat耗尽所有线程。
大约需要5到10秒,具体取决于您的应用。睡眠30秒钟将使prestop钩保持活动状态,这应该给Tomcat留出足够的时间来完成关闭过程。”