簡體   English   中英

在 kubernetes 集群上正常關閉 tomcat

[英]Graceful shutdown of tomcat on a kubernetes cluster

我在 k8s 集群中的 tomcat 上運行一個 java 應用程序,我正在使用預停止生命周期掛鈎在容器終止之前運行/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"]

發現問題:

我正在運行這個 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 提供足夠的時間來完成關閉過程”。

截至 2022 年,我們嘗試添加給定命令/usr/local/tomcat/bin/catalina.sh stop && sleep 30作為我們的 preStop 掛鈎。 但是,我們遇到了一個FailedPreStopHook事件,顯示exited with 137 (137 似乎是內存錯誤)。 經過一些實驗,我們現在有以下設置來正常關閉tomcat (請參閱下面的解釋):

  1. terminationGracePeriodSeconds設置為 30s(默認值 -僅供記憶
  2. preStop 鈎子是/usr/local/tomcat/bin/catalina.sh stop 20
  3. tomcat圖像中,我們將unloadDelay="10000"添加到Context

由於調用 preStop 掛鈎時寬限期開始,我們認為總共 30 秒應該足以正常關閉。 添加到catalina stop命令的參數20tomcat 20s 正常關閉並在退出之前等待它- 在catalina.sh / tomcat的控制下,這避免了FailedPreStopHook事件。 最后,添加的unloadDelay="10000"應該告訴 tomcat 最多等待 30 秒,讓 servlet 完成正在進行的連接。 請注意,a) 在調用 preStop 掛鈎的同時(即終止過程的開始),Pod 狀態設置為Terminating並且不再有新的連接被入口/負載均衡器路由到它,以及 b) preStop hook 延遲將SIGTERM發送到 then pod 中的進程。

以下是我們遇到的更多資源:

有關catalina.sh參數的更詳細說明,您也可以調用catalina.sh --help ,給出:

/usr/local/apache-tomcat-10.0.22 # catalina.sh --help
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /opt/java/openjdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Usage: catalina.sh ( commands ... )
commands:
  debug             Start Catalina in a debugger
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM