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