IBM Cloud Docs
アプリの Liveness Probe と Readiness Probe での作業

アプリの Liveness Probe と Readiness Probe での作業

Code Engineで、liveness プローブと readiness プローブを使用して、アプリケーションの頑強性を向上させるためのヘルス・チェックを設定できます。 アプリケーションの作成時または更新時にこれらのプローブを使用するように Code Engine を構成できます。

Liveness プローブと Readiness プローブとは何ですか?

Liveness Probe と Readiness Probe を使用して、アプリが アライブ であり、要求に応答してトラフィックを処理する 準備ができている かどうかを確認します。

Liveness Probe

Liveness プローブは、アプリケーションが操作可能 (またはアライブ) であるかどうか、および着信要求に応答できるかどうかを定期的に検査します。 Liveness プローブを使用して、アプリが着信要求に対して応答しているかどうか、またはシステムがインスタンスを停止して新規インスタンスを開始する必要がある状況にアプリがあるかどうかを確認できます。 Liveness Probe が失敗した場合、アプリ・インスタンスは再始動されます。 活性プローブが成功すると、アプリ・インスタンスは作動可能になります。 例えば、単一スレッドの Node.js アプリで、コードがエンドレス・ループにはまり、アプリが要求に応答できなくなる場合があります。 Liveness プローブは、このケースを検出し、インスタンスを再始動できます。 デフォルトでは、liveness プローブは自動的に設定されません。 Liveness プローブは、 Liveness プローブのプロパティー を使用して構成できます。

Readiness Probe

Readiness プローブは、アプリケーションがトラフィックを受信する準備ができているかどうかを定期的に検査します。 Readiness プローブを使用すると、アプリ・インスタンスをロード・バランシングから一時的に削除できます。 readiness プローブが失敗した場合、readiness プローブが再度成功するまで、アプリ・インスタンスはそれ以上要求を受信できません。 例えば、liveness プローブが成功を返した場合など、アプリケーションが要求を処理できる場合を考えてみます。 ただし、意図したユーザー・ワークロードに対応できるようになる前に、アプリに他の必須条件が設定されている場合があります。 アプリがユーザー要求に応答するには、その前にバックエンドへの有効な接続が確立されている必要がある場合があります。 アプリケーションの状態はリカバリー可能と見なされるため、このシナリオでは異なるタイプの検査が必要です。 アプリ・リビジョン・インスタンスがしばらくの間アクティブ状態であるが、データベース接続が予期せずに終了したとします。 アプリ・インスタンスはデータベースに再接続する必要があります。 アプリ・インスタンスは、作動可能プローブ要求に失敗したため、 not ready 状態になっています。 結果として、readiness プローブは、そのアプリ・インスタンスへの要求の送信を一時的に停止するようにロード・バランサーに指示します。 データベースへの接続がリカバリーされると、readiness プローブは成功し、トラフィックはアプリ・インスタンスへのルーティングを再開します。

デフォルトでは、すべてのアプリに tcp タイプの readiness プローブが定義されています。このプローブは、アプリケーションに対して構成されている listen ポートが開いていることを検査します。 この作動可能検査が正常に完了すると、アプリは作動可能状況になります。 Readiness Probe プロパティー を使用して Readiness Probe をさらにカスタマイズできます。

Liveness プローブと Readiness プローブは、互いに独立して動作します。

Liveness Probe と Readiness Probe の両方を構成した場合、Liveness Probe は、アプリ・インスタンスの開始時に Readiness Probe からの最初の正常な応答を待機しません。 Liveness プローブと Readiness プローブの両方を構成し、Readiness プローブ要求が送信される前に Liveness プローブからの正常な応答を待機したい場合は、initial delay プロパティーを使用して、最初の Liveness プローブ要求を指定された秒数だけ遅延させることができます。

アプリで liveness プローブと readiness プローブを使用する理由

Code Engine アプリケーションにプローブを実装すると、liveness プローブと readiness プローブにより、実行中のアプリケーションをよりきめ細かく制御して、アプリケーションの alive 条件および ready 条件を検査することができます。

