コンテナライフサイクルフックを設定する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コンテナライフサイクルフックを設定する

正常なコンテナのシャットダウン中、クライアントがダウンタイムを経験しないように、アプリケーションはシャットダウンを開始してSIGTERMシグナルに応答する必要があります。アプリケーションは、次のようなクリーンアップ手順を実行する必要があります。

  • データの保存

  • ファイル記述子を閉じる

  • データベース接続を閉じる

  • 処理中のリクエストを正常に完了する

  • ポッド終了リクエストを満たすためにタイムリーに終了する

クリーンアップが終了するのに十分な猶予期間を設定します。SIGTERM シグナルに応答する方法については、アプリケーションで使用するプログラミング言語のドキュメントを参照してください。

コンテナライフサイクルフックを使用すると、コンテナは管理ライフサイクルのイベントを認識できます。コンテナは、対応するライフサイクルフックの実行時にハンドラーに実装されたコードを実行できます。コンテナライフサイクルフックは、Kubernetes とクラウドの非同期的な性質の回避策を提供します。このアプローチにより、イングレスリソースの前に終了ポッドに転送され、ポッドに新しいトラフィックを送信しないように更新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 and EKS Best Practices – Load Balancing (Gracefully shut applications)」を参照してください。