Elastic Algorithm Service (EAS) は、Kubernetes のヘルスチェックメカニズムを利用したヘルスチェック機能を提供し、障害が発生したコンテナを自動的に検出して回復します。これにより、正常なインスタンスのみがトラフィックを受信し、異常なインスタンスにリソースが割り当てられるのを防ぎます。このトピックでは、ヘルスチェック機能の設定方法について説明します。
制限事項
ヘルスチェック機能は、ヘルスチェックロジックを含むカスタムイメージを使用してサービスをデプロイする場合にのみ利用できます。
仕組み
EAS のヘルスチェック機能は、Kubernetes のヘルスチェックメカニズムを使用します。プローブとヘルスチェックメソッドを使用して、サービスのヘルス状態と可用性をモニターします。これには、以下のコンポーネントが含まれます。
サポートされているプローブタイプ:
プローブタイプ
説明
Liveness プローブ
コンテナが実行中かどうかを判断します。liveness プローブが失敗した場合、kubelet はコンテナを強制終了し、設定された再起動ポリシーを適用します。コンテナに liveness プローブがない場合、kubelet はプローブが常に
Successを返し、コンテナが正常であると見なします。Readiness プローブ
コンテナがリクエストを処理する準備ができているかどうかを判断します。準備ができた Pod のみがトラフィックを受信できます。サービスとそのエンドポイントの間の関連付けは、Pod の準備状態に依存します。
Pod の準備ができていない場合、その IP アドレスは関連するサービスのエンドポイントリストから削除されます。
Pod の準備が整うと、その IP アドレスはエンドポイントリストに再度追加されます。
Startup プローブ
コンテナのアプリケーションがいつ起動したかを判断します。これにより、コンテナが完全に初期化されるまで liveness プローブと readiness プローブのチェックが遅延され、起動が遅いコンテナが準備完了前にシステムによって終了されるのを防ぎます。
サポートされているヘルスチェックメソッド:
ヘルスチェックメソッド
説明
http_getHTTP GET リクエストを送信して、サービスのヘルス状態をチェックします。レスポンスのステータスコードによって、チェックが成功したかどうかが決まります。
tcp_socketTCP 接続を試みて、サービスのヘルス状態をチェックします。
execコンテナ内で指定されたコマンドを実行します。コマンドが終了コード 0 で終了した場合、チェックは成功と見なされます。
カスタムイメージの準備
Web フレームワークを使用して、予測ロジックをカプセル化できます。次の例では、Flask フレームワークと app.py ファイルを使用しています。
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__':
"""
注意:ホストは '0.0.0.0' に設定する必要があります。そうしないと、サービスデプロイ中にヘルスチェックが失敗します。
ポートは、サービスの JSON デプロイ設定ファイルで指定されたポートと一致する必要があります。
"""
app.run(host='0.0.0.0', port=8000)簡単な Dockerfile を作成して、予測コードをコピーし、必要なパッケージをインストールできます。以下は Dockerfile の例です。
# この例では Python を使用します。
FROM registry.cn-shanghai.aliyuncs.com/eas/bashbase-amd64:0.0.1
COPY ./process_code /eas
RUN /xxx/pip install required_packages
CMD ["/xxx/python", "/eas/xxx/app.py"] カスタムイメージのビルド方法の詳細については、「Container Registry Enterprise Edition インスタンスでのイメージのビルド」をご参照ください。カスタムイメージのビルドに関する詳細については、「カスタムイメージ」をご参照ください。または、コードを NAS ファイルシステムまたは Git リポジトリに保存し、デプロイ時にストレージマウントを介してサービスインスタンスにアタッチすることもできます。詳細については、「ストレージマウント」をご参照ください。このトピックでは、最初の方法を使用してサービスデプロイ中にヘルスチェック機能を設定する方法について説明します。
ヘルスチェックの設定
カスタムデプロイ
PAI コンソールにログインします。ページ上部でリージョンを選択し、目的のワークスペースを選択して Elastic Algorithm Service (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。ポート番号も入力する必要があります。これは、イメージが起動後にリッスンするローカル HTTP ポートです (例:8000)。
重要EAS エンジンは固定ポート 8080 と 9090 をリッスンします。コンテナポートは 8080 または 9090 であってはなりません。
このポートは、実行コマンドで参照される xxx.py ファイルで指定されたポートと一致する必要があります。
Health Check
Health Check スイッチをオンにし、パラメーターを設定してから OK をクリックします。パラメーターの詳細については、「ヘルスチェックのパラメーター」の表をご参照ください。
説明最大 3 つのヘルスチェックを追加でき、それぞれに一意のプローブタイプを設定できます。
パラメーターを設定した後、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 プローブを使用しています。readiness プローブには | http_get | HTTP GET メソッドを使用して指定されたポートをチェックします。以下のパラメーターがサポートされています。
以下の 2 つのヘルスチェックメソッドもサポートされています。
|
initial_delay_seconds | コンテナが起動してから最初のヘルスチェックが実行されるまでの遅延時間 (秒)。デフォルト:0。 | |
period_seconds | ヘルスチェックの間隔 (秒)。デフォルト:10。間隔が短いと Pod のオーバーヘッドが増加する可能性があり、間隔が長いと障害の検出が遅れる可能性があります。 | |
timeout_seconds | ヘルスチェックがタイムアウトするまでの秒数。デフォルト:1。タイムアウトは失敗と見なされます。 | |
failure_threshold | 成功後にコンテナを失敗とマークするために必要な連続失敗回数。readiness プローブの場合はデフォルトで 3、liveness および startup プローブの場合は 1 です。 | |
success_threshold | 失敗後にコンテナを成功とマークするために必要な連続成功回数。デフォルト:1。 | |