例えば、アプリの起動が遅い場合があります。 アプリのプロセスは、アプリの準備が完全に整う前に開始される可能性があり、特にアプリが多数のインスタンスにまたがってスケールアップする場合、レスポンスに影響を与える可能性がある。 liveness プローブと readiness プローブをヘルス・チェックとして設定することにより、 Code Engine に、アプリが実行中で要求を受信してトラフィックを処理する準備ができているかどうかを認識させることができます。 これらのプローブを設定することで、アプリのローリング・アップデートを実行する際のダウンタイムを防ぐこともできる。

Liveness プローブと Readiness プローブは、アプリケーション・インスタンスに適用されます。 アプリケーションの各インスタンスは、システムによってプローブされます。

Liveness プローブと Readiness プローブの目的は異なります。

  • Liveness Probe を使用すると、アプリ・インスタンスの再始動をトリガーできます。これにより、基本的には現在のアプリ・インスタンスが停止され、新しいインスタンスが開始されます。 このプローブは、アプリケーションが内部障害からリカバリーできず、アプリケーションを再始動する必要がある場合に使用します。

  • 対照的に、 readiness プローブ が失敗すると、このプローブにより、 Code Engine は、インスタンスがリカバリーするまでアプリ・インスタンスへの要求のルーティングを一時的に停止します。 Readiness プローブは、インスタンスを再始動せずにリカバリー可能な問題がアプリケーションで発生した場合に役立ちます。 リカバリー時間中は、アプリはユーザー要求を処理できません。 readiness プローブが成功すると、インスタンスはユーザー要求を再度処理できます。

コードでの readiness プローブまたは liveness プローブの実装

Code Engineで Readiness プローブまたは Liveness プローブを構成する前に、まず Code Engine アプリケーションで参照されるソース・コード・イメージ内にプローブを実装する必要があります。

最初にコードにプローブを実装しないと、 Code Engine で構成したプローブは常に失敗し、アプリケーションが失敗する原因になります。

コードに readiness プローブまたは liveness プローブを実装する際には、以下の点を考慮してください。

  • readiness プローブまたは liveness プローブに使用する接続のタイプを決定します。 HTTP タイプまたは TCP タイプのプローブを指定できます。

    • HTTP タイプのプローブは、HTTP GET メソッドを使用してプローブ状況を返すエンドポイントを提供します。 このタイプのプローブは、プローブがタイムアウト限度内で応答し、HTTP 戻りコードが 200 以上 400 未満の場合に成功したと見なされます。 この範囲外の値は、プローブの失敗と見なされます。
    • TCP タイプのプローブは、ポートが開いていることのみを検査します。 ポートが開いている場合、このタイプのプローブは成功したと見なされます。 ポートが開いていない場合、このプローブ・タイプは失敗したと見なされます。
  • ソース・コードがプローブに応答するポートを決定します。

    • 一般に、アプリのソース・コードが 1 つのポートのみを開く場合、readiness プローブまたは liveness プローブのポート構成は、通常、 Code Engine アプリケーションの構成済みリスニング・ポートと同じ値です。 Code Engine で readiness プローブまたは liveness プローブのポートを 0 に設定した場合、プローブのポートはデフォルトでアプリケーションの構成済みリスニング・ポートになります。
    • アプリのソース・コードが複数のポートで同時に listen する場合は、ソース・コード内で別のポートを使用して、readiness プローブ要求または liveness プローブ要求に応答できます。 この場合、 Code Engineで readiness プローブまたは liveness プローブの構成を構成するときに、プローブの正しいポートを指定する必要があります。
  • プローブは、要求を処理するためにアプリ・インスタンスが使用可能かどうかを判別するため、コードがプローブ要求に迅速に応答することを確認してください。

  • コードが SIGTERM シグナルを安全に処理することを確認してください。 liveness プローブが失敗すると、SIGTERM シグナルが送信されます。応答しないアプリ・インスタンスを回避するために、コードでこのシグナルを処理する必要があります。 アプリ・インスタンスが予期したとおりにスケールダウンしないのはなぜですか? を参照してください。

Code Engine での liveness プローブと readiness プローブの構成

