翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
コンテナライフサイクルフックを設定する
正常なコンテナのシャットダウン中、クライアントがダウンタイムを経験しないように、アプリケーションはシャットダウンを開始してSIGTERMシグナルに応答する必要があります。アプリケーションは、次のようなクリーンアップ手順を実行する必要があります。
-
データの保存
-
ファイル記述子を閉じる
-
データベース接続を閉じる
-
処理中のリクエストを正常に完了する
-
ポッド終了リクエストを満たすためにタイムリーに終了する
クリーンアップが終了するのに十分な猶予期間を設定します。SIGTERM シグナルに応答する方法については、アプリケーションで使用するプログラミング言語のドキュメントを参照してください。
コンテナライフサイクルフックiptablesされる接続が失われるのを防ぐことができます。
コンテナライフサイクル、Endpoint、 EndpointSliceは、さまざまな APIs。これらの APIs をオーケストレーションすることが重要です。ただし、ポッドが終了すると、Kubernetes API は kubelet (コンテナライフサイクル用) とEndpointSliceコントローラーの両方に同時に通知します。図を含む詳細については、「Amazon EKS ベストプラクティスガイド」の「クライアントリクエストを適切に処理する」を参照してください。
kubelet がポッドSIGTERMに送信すると、EndpointSliceコントローラーはEndpointSliceオブジェクトを終了しています。この終了は、Kubernetes API サーバーに通知して、 を更新する各ノードkube-proxyの に通知しますiptables。これらのアクションは同時に行われますが、それらのアクション間に依存関係やシーケンスはありません。kube-proxy 各ノードの がローカルiptablesルールを更新するよりも、コンテナがSIGKILLシグナルを受信する可能性が高くなります。その場合は、次のようなシナリオが考えられます。
-
アプリケーションが の受信時に処理中のリクエストと接続をすぐに急に切断すると
SIGTERM、クライアントに500エラーが表示されます。 -
アプリケーションが の受信時にすべての処理中のリクエストと接続が完全に処理されるようにした場合
SIGTERM、猶予期間中、iptablesルールがまだ更新されていない可能性があるため、新しいクライアントリクエストは引き続きアプリケーションコンテナに送信されます。クリーンアップ手順がコンテナのサーバーソケットを閉じるまで、これらの新しいリクエストは新しい接続になります。猶予期間が終了すると、 の送信後に確立された新しい接続SIGTERMは無条件に削除されます。
前述のシナリオに対処するには、アプリ内統合または PreStop ライフサイクルフックを実装できます。図を含む詳細については、「Amazon 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
詳細については、Kubernetes ドキュメントの「コンテナフック