EAS提供了健全狀態檢查功能,該功能採用Kubernetes的健全狀態檢查機制,可以自動檢測並恢複失敗的容器,確保只有健康的執行個體接收流量並避免向不健康的執行個體分配資源。本文為您介紹如何配置健全狀態檢查功能。
使用限制
僅當您建立了包含健全狀態檢查邏輯的自訂鏡像,並使用該鏡像部署服務時,才能使用健全狀態檢查功能。
原理介紹
EAS的健全狀態檢查功能採用Kubernetes的健全狀態檢查機制,通過探針技術和健全狀態檢查方法來檢測和管理服務的健康情況和可用性。其中:
支援的探針類型:
探針類型
說明
存活探針(Liveness Probes)
用於判斷容器是否存活,如果存活探針探測到容器不健康,kubelet將kill掉該容器,並根據容器的重啟策略做相應的處理。如果一個容器不包含存活探針,那麼kubelet認為該容器的存活探針返回的值永遠是Success,即容器存活。
就緒探針(Readiness Probes)
用於判斷Container Service是否可用,達到Ready狀態的Pod才可以接收請求。Service與Endpoint的關聯關係也根據Pod的Ready狀態設定:
當Pod的Ready狀態為False時,K8s將Pod IP從Service關聯的後端Endpoint列表中隔離。
等待Pod的Ready狀態變更為True時,K8s將Pod IP重新加入到Service關聯的Endpoint列表中。
啟動探針(Startup Probes)
用於判斷容器何時開始啟動,可以控制容器在啟動成功後再進行存活性和就緒性檢查。可以使用該探針對慢啟動容器進行存活性檢測,避免它們在啟動運行之前被kill掉。
支援的健康檢測方法:
健康檢測方法
說明
http_get
通過HTTP GET請求檢查服務健康和存活狀況,並依據響應狀態代碼確定成功與否。
tcp_socket
通過嘗試開啟一個TCP串連來檢查服務健康和存活狀況。
exec
在容器內執行指定命令,並依據命令的退出碼確定探測是否成功。
準備自訂鏡像
您可以選用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():
"""
根據實際需求解析request body
"""
data = request.get_data().decode('utf-8')
body = json.loads(data)
res = process(body)
"""
根據實際需求設定response
"""
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設定檔中指定的port保持一致。
"""
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 需要的包
CMD ["/xxx/python", "/eas/xxx/app.py"]
構建自訂鏡像的具體操作步驟,請參見使用企業版執行個體構建鏡像。您需要參考服務部署:自訂鏡像,瞭解更多關於構建自訂鏡像時需要注意的細節。另一種方式是將代碼儲存在NAS或Git倉庫中,部署時通過儲存掛載的方式將其接入服務執行個體,詳情請參見進階配置:服務儲存掛載。本文使用第一種方式為您介紹如何在部署服務時配置健全狀態檢查功能。
部署服務時配置健全狀態檢查功能
通過控制台配置健全狀態檢查功能
進入模型線上服務(EAS)頁面。
登入PAI控制台。
在左側導覽列單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應的工作空間。
在工作空間頁面的左側導覽列選擇 ,進入模型線上服務(EAS)頁面。
單擊部署服務,然後在自訂模型部署地區,單擊自訂部署。
在建立服務頁面,配置以下關鍵參數,其他參數配置說明,請參見服務部署:控制台。
在模型服務資訊地區,配置以下參數。
參數
描述
鏡像選擇
選擇鏡像地址,並在文字框中輸入已準備好的自訂鏡像地址,例如
registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz
。運行命令
鏡像的入口命令,只支援單一命令形式,不支援複雜指令碼,需要與Dockerfile中的命令保持一致。例如
/data/eas/ENV/bin/python /data/eas/app.py
。同時您需要輸入連接埠號碼,即鏡像啟動後監聽的本地HTTP連接埠,例如8000。
重要由於EAS引擎監聽固定的8080/9090連接埠,因此容器連接埠需要避開8080/9090連接埠。
該連接埠一定要和運行命令中的xxx.py檔案配置的連接埠保持一致。
在服務功能配置地區,單擊健全狀態檢查,並開啟健全狀態檢查開關。
在健全狀態檢查配置面板,單擊添加按鈕添加健全狀態檢查項,並配置以下參數。
說明允許添加最多三個健全狀態檢查項,每個健全狀態檢查項可配置一種探針類型,且不能重複。
參數
描述
探針類型
支援使用以下三種探針類型:
存活探針:用於檢測容器是否處於正常運行狀態。
就緒探針:確保容器已經完成初始化並準備好處理請求。
啟動探針:專為需要較長時間初始化的應用設計,避免因容器啟動過程緩慢而被錯誤地標記為失敗。
關於每種探針的原理說明,請參見原理介紹。
健全狀態檢查方法
支援以下三種健全狀態檢查方法:
http_get:通過容器的IP地址、連接埠號碼以及路徑調用HTTP Get方法,如果響應的狀態代碼大於等於200且小於400,則容器健康。
tcp_socket:通過容器的IP地址和連接埠號碼執行TCP檢查,如果能夠建立TCP串連,則容器健康。
exec(自訂健全狀態檢查):在容器中執行指定命令,如果執行成功後退出碼為0,則健全狀態檢查成功。
調用路徑
僅健全狀態檢查方法選擇http_get時,支援配置該參數。
檢查的HTTP Server訪問地址,首碼為
http://localhost
,尾碼自訂,預設為/
。連接埠號碼
僅健全狀態檢查方法選擇http_get或tcp_socket時,支援配置該參數。
檢查連接埠號碼,例如8000。
運行命令
僅健全狀態檢查方法選擇exec時,支援配置該參數。
輸入運行命令。前端根據您輸入的運行命令,自動將其轉化為相應的格式,並輸入到部署JSON中。
初始化檢查延時時間長度
健全狀態檢查延遲時間長度,容器啟動後多久開始進行第一次健全狀態檢查工作,預設為0秒。
輪詢檢查時間間隔
健全狀態檢查頻率,預設為10秒。頻率過高會對Pod帶來較大的額外開銷,頻率過低則無法及時反映容器產生的錯誤。
檢查逾時時間長度
健全狀態檢查的逾時時間長度,預設1秒。逾時則健全狀態檢查將被認定為失敗。
檢測成功認定次數
處於成功狀態時,健全狀態檢查連續失敗幾次,可被認定為失敗,就緒探針預設為3次,存活探針和啟動探針預設為1次。
檢測失敗認定次數
處於失敗狀態時,健全狀態檢查連續成功幾次,可被認定為成功,預設1次。
單擊確定。
參數配置完成後,單擊部署。
通過本地用戶端配置健全狀態檢查功能
下載並認證用戶端,以Windows 64版本為例。
在用戶端檔案所在目錄建立JSON格式的檔案,命名為
service.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 } ] }
其中關鍵配置說明如下。其他參數配置說明,請參見服務模型所有相關參數說明。
參數
描述
image
用於部署模型服務的自訂鏡像地址。
由於EAS不開放公網存取權限,因此您需要使用VPC內網Registry地址進行部署。例如
registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz
。env
name
鏡像執行時的環境變數名稱。
value
鏡像執行時的環境變數取值。
comand
鏡像的入口命令,只支援單一命令形式,不支援複雜指令碼,例如
/data/eas/ENV/bin/python /data/eas/app.py
。port
鏡像中進程監聽的網路連接埠號碼。例如8000。
重要該連接埠一定要和command中的xxx.py檔案配置的連接埠保持一致。
liveness_check
說明表示健全狀態檢查配置使用的探針類型為存活探針。您還可以將其配置為readiness_check(就緒探針)或startup_check(啟動探針)。
http_get
表示使用HTTP Get檢查方法請求訪問8000連接埠。其中:
http_get.path:檢查的HTTP Server訪問地址,首碼為
http://localhost
,尾碼自訂,預設為/
。http_get.port:表示檢查的HTTP Server連接埠號碼。
另外還支援使用以下兩種健全狀態檢查方法:
tcp_socket:通過容器的IP地址和連接埠號碼執行TCP檢查,如果能夠建立TCP串連,則容器健康。配置方法如下:
"tcp_socket":{ "port":8000 }
exec:在容器中執行指定命令,如果執行成功後退出碼為0,則健全狀態檢查成功。配置方法如下:
"exec":{ "command":[ "your_script", "with_args" ] }
initial_delay_seconds
健全狀態檢查延遲時間長度,容器啟動後多久開始進行第一次健全狀態檢查工作,預設為0秒。
period_seconds
健全狀態檢查頻率,預設為10秒。頻率過高會對Pod帶來較大的額外開銷,頻率過低則無法及時反映容器產生的錯誤。
timeout_seconds
健全狀態檢查的逾時時間長度,預設1秒。逾時則健全狀態檢查將被認定為失敗。
success_threshold
處於成功狀態時,健全狀態檢查連續失敗幾次,可被認定為失敗,就緒探針預設為3次,存活探針和啟動探針預設為1次。
failure_threshold
處於失敗狀態時,健全狀態檢查連續成功幾次,可被認定為成功,預設1次。
開啟終端工具,在JSON檔案所在目錄,使用以下命令建立服務。更多操作說明,請參見命令使用說明。
eascmdwin64.exe create <service.json>
其中:
<service.json>
需要替換為您建立的JSON檔案名稱。