アプリケーションのヘルス・チェックとして liveness プローブと readiness プローブを使用できます。 デフォルトで設定される readiness プローブをカスタマイズできます。また、オプションで Liveness プローブを構成できます。 Liveness プローブと Readiness プローブは、インスタンスの実行中に、構成された間隔でアプリケーション・インスタンスに送信されます。

Liveness プローブを構成する前に、または Code Engine アプリの Readiness プローブをカスタマイズする前に、まずコード内にプローブを実装する必要があります。そうしないと、アプリケーションが失敗する可能性があります。

Liveness Probe と Readiness Probe のプロパティー

以下の表に、アプリの liveness プローブと readiness プローブで使用されるプロパティーを要約します。

プローブ・プロパティ
プロパティー (Property) 説明
タイプ プローブが実行するチェックのタイプ。 有効な値は tcp および http です。 このプロパティーは必須です。
パス アプリケーションへの HTTP 要求のパスです。 このプロパティーは、タイプが http の場合にのみ必要です。
ポート プローブの接続先のポート。 0 に設定すると、プローブのポートはデフォルトで、アプリケーションの構成済みリスニング・ポートになります。
間隔 プローブ要求間の時間(秒)。
初期遅延 最初の有効性プローブ検査が実行されるまでの待機時間(秒)。
タイムアウト プローブがタイムアウトして失敗したとみなされるまでに、アプリからの応答を待つ時間(秒)。
障害しきい値 プローブが失敗したと見なされる、連続して失敗した検査の数。

コンソールからのプローブの構成

Code Engine アプリケーションによって参照されるコード・イメージにプローブを実装した後、コンソールから liveness プローブと readiness プローブを構成して、アプリケーションのヘルス・チェックを実行できます。

開始前に

  1. Code EngineからProjectsページから、プロジェクトに移動します。
  2. アプリケーションを作成します。 例えば、icr.io/codeengine/helloworldイメージを使用するmyappというアプリケーションを作成します。 このイメージは、 Samples for IBM Cloud Code Engine GitHub repoから入手できます。 アプリケーションの作成時に、liveness プローブと readiness プローブを構成できます。 あるいは、アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブからアプリケーションを更新するときに、活性プローブおよび作動可能プローブの設定を表示および更新することができます。
  3. アプリケーションの構成済みプローブとそのプロパティーを表示するには、アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブに移動します。
  4. 「イメージ開始オプション」 タブで、Liveness プローブと Readiness プローブの設定を編集します。 プローブを変更すると、新しいアプリケーション・リビジョンが作成されます。 例えば、デフォルトの Readiness Probe を編集して接続タイプを TCP から HTTP に変更し、Readiness Probe のパスを /readinessprobe に設定します。 プローブ・プロパティーについて詳しくは、 プロパティー を参照してください。 完了したら Done をクリックする。
  5. 「デプロイ」 をクリックして変更を保存し、プローブ設定が構成されたアプリ・リビジョンをデプロイします。

「インスタンス」 タブのビューを使用して、アプリケーション・インスタンスを確認します。

CLI を使用したプローブの構成

Code Engine CLI で liveness プローブと readiness プローブを操作できます。 ibmcloud ce app create または ibmcloud ce app update コマンドで --probe-live または --probe-ready オプションを指定して、必要なプローブを構成します。

readiness プローブまたは liveness プローブで構成できるプロパティーについて詳しくは、 Liveness プローブと readiness プローブのプロパティー を参照してください。

