次の方法で共有


Azure Spring Apps でホストされているアプリの正常性プローブと正常終了期間を構成する方法

この記事の適用対象: ✔️ Java ✔️ C#

この記事の適用対象: ✔️ Basic または Standard ✔️ Enterprise

この記事では、正常性プローブと正常終了期間を使用して、Azure Spring Apps で実行されているアプリをカスタマイズする方法について説明します。

プローブとは、アプリ インスタンスで Azure Spring Apps によって定期的に実行される診断アクティビティのことです。 診断を行うために、Azure Spring Apps は次のいずれかのアクションを実行します。

  • アプリ インスタンス内で好きな任意のコマンドを実行する。
  • TCP ソケット接続を確立する。
  • HTTP 要求を行う。

Azure Spring Apps では、すべてのアプリケーションに対して既定の正常性プローブ規則が提供されます。 この記事では、3 種類の正常性プローブを使ってアプリケーションをカスタマイズする方法を示します。

  • Liveness probes はアプリケーションを再起動するタイミングを決定します。 たとえば、liveness probe は、アプリケーションが動作しているのに進まないといったデッドロックを特定できます。 アプリケーションをデッドロック状態で再起動すると、エラーが発生してもアプリケーションを利用できるようになります。

  • Readiness probes は、アプリ インスタンスがトラフィックの受け入れを開始できる状態になったときを判定します。 たとえば、Readiness probes は、どのアプリ インスタンスがアプリケーションのバックエンドとして使用されるかを制御できます。 準備ができていないアプリ インスタンスは、Kubernetes サービス検出から削除されます。 詳しくは、「Spring Boot アプリケーションを検出して登録する」をご覧ください。 Enterprise プランでのサービス検出の詳細については、「Tanzu サービス レジストリの使用」を参照してください

  • Startup probes は、アプリケーションがいつ起動したかを判定します。 Startup probes は、起動が成功するまでライブ性と準備性のチェックを無効にして、Liveness probe と Readiness probe がアプリケーションの起動に干渉しないようにします。 Startup probes を使用して起動が遅いアプリケーションに対してライブ性チェックを実行して、アプリが立ち上がって稼働する前に終了するのを防ぐことができます。

前提条件

  • Azure Spring Apps 拡張機能を使用した Azure CLI。 次のコマンドを使用して、以前のバージョンを削除し、最新の拡張機能をインストールします。 以前に spring-cloud 拡張機能をインストールした場合は、構成とバージョンの不一致を回避するために、それをアンインストールしてください。

    az extension remove --name spring
    az extension add --name spring
    az extension remove --name spring-cloud
    

アプリケーションの正常性プローブと正常終了を構成する

次のセクションでは、Azure CLI を使用して正常性プローブと正常終了を構成する方法について説明します。

正常終了

次の表では、正常終了を構成するために使用できる terminationGracePeriodSeconds プロパティについて説明します。

プロパティ名 説明
terminationGracePeriodSeconds アプリ インスタンスで実行されているプロセスに終了シグナルが送信されてから、強制的に停止されるまでの時間 (秒単位) です。 この値は、プロセスの予想されるクリーンアップ時間よりも長く設定します。 値には、負以外の整数値を指定する必要があります。 猶予期間を 0 に設定すると、アプリ インスタンスが強制終了シグナルによって直ちに停止し、シャットダウンする機会がなくなります。 値が nil の場合、Azure Spring Apps では既定の猶予期間が使用されます。 既定値は 90です。

正常性プローブのプロパティ

次の表では、正常性プローブを構成するために使用できるプロパティについて説明します。

プロパティ名 説明
initialDelaySeconds アプリ インスタンスの起動後、プローブが開始されるまでの秒数。 既定値は、最小値の 0 です。
periodSeconds プローブを実行する頻度 (秒単位)。 既定値は 10 です。 最小値は 1 です。
timeoutSeconds プローブがタイムアウトするまでの時間 (秒)。既定値は、最小値の 1 です。
failureThreshold 成功した後に失敗したと見なされるプローブの連続する失敗の最小数。 既定値は 3 です。 最小値は 1 です。
successThreshold プローブが失敗した後、成功と見なされるために必要な最小連続成功数。 既定値は 1 です。 値は、liveness と startup の場合は 1 でなければなりません。 最小値は 1 です。

プローブ アクションのプロパティ

プローブを使用してアプリ インスタンスを確認する方法は 3 つあります。 各プローブでは、次のプローブ アクションの 1 つを定義する必要があります。

  • HTTPGetAction

    指定したパスのアプリ インスタンスに対して HTTP GET 要求を実行します。 応答の状態コードが 200 以上 400 未満の場合、診断は成功と見なされます。

    プロパティ名 説明
    scheme ホストへの接続に使用するスキーム。 既定値は HTTP です。
    path アプリ インスタンスの HTTP サーバーでアクセスするためのパス (例: /healthz)。
  • ExecAction

    アプリ インスタンス内で指定したコマンドを実行します。 コマンドが状態コード 0 で終了した場合、診断は成功と見なされます。

    プロパティ名 説明
    command アプリ インスタンス内で実行するコマンド。 コマンドの作業ディレクトリは、アプリ インスタンスのファイル システムのルート ディレクトリ (/) です。 コマンドは、シェル内ではなく、exec を使用して実行されるため、シェル命令は機能しません。 シェルを使用するには、そのシェルを明示的に呼び出します。 終了ステータス 0 はライブおよび正常と見なされ、0 以外は異常として扱われます。
  • TCPSocketAction

    アプリ インスタンスに対して TCP チェックを実行します。

    TCPSocketAction アクションで使用可能なプロパティはありません。

