在Kubernetes集群上正常关闭Tomcat

时间:2018-08-24 21:27:47

标签: java docker tomcat kubernetes

我正在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"]

1 个答案:

答案 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留出足够的时间来完成关闭过程。”