java - 在 kubernetes 集群上正常关闭 tomcat

标签 java docker tomcat kubernetes

我正在 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/

相关文章:

java - 泛型:基于泛型类的泛型类

linux - 如何更改top命令的工作方式

docker - 在Dockerfile CMD指令中有条件地设置标志

docker - 在Nginx配置中使用docker-compose服务名称

java - java中的字符串替换()

java - 在 EC2 实例 Ubuntu rabbitmq 上使用 RabbitMQ 线程 "main"java.net.UnknownHostException 中的异常

java - Java 垃圾回收会影响方法吗?

tomcat - 为什么不能在 WindowsXP SP3 上将 tomcat 作为服务安装?

java - 如何强制tomcat重新加载以重置静态AtomicBoolean

eclipse - 无法将 Google Cloud 应用程序代码编译为 java 1.7 - 版本始终为 1.8