

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

# コンテナライフサイクルフックを設定する
<a name="lifecycle-hooks"></a>

正常なコンテナのシャットダウン中、クライアントがダウンタイムを経験しないように、アプリケーションはシャットダウンを開始して`SIGTERM`シグナルに応答する必要があります。アプリケーションは、次のようなクリーンアップ手順を実行する必要があります。
+ データの保存
+ ファイル記述子を閉じる
+ データベース接続を閉じる
+ 処理中のリクエストを正常に完了する
+ ポッド終了リクエストを満たすためにタイムリーに終了する

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

[コンテナライフサイクルフック](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/)を使用すると、コンテナは管理ライフサイクルのイベントを認識できます。コンテナは、対応するライフサイクルフックが実行されたときにハンドラーに実装されたコードを実行できます。コンテナライフサイクルフックは、Kubernetes とクラウドの非同期的な性質の回避策を提供します。このアプローチにより、進入リソースの前に終了ポッドに転送され、ポッドに新しいトラフィックを送信しないように更新`iptables`される接続が失われるのを防ぐことができます。

コンテナライフサイクル、`Endpoint`、 `EndpointSlice`は、さまざまな APIs。これらの APIs をオーケストレーションすることが重要です。ただし、ポッドが終了すると、Kubernetes API は kubelet (コンテナライフサイクル用) と`EndpointSlice`コントローラーの両方に同時に通知します。図を含む詳細については、*「Amazon EKS ベストプラクティスガイド*[」の「クライアントリクエストを適切に処理](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_handle_the_client_requests)する」を参照してください。

`kubelet` がポッド`SIGTERM`に送信すると、`EndpointSlice`コントローラーは`EndpointSlice`オブジェクトを終了しています。この終了は、Kubernetes API サーバーに通知して、 を更新する各ノード`kube-proxy`の に通知します`iptables`。これらのアクションは同時に行われますが、それらのアクション間に依存関係やシーケンスはありません。`kube-proxy` 各ノードの がローカル`iptables`ルールを更新するよりも、コンテナが`SIGKILL`シグナルを受信する可能性が高くなります。その場合は、次のようなシナリオが考えられます。
+ アプリケーションが の受信時に処理中のリクエストと接続をすぐに急に切断すると`SIGTERM`、クライアントに`500`エラーが表示されます。
+ アプリケーションが の受信時にすべての処理中のリクエストと接続が完全に処理されるようにした場合`SIGTERM`、猶予期間中、`iptables`ルールがまだ更新されていない可能性があるため、新しいクライアントリクエストは引き続きアプリケーションコンテナに送信されます。クリーンアップ手順がコンテナのサーバーソケットを閉じるまで、これらの新しいリクエストは新しい接続になります。猶予期間が終了すると、 の送信後に確立された新しい接続`SIGTERM`は無条件に削除されます。

前述のシナリオに対処するには、アプリ内統合または PreStop ライフサイクルフックを実装できます。図を含む詳細については、*「Amazon EKS ベストプラクティスガイド*」の[「アプリケーションを適切にシャットダウン](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_shutdown_applications)する」を参照してください。

**注記**  
アプリケーションが正常にシャットダウンされるかどうか、または`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 ドキュメントの[「コンテナフック](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks)」および*「Amazon EKS ベストプラクティスガイド*」の[「アプリケーションを適切にシャットダウン](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_shutdown_applications)する」を参照してください。