在 Kubernetes 集群上正常关闭 tomcat

Rev*_*ddy 4 java tomcat docker kubernetes

我正在 k8s 集群中的 tomcat 上运行 java 应用程序,我正在使用 prestop 生命周期钩子/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"]
Run Code Online (Sandbox Code Playgroud)

Rev*_*ddy 5

发现问题:

我正在运行这个 prestop 生命周期钩子:

生命周期:preStop:exec:命令:[“/usr/local/tomcat/bin/catalina.sh”]

它应该是这样的:

生命周期:preStop:exec:命令:[“/usr/local/tomcat/bin/catalina.sh && sleep 30”]

在第一种情况下,K8s 试图在调用 shutdown.sh 后立即退出生命周期钩子,而无需等待 tomcat 耗尽所有线程。

根据您的应用程序,它只需要大约 5-10 秒。休眠 30 秒将使 prestop 钩子保持活动状态,这应该为 tomcat 提供足够的时间来完成关闭过程”。