翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
コンテナライフサイクルフックを設定する
正常なコンテナのシャットダウン中、クライアントがダウンタイムを経験しないように、アプリケーションはシャットダウンを開始してSIGTERM
シグナルに応答する必要があります。アプリケーションは、次のようなクリーンアップ手順を実行する必要があります。
データの保存
ファイル記述子を閉じる
データベース接続を閉じる
処理中のリクエストを正常に完了する
ポッド終了リクエストを満たすためにタイムリーに終了する
クリーンアップが終了するのに十分な猶予期間を設定します。SIGTERM
シグナルに応答する方法については、アプリケーションで使用するプログラミング言語のドキュメントを参照してください。
コンテナライフサイクルフックiptables
される接続が失われるのを防ぐことができます。
コンテナライフサイクルと Endpoint および EndpointSlice は、さまざまな APIs。これらの APIs をオーケストレーションすることが重要です。ただし、ポッドが終了すると、Kubernetes API は kubelet (コンテナライフサイクル用) とEndpointSlice
コントローラーの両方に同時に通知します。図を含む詳細については、「EKS ベストプラクティスガイド」の「クライアントリクエストを適切に処理
kubelet
がポッドSIGTERM
に送信すると、EndpointSlice
コントローラーはEndpointSlice
オブジェクトを終了しています。この終了は、Kubernetes API サーバーに通知して、 を更新する各ノードkube-proxy
の に通知しますiptables
。これらのアクションは同時に行われますが、それらの間に依存関係やシーケンスはありません。kube-proxy
各ノードの がローカルiptables
ルールを更新するよりも、コンテナがSIGKILL
シグナルを受信する可能性が高くなります。この場合、考えられるシナリオは次のとおりです。
-
クライアントを受信したときに、アプリケーションがすぐに処理中のリクエストと接続
SIGTERM,
を急に切断すると、500
エラーが表示されます。 -
アプリケーションが、すべての処理中のリクエストと接続が の受信時に完全に処理されるようにした場合
SIGTERM
、猶予期間中、iptables
ルールがまだ更新されていない可能性があるため、新しいクライアントリクエストは引き続きアプリケーションコンテナに送信されます。クリーンアップ手順がコンテナ上のサーバーソケットを閉じるまで、これらの新しいリクエストは新しい接続になります。猶予期間が終了すると、 の送信後に確立された新しい接続SIGTERM
は無条件に削除されます。
前述のシナリオに対処するには、アプリケーション内統合または PreStop ライフサイクルフックを実装できます。図を含む詳細については、「EKS ベストプラクティスガイド」の「アプリケーションを適切にシャットダウン
注: アプリケーションが正常にシャットダウンされるかどうか、またはpreStop
フックの結果にかかわらず、アプリケーションコンテナは最終的に を通じて猶予期間の終了時に終了しますSIGKILL
。
コマンドで preStop
フックsleep
を使用して、 の送信を遅延させますSIGTERM
。これにより、イングレスオブジェクトが新しい接続をポッドにルーティングしている間、新しい接続を引き続き受け入れることができます。次の例に示すように、 sleep
コマンドの時間値をテストして、Kubernetes やその他のアプリケーションの依存関係のレイテンシーが考慮されていることを確認します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: containers: - name: nginx lifecycle: # This "sleep" preStop hook delays the Pod shutdown until # after the Ingress Controller removes the matching Endpoint or EndpointSlice preStop: exec: command: - /bin/sleep - "20" # This period should be turned to Ingress/Service Mesh update latency
詳細については、「Container hooks