アプリケーションのカスタマイズ

Azure portal を使用してアプリケーションをカスタマイズするには、次の手順に従います。

  1. [設定]で、[アプリ] を選択して、一覧からアプリケーションを選択します。

    Screenshot of Azure portal showing the Apps page.

  2. 左側のナビゲーション ウィンドウで [構成] を選択し、[正常性プローブ] を選択して、正常性プローブのプロパティを指定します。

    Screenshot of the Azure portal Configuration page showing the Health probes tab.

  3. 終了猶予期間を設定するには、[全般設定] を選択し、[終了猶予期間] ボックスに値を指定します。

    Screenshot of the Azure portal Configuration page showing the General settings tab.

ベスト プラクティス

Azure Spring Apps に正常性プローブを追加するときは、以下のベスト プラクティスを使用します。

  • liveness probe と readiness probe を一緒に使用します。 Azure Spring Apps ではサービス検出のための 2 つの方法が同時に提供されます。 readiness probe が失敗すると、アプリ インスタンスは Kubernetes Service Discovery からのみ削除されます。 適切に構成された liveness probe は、Eureka サービス検出から発行されたアプリ インスタンスを削除して、予期しないケースを回避できます。 サービス検出について詳しくは、「Spring Boot アプリケーションを検出して登録する」をご覧ください。 Enterprise プランでのサービス検出の詳細については、「Tanzu サービス レジストリの使用」を参照してください

  • アプリ インスタンスが起動するとき、最初のチェックは initialDelaySeconds で指定された遅延の後に行われます。 その後のチェックは、periodSeconds で指定された期間の長さに従って定期的に行われます。 failureThreshold で指定された回数だけアプリが要求に対する応答に失敗すると、アプリ インスタンスは再起動されます。 アプリケーションが十分に速く起動できるようにするか、これらのパラメーターを更新して、合計タイムアウト initialDelaySeconds + periodSeconds * failureThreshold がアプリケーションの起動時間より長くなるようにしてください。

  • Spring Boot アプリケーションの場合、Spring Boot には正常性グループのサポートが付属しており、開発者は正常性インジケーターのサブセットを選び、関連付けられた 1 つの正常性状態にグループ化できます。 詳しくは、Spring ブログの「Spring Boot での liveness probe と readiness probe」をご覧ください。

    次の例は、Spring Boot を使用した liveness probe を示しています。

    "probe": {
           "initialDelaySeconds": 30,
           "periodSeconds": 10,
           "timeoutSeconds": 1,
           "failureThreshold": 30,
           "successThreshold": 1,
           "probeAction": {
               "type": "HTTPGetAction",
               "scheme": "HTTP",
               "path": "/actuator/health/liveness"
           }
       }
    

    次の例は、Spring Boot を使用した readiness probe を示しています。

    "probe": {
           "initialDelaySeconds": 0,
           "periodSeconds": 10,
           "timeoutSeconds": 1,
           "failureThreshold": 3,
           "successThreshold": 1,
           "probeAction": {
               "type": "HTTPGetAction",
               "scheme": "HTTP",
               "path": "/actuator/health/readiness"
           }
       }
    

よく寄せられる質問

このセクションでは、Azure Spring Apps で正常性プローブを使用する際によく寄せられる質問に対する回答を示します。

  • カスタマイズされた正常性プローブを使ってアプリケーションを作成したら、400 という応答を受け取りました。 具体的な変更点

    このエラー メッセージでは、プロビジョニング エラーの原因となったプローブが示されます。 正常性プローブ規則が正しいことと、アプリケーションが実行状態になるのに十分なタイムアウト時間であることを確認してください。

  • 既存のアプリケーションに対する既定のプローブ設定はどのようなものですか?

    既定の設定の例を次に示します。

    "startupProbe": null,
    "livenessProbe": {
        "disableProbe": false,
        "failureThreshold": 3,
        "initialDelaySeconds": 300,
        "periodSeconds": 10,
        "probeAction": {
            "type": "TCPSocketAction"
        },
        "successThreshold": 1,
        "timeoutSeconds": 3
    },
    "readinessProbe": {
        "disableProbe": false,
        "failureThreshold": 3,
        "initialDelaySeconds": 0,
        "periodSeconds": 5,
        "probeAction": {
            "type": "TCPSocketAction"
        },
        "successThreshold": 1,
        "timeoutSeconds": 3
    }
    

次のステップ