Kubernetes に精通しており、アプリケーションコンテナの起動前または停止前に、リソースのデプロイやグレースフルシャットダウンなどの特定のアクションを実行する必要がある場合は、アプリケーションライフサイクル管理を設定できます。このトピックでは、Serverless App Engine (SAE) アプリケーションの PostStart、PreStop、および TerminationGracePeriodSeconds の設定方法について説明します。
概要
-
Pod フック (またはコンテナフック) は、Kubernetes のコンポーネントである kubelet によって管理され、コンテナのライフサイクルの主要な段階でカスタムタスクを実行します。これらの段階には、コンテナプロセスの開始前 (PostStart) と終了前 (PreStop) が含まれます。フックにより、Kubernetes はコンテナのライフサイクルをより柔軟かつ正確に管理できます。詳細については、「Container Lifecycle Hooks」をご参照ください。
-
PostStart:コンテナが作成された直後に実行され、このイベントをコンテナに通知するライフサイクルフックです。ハンドラにパラメーターは渡されません。ハンドラが失敗した場合、コンテナは終了し、その再起動ポリシーに従って再起動されます。
-
PreStop:コンテナが終了する前にトリガーされるライフサイクルフックで、通常はクリーンアップタスクの実行やグレースフルシャットダウンの実行に使用されます。Kubernetes がコンテナに終了シグナル (SIGTERM など) を送信する前に、フックハンドラはその実行を完了する必要があります。ハンドラの結果に関係なく、完了すると Kubernetes は SIGTERM シグナルを送信し、指定された期間待機してからコンテナを強制的に終了します。
-
-
TerminationGracePeriodSeconds:この設定は、コンテナが強制的に停止される前にクリーンアップとシャットダウン操作を完了できるように、コンテナの終了猶予期間を指定します。これにより、突然の終了によって引き起こされるデータ損失、リクエストの失敗、サービスの可用性の低下などの問題を防止し、安定性を向上させます。PreStop フックと組み合わせることで、完全なグレースフルシャットダウンプロセスが可能になります。
エントリポイント
エントリポイントはシナリオによって異なります:
アプリケーションの作成
-
SAE コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。リージョンと名前空間を選択し、[アプリケーションの作成] をクリックします。
-
[基本情報] ウィザードページで、必須パラメーターを設定し、[次へ:詳細設定] をクリックします。
-
[詳細設定] ページで、[アプリケーションライフサイクル管理] セクションを見つけて展開します。
実行中のアプリケーションの変更
アプリケーションを再デプロイすると、アプリケーションが再起動します。サービスの中断を避けるため、オフピーク時にデプロイを実行してください。
-
SAE コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。リージョンと名前空間を選択し、対象のアプリケーション名をクリックします。
-
アプリケーションの [基本情報] ページで、[アプリケーションのデプロイ] をクリックします。
-
[アプリケーションのデプロイ] ページで、[アプリケーションライフサイクル管理] セクションを見つけて展開します。
停止中のアプリケーションの変更
-
SAE コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。リージョンと名前空間を選択し、対象のアプリケーション名をクリックします。
-
アプリケーションの [基本情報] ページで、[アプリケーション設定の変更] をクリックします。
-
[アプリケーション設定の変更] ページで、[アプリケーションライフサイクル管理] セクションを見つけて展開します。
操作手順
[アプリケーションライフサイクル管理] セクションで、必要に応じて PostStart、PreStop、および TerminationGracePeriodSeconds を設定します。
コンテナのライフサイクル管理ループを完全に確立し、サービスのスムーズな起動とシャットダウン、リソースの秩序ある解放、およびゼロダウンタイム運用を保証するために、3 つすべての設定を構成することを推奨します。
PostStart
[アプリケーションライフサイクル管理] セクションで、[PostStart] タブにて PostStart フックを設定します。
SAE は 2 つのシェルインタープリターを提供します:
-
>_ /bin/sh
-
>_ /bin/bash
たとえば、アプリケーションが起動する前に、Hello from the postStart handler という内容を /usr/share/message ファイルに書き込みます。
>_/bin/sh を選択し、コードエディタに次のコマンドを入力します: echo "Hello from the postStart handler" > /usr/share/message。
本番環境では、ビジネス要件に基づいて設定を構成してください。このトピックで提供される例は、最小限の検証目的のみであり、本番環境では使用しないでください。
結果の確認:
アプリケーションが作成または再デプロイされた後、Webshell を使用してインスタンスのターミナルを開き、/usr/share/message ファイルが存在し、期待される内容が含まれていることを確認します。
[~]$cat /usr/share/message
Hello from the postStart handler
[~]$
PreStop
[アプリケーションライフサイクル管理] セクションで、[PreStop] タブにて PreStop フックを設定します。
SAE は 2 つのシェルインタープリターを提供します:
-
>_ /bin/sh
-
>_ /bin/bash
たとえば、コンテナが終了する前に、スクリプトを実行して Perform cleanup を /cleanup.log ファイルに書き込み、検証のために 100 秒待機します。
本番環境では、ビジネス要件に基づいて設定を構成してください。このトピックで提供される例は、最小限の検証目的のみであり、本番環境では使用しないでください。
>_/bin/sh を選択し、コードエディタに次のコマンドを入力します: echo "Perform cleanup" > /cleanup.log && sleep 100。
結果の確認:
アプリケーションの [基本情報] ページで、[アプリケーションの停止] をクリックします。その後、Webshell を使用してインスタンスのターミナルを開き、/cleanup.log ファイルが存在し、期待される内容が含まれていることを確認します。
[/]$cat /cleanup.log
Perform cleanup
[/]$
TerminationGracePeriodSeconds
[アプリケーションライフサイクル管理] セクションの [TerminationGracePeriodSeconds] タブで、グレースフルシャットダウンのタイムアウトを 60 秒に設定します。
グレースフルシャットダウンのタイムアウトが、コンテナが正常に終了するために必要な時間よりも短い場合、コンテナは強制的に終了されます (シグナル:SIGKILL、終了コード:137)。この必要な時間には、PreStop フックの実行と、コンテナによる SIGTERM シグナルの処理の両方が含まれます。たとえば、コンテナが正常に終了するのに 100 秒かかるが、タイムアウトが 60 秒に設定されている場合、コンテナはグレースフルシャットダウンが完了する前に強制終了されます。
結果の確認:
この例では、検証目的で、グレースフルシャットダウンのタイムアウトがコンテナのグレースフルシャットダウン時間よりも意図的に短く設定されています。
アプリケーションの [基本情報] ページで、[アプリケーションの停止] をクリックします。その後、Webshell を使用してインスタンスのターミナルを開き、コンテナが終了コード 137 を報告することを確認します。
グレースフルシャットダウン中、コンテナは設定されたタイムアウトが切れるまで Terminating 状態のままです。
[/]${"metadata":{},"status":"Failure","message":"command terminated with non-zero exit code: error executing command [env COLUMNS=137 ROWS=46 LINES=46 /bin/sh -i -c /bin/bash || clear;/bin/sh], exit code 137","reason":"NonZeroExitCode","details":{"causes":[{"reason":"ExitCode","message":"137"}]}}