KubernetesはレプリカセットのカウントダウンでTERM信号を使用します。
これは私のアプリケーションにとって非常に危険です。
私はアプリケーションサーバーをシャットダウンするために独自のシャットダウンメカニズムを持つTomcatアプリケーションサーバーを使用します。
オペレーティングシステム(Linux)信号(9、15、...)をjvmに送信すると、JVMはjvm内のスレッドで何をすべきかわからないため、スレッドが正常に完了する前に終了します。
Request -----> BackEnd API -----> [Process] -----> Response
^
Send TERM (Signal) while thread doing Process
Kubernetesコンテナ終了メカニズムを変更する方法はありますか?
私はCubernetesが以下を使用したいと思います:
catalina.sh stop
答え1
これを達成する1つの方法はdumb-initを使用することです。
dumb-initは、ゾンビのような問題に対処するためにコンテナを構築するときにしばしば良い方法です。あなたの場合は、信号を再マッピングすることもできます。
Dockerfileには次の内容があります。
CMD ["dumb-init", "--rewrite", "15:28", "/app/start.sh"]
確認後、kill -l
そのSIGINT
番号でなければなりません15
。
その後、起動スクリプトから信号をキャプチャSIGWINCH
()できます。28
#!/bin/sh
trap "cd /app ; catalina.sh stop" SIGWINCH
[your startup script]
exec $JAVA_HOME/bin/java ...
編集してみると、別の答えが受け入れられるのがわかります。もちろん、コンテナライフサイクルフックは素晴らしいようです。
まず、この機能は約1年間提供されました。クラスタのバージョンによっては使用できない場合があります。
その後、問題になる可能性があるAPIベースのシャットダウンでのみ実行されることがわかります。
答え2
Kubernetesのライフサイクルは、この種の問題に対する良い解決策です。
コンテナライフサイクルフック