[英]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
(請參閱下面的解釋):
terminationGracePeriodSeconds
設置為 30s(默認值 -僅供記憶)/usr/local/tomcat/bin/catalina.sh stop 20
tomcat
圖像中,我們將unloadDelay="10000"
添加到Context
由於調用 preStop 掛鈎時寬限期開始,我們認為總共 30 秒應該足以正常關閉。 添加到catalina stop
命令的參數20
給tomcat
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.