開始前に

  1. ibmcloud ce application create コマンドを使用してアプリケーションを作成します。 以下の例では、アプリケーションの名前としてmyappを使用し、参照するイメージとしてicr.io/codeengine/helloworldを指定します。

    ibmcloud ce application create --name myapp --image icr.io/codeengine/helloworld
    
  2. application get コマンドを実行して、アプリケーションに関する詳細を表示します。 Readiness プローブはデフォルトで構成されていることに注意してください。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Readiness Probe:    
        Type:              tcpsocket  
        Port:              0  
    [...]
    
  3. ibmcloud ce application update コマンドを使用して myapp アプリケーションを更新し、liveness プローブを構成します。 例えば、接続でポート 8080 を使用するようにタイプ HTTP の Liveness プローブを構成するには、 --probe-live オプションを指定します。参照されるコード・イメージのホーム・ディレクトリーへのパス * * は / です。

    application create または application update コマンドで readiness プローブまたは liveness プローブのプロパティーを構成する場合は、設定する各プロパティーの前にオプション --probe-live または --probe-ready を指定する必要があります。

    ibmcloud ce application update --name myapp --probe-live type=http --probe-live path=/ --probe-live port=8080
    
  4. application get コマンドを実行して、更新された myapp アプリケーションに関する詳細を表示します。 詳細には、構成済みの活性プローブに関する情報が含まれます。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Liveness Probe:     
        Type:              httpget  
        Path:              /  
        Port:              8080  
        Interval:          10  
        Timeout:           1  
        FailureThreshold:  1  
    
    Readiness Probe:    
        Type:              tcpsocket  
        Port:              0  
    [...]
    

myapp アプリケーションに対して liveness プローブと readiness プローブの両方を構成したので、システムは常に両方のプローブをその構成に従って実行します。

Code Engine でのプローブ設定の表示

コンソールおよび CLI を使用して、 Code Engine で設定された liveness プローブと readiness プローブに関する情報を表示できます。

コンソールからのプローブ設定の表示

構成済みの liveness プローブと readiness プローブの詳細をコンソールで表示するには、アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブに移動します。

CLI でのプローブ設定の表示

構成済みの liveness プローブと readiness プローブに関する情報など、CLI を使用してアプリケーションに関する詳細を表示するには、 application get コマンドを実行します。

ibmcloud ce application get --name myapp

出力例

[...]
OK

Name:               myapp
ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:       myproject
[...]
Liveness Probe:     
    Type:              httpget  
    Path:              /  
    Port:              8080  
    Interval:          10  
    Timeout:           1  
    FailureThreshold:  1  

Readiness Probe:    
    Type:              tcpsocket  
    Port:              0  
[...]

プローブの更新

アプリケーションの活性プローブおよび作動可能プローブのプロパティーを変更できます。 プローブのプロパティーを更新すると、新しいアプリケーション・リビジョンが作成されます。 liveness プローブと readiness プローブは、インスタンスの実行中に、構成された間隔でアプリケーション・インスタンスに送信されます。

コンソールからのプローブ更新

アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブから、コンソールで readiness プローブまたは liveness プローブを変更または編集できます。

  1. 申し込みページにアクセスする。 アプリケーション・ページにナビゲートする方法の 1 つは、以下のとおりです。
    • Code Engine プロジェクト・ページを見つけます。
    • プロジェクト名をクリックすると、概要ページが開きます。
    • **「アプリケーション」**をクリックして、アプリケーションのリストを開きます。 アプリケーションの名前をクリックして、そのアプリケーション・ページを開きます。
  2. アプリケーション・ページから、アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブをクリックします。
  3. 「イメージ開始オプション」 タブで、Liveness プローブと Readiness プローブの設定を編集します。 プローブを変更すると、新しいアプリケーション・リビジョンが作成されます。 「編集」 をクリックして、変更する readiness プローブまたは liveness プローブを変更します。
  4. 「Readiness Probe」 ページまたは 「Liveness Probe」 ページで、プローブの プロパティー を更新します。 完了したら Done をクリックする。
  5. 「デプロイ」 をクリックして変更を保存し、プローブ設定が構成されたアプリ・リビジョンをデプロイします。

「インスタンス」 タブのビューを使用して、アプリケーション・インスタンスを確認します。

CLIによるプローブの更新

