EAS提供了健康检查功能,该功能采用Kubernetes的健康检查机制,可以自动检测并恢复失败的容器,确保只有健康的实例接收流量并避免向不健康的实例分配资源。本文为您介绍如何配置健康检查功能。
使用限制
仅当您创建了包含健康检查逻辑的自定义镜像,并使用该镜像部署服务时,才能使用健康检查功能。
原理介绍
EAS的健康检查功能采用Kubernetes的健康检查机制,通过探针技术和健康检查方法来检测和管理服务的健康状况和可用性。其中:
支持的探针类型:
探针类型
说明
存活探针(Liveness Probes)
用于判断容器是否存活,如果存活探针探测到容器不健康,kubelet将kill掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含存活探针,那么kubelet认为该容器的存活探针返回的值永远是Success,即容器存活。
就绪探针(Readiness Probes)
用于判断容器服务是否可用,达到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仓库中,部署时通过存储挂载的方式将其接入服务实例,详情请参见存储挂载。本文使用第一种方式为您介绍如何在部署服务时配置健康检查功能。
部署服务时配置健康检查功能
自定义部署配置健康检查功能
登录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文件配置的端口保持一致。
健康检查
打开健康检查开关,配置相关参数后,单击确定。具体参数配置说明,请参见健康检查参数表。
说明允许添加最多三个健康检查项,每个健康检查项可配置一种探针类型,且不能重复。
参数配置完成后,单击部署。
JSON部署配置健康检查功能
新建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
}
]
}其中关键配置说明如下。其他参数配置说明,请参见JSON部署。
参数 | 描述 | |
image | 用于部署模型服务的自定义镜像地址。 由于EAS不开放公网访问权限,因此您需要使用VPC内网Registry地址进行部署。例如 | |
env | name | 镜像执行时的环境变量名称。 |
value | 镜像执行时的环境变量取值。 | |
comand | 镜像的入口命令,只支持单一命令形式,不支持复杂脚本,例如 | |
port | 镜像中进程监听的网络端口号。例如8000。 重要 该端口一定要和command中的xxx.py文件配置的端口保持一致。 | |
liveness_check 说明 表示健康检查配置使用的探针类型为存活探针。您还可以将其配置为health_check(就绪探针)或startup_check(启动探针)。 | http_get | 表示使用HTTP Get检查方法请求访问8000端口。其中:
另外还支持使用以下两种健康检查方法:
|
initial_delay_seconds | 健康检查延迟时长,容器启动后多久开始进行第一次健康检查工作,默认为0秒。 | |
period_seconds | 健康检查频率,默认为10秒。频率过高会对Pod带来较大的额外开销,频率过低则无法及时反映容器产生的错误。 | |
timeout_seconds | 健康检查的超时时长,默认1秒。超时则健康检查将被认定为失败。 | |
success_threshold | 处于成功状态时,健康检查连续失败几次,可被认定为失败,就绪探针默认为3次,存活探针和启动探针默认为1次。 | |
failure_threshold | 处于失败状态时,健康检查连续成功几次,可被认定为成功,默认1次。 | |