EAS のヘルスチェックは Kubernetes のプローブメカニズムを使用して、正常でないコンテナを自動的に検出し回復し、正常なインスタンスのみがトラフィックを受信するようにします。
制限事項
ヘルスチェックは、ヘルスチェックロジックを含むカスタムイメージを使用してサービスをデプロイする場合にのみ利用できます。
仕組み
EAS のヘルスチェックは Kubernetes のプローブメカニズムを使用してサービスの正常性を検出し管理します。EAS では、以下のプローブタイプおよびヘルスチェック方法がサポートされています。
-
サポートされるプローブタイプ:
プローブタイプ
説明
Liveness プローブ
コンテナが実行中かどうかを判定します。プローブが正常でないコンテナを検出した場合、kubelet はそのコンテナを終了し、再起動ポリシーを適用します。liveness プローブが設定されていないコンテナについては、kubelet は常に Success とみなします。
Readiness プローブ
コンテナがリクエストを処理できる状態かどうかを判定します。Ready 状態の Pod のみがトラフィックを受信します。Service とその Endpoints の関連付けは、Pod の readiness 状態に基づいて管理されます。
-
Pod の Ready 状態が False の場合、Kubernetes は Service に関連付けられた Endpoint リストから Pod の IP アドレスを削除します。
-
Pod の Ready 状態が True に変化した場合、Kubernetes は Pod の IP アドレスを Endpoint リストに再度追加します。
Startup プローブ
コンテナの起動が完了したタイミングを判定します。起動に時間がかかるコンテナに対してこのプローブを使用することで、初期化が完了する前に liveness プローブや readiness プローブが実行され、コンテナが誤って早期に終了させられるのを防ぎます。
-
-
サポートされるヘルスチェック方法:
ヘルスチェック方法
説明
http_getHTTP GET リクエストを送信してサービスの正常性と可用性を確認します。応答の状態コードが 2xx または 3xx の範囲内の場合、チェックは成功とみなされます。
tcp_socketTCP 接続を開こうとして、サービスの正常性と可用性を確認します。
execコンテナ内で指定されたコマンドを実行します。チェック結果はコマンドの終了コードによって決定されます。
カスタムイメージの準備
予測ロジックを Web フレームワークでラップします。以下の例では Flask を使用しています。
import json
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/', methods = ['GET','POST'])
def process_handle_func():
"""
実際の要件に基づいてリクエストボディを解析します
"""
data = request.get_data().decode('utf-8')
body = json.loads(data)
res = process(body)
"""
実際の要件に基づいて応答を設定します
"""
response = make_response(res)
response.status_code = 200
return response
def process(data):
"""
ご利用の予測ロジック
"""
return 'result'
if __name__ == '__main__':
"""
注: host は 0.0.0.0 に設定する必要があります。設定しない場合、サービスデプロイ時にヘルスチェックが失敗します。
port は、デプロイするサービスの JSON 設定ファイルで指定されたポートと一致させる必要があります。
"""
app.run(host='0.0.0.0', port=8000)
予測コードをコピーし、必要なパッケージをインストールする Dockerfile を作成します。
# Python の例
FROM registry.cn-shanghai.aliyuncs.com/eas/bashbase-amd64:0.0.1
COPY ./process_code /eas
RUN /xxx/pip install 必要なパッケージ
CMD ["/xxx/python", "/eas/xxx/app.py"]
カスタムイメージのビルド手順については、「Container Registry Enterprise Edition インスタンスでのイメージのビルド」をご参照ください。「カスタムイメージを使用したモデルサービスのデプロイ」では、イメージビルドに関するガイドラインを紹介しています。また、NAS ファイルシステムまたは Git リポジトリにコードを保存し、デプロイ時にストレージをマウントすることも可能です(「ストレージマウント」をご参照ください)。本トピックでは、最初の方法を使用して「サービスデプロイ時のヘルスチェック設定」を説明します。
サービスデプロイ時のヘルスチェック設定
カスタムデプロイでのヘルスチェック設定
PAI コンソールにログインし、ページ上部で対象のリージョンを選択し、右側で対象のワークスペースを選択してから、Go to EAS をクリックします。
Inference Serviceタブで、Deploy Serviceをクリックします。Custom Model Deploymentセクションで、Custom Deploymentをクリックします。
-
Environment Informationセクションで、以下の主要パラメーターを設定します。その他のパラメーターについては、「カスタムデプロイ」をご参照ください。
パラメーター
説明
Image Configuration
Image Addressを選択し、テキストフィールドにご利用のカスタムイメージのアドレスを入力します(例:
registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz)。Command
コンテナのエントリポイントコマンドです。単一のコマンドのみがサポートされ、複雑なスクリプトは使用できません。このコマンドは Dockerfile で定義されているものと一致させる必要があります。例:
/data/eas/ENV/bin/python /data/eas/app.py。起動後にコンテナがリッスンするポート番号を入力します(例:8000)。
重要-
EAS エンジンは固定ポート 8080 および 9090 をリッスンします。ご利用のコンテナでこれらのポートを使用しないでください。
-
ポートは、実行コマンドで参照される xxx.py ファイルで設定されたポートと一致させる必要があります。
-
-
Featuresセクションで、Stability guaranteeパネルを展開し、Health Checkトグルをオンにして、以下で説明するパラメーターを設定し、OK をクリックします。
Deployをクリックします。
JSON デプロイでのヘルスチェック設定
service.json という名前の JSON ファイルを作成します。以下のサンプルファイルを参照してください。
{
"metadata": {
"name": "test",
"instance": 1,
"enable_webservice": true
},
"cloud": {
"computing": {
"instance_type": "ml.gu7i.c16m60.1-gu30"
}
},
"containers": [
{
"image":"registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
"env":[
{
"name":"VAR_NAME",
"value":"var_value"
}
],
"liveness_check":{
"http_get":{
"path":"/",
"port":8000
},
"initial_delay_seconds":3,
"period_seconds":3,
"timeout_seconds":1,
"success_threshold":2,
"failure_threshold":4
},
"command":"/data/eas/ENV/bin/python /data/eas/app1.py",
"port":8000
}
]
}
主要なパラメーターは以下の表で説明されています。その他のパラメーターについては、「JSON デプロイ」をご参照ください。
|
パラメーター |
説明 |
|
|
image |
モデルサービスのデプロイに使用するカスタムイメージのアドレスです。 EAS ではパブリックネットワークアクセスが許可されていません。VPC 内のレジストリアドレスを使用してください(例: |
|
|
env |
name |
ランタイム時にコンテナに渡される環境変数の名前です。 |
|
value |
環境変数の値です。 |
|
|
command |
コンテナのエントリポイントコマンドです。単一のコマンドのみがサポートされ、複雑なスクリプトは使用できません。例: |
|
|
port |
コンテナ内のプロセスがリッスンするネットワークポートです(例:8000)。 重要
ポートは、command フィールドで参照される xxx.py ファイルで設定されたポートと一致させる必要があります。 |
|
|
liveness_check 説明
ヘルスチェックプローブタイプとして liveness プローブを指定します。代わりに health_check(readiness プローブ)または startup_check(startup プローブ)を設定することも可能です。 |
http_get |
ポート 8000 に HTTP GET リクエストを送信します。サブパラメーターは以下のとおりです。
以下の 2 種類のヘルスチェック方法もサポートされています。
|
|
initial_delay_seconds |
コンテナ起動後、最初のヘルスチェックが実行されるまでの遅延時間です。デフォルトは 0 秒です。 |
|
|
period_seconds |
ヘルスチェックの実行頻度です。デフォルトは 10 秒です。頻度を高くすると Pod にオーバーヘッドが発生し、低くするとコンテナのエラー検出が遅れます。 |
|
|
timeout_seconds |
各ヘルスチェックのタイムアウト時間です。デフォルトは 1 秒です。この時間を超過したチェックは失敗とみなされます。 |
|
|
success_threshold |
以前は正常だったコンテナを異常とマークするために必要な、連続する失敗チェックの回数です。readiness プローブのデフォルトは 3、liveness プローブおよび startup プローブのデフォルトは 1 です。 |
|
|
failure_threshold |
以前は異常だったコンテナを正常とマークするために必要な、連続する成功チェックの回数です。デフォルトは 1 です。 |
|