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