接続タイプが HTTP で障害しきい値が 3 で、プローブ要求間の間隔が 5 秒になるように、 myapp の活性プローブを更新するとします。

  1. ibmcloud ce application update コマンドを使用して myapp アプリケーションを更新し、接続タイプが HTTP、障害しきい値が 3、プローブ要求間の間隔が 5 秒になるように活性プローブを更新します。

    application create または application update コマンドで readiness プローブまたは liveness プローブのプロパティーを構成する場合は、設定する各プロパティーの前にオプション --probe-live または --probe-ready を指定する必要があります。

    ibmcloud ce application update --name myapp --probe-live type=http --probe-live interval=5 --probe-live failure-threshold=3
    
  2. application get コマンドを実行して、更新された myapp アプリケーションに関する詳細を表示します。 詳細には、活性プローブの現在の構成に関する情報が含まれます。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Liveness Probe:     
        Type:              httpget  
        Path:              /  
        Port:              8080  
        Interval:          5  
        Timeout:           1  
        FailureThreshold:  3  
    
    Readiness Probe:    
        Type:              tcpsocket  
        Port:              0  
    [...]
    
  3. ibmcloud ce application update コマンドを使用して myapp アプリケーションを更新し、接続タイプが HTTP、ポートが 8080、障害しきい値が 3、プローブ要求間の間隔が 5 秒になるように作動可能プローブを更新します。

    application create または application update コマンドで readiness プローブまたは liveness プローブのプロパティーを構成する場合は、設定する各プロパティーの前にオプション --probe-live または --probe-ready を指定する必要があります。

    ibmcloud ce application update --name myapp --probe-ready type=http --probe-ready port=8080 --probe-ready interval=5 --probe-ready failure-threshold=3
    
  4. application get コマンドを実行して、更新された myapp アプリケーションに関する詳細を表示します。 詳細には、readiness プローブの更新された設定に関する情報が含まれます。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Liveness Probe:     
        Type:              httpget  
        Path:              /  
        Port:              8080  
        Interval:          5  
        Timeout:           1  
        FailureThreshold:  3  
    
    Readiness Probe:    
        Type:              httpget  
        Path:              /  
        Port:              8080  
        Interval:          5  
        Timeout:           1  
        FailureThreshold:  3  
    [...]
    

プローブの削除

Liveness Probe を削除 (削除) できます。 ただし、readiness プローブは常にデフォルトで設定されるため、編集して readiness プローブのプロパティーを更新することしかできません。

コンソールからのプローブの削除

コンソールで、アプリケーション・ページの 「構成」 > 「イメージ開始オプション」 タブから Liveness Probe を削除できます。

  1. 申し込みページにアクセスする。 アプリケーション・ページにナビゲートする方法の 1 つは、以下のとおりです。
    • Code Engine プロジェクト・ページを見つけます。
    • プロジェクト名をクリックすると、概要ページが開きます。
    • **「アプリケーション」**をクリックして、アプリケーションのリストを開きます。 アプリケーションの名前をクリックして、そのアプリケーション・ページを開きます。
  2. アプリケーション・ページで、 「構成」 タブをクリックしてから、アプリケーション・ページの 「イメージ開始オプション」 タブをクリックします。
  3. Liveness Probe を削除するには、新しいアプリケーション・リビジョンを作成する必要があります。
    1. Liveness プローブを削除するには、 「削除」 をクリックします。
    2. Deploy をクリックして変更を保存し、アプリのリビジョンをデプロイします。

Readiness プローブを削除することはできませんが、 更新 することはできます。

CLI を使用したプローブの削除

  1. liveness プローブを削除するには、 --probe-live-clear オプションを指定した ibmcloud ce application update コマンドを使用して myapp アプリケーションを更新します。

    ibmcloud ce application update --name myapp --probe-live-clear
    
  2. application get コマンドを実行して、更新された myapp アプリケーションに関する詳細を表示します。 活性プローブが削除されます。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Readiness Probe:    
        Type:              httpget  
        Path:              /  
        Port:              8080  
        Interval:          5  
        Timeout:           1  
        FailureThreshold:  3   
    [...]
    
  3. 作動可能プローブをデフォルト構成にリセットするには、 --probe-ready-reset オプションを指定した ibmcloud ce application update コマンドを使用して myapp アプリケーションを更新します。

    ibmcloud ce application update --name myapp --probe-ready-reset
    
  4. application get コマンドを実行して、更新された myapp アプリケーションに関する詳細を表示します。 readiness プローブはデフォルト構成にリセットされます。

    ibmcloud ce application get --name myapp
    

    出力例

    [...]
    OK
    
    Name:               myapp
    ID:                 abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:       myproject
    [...]
    Readiness Probe:    
        Type:              tcpsocket  
        Port:              0  
    [...]