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文件配置的端口保持一致。
在服务功能区域,打开健康检查开关,并配置以下参数。
说明允许添加最多三个健康检查项,每个健康检查项可配置一种探针类型,且不能重复。
参数
描述
探针类型
支持使用以下三种探针类型:
存活探针:用于检测容器是否处于正常运行状态。
就绪探针:确保容器已经完成初始化并准备好处理请求。
启动探针:专为需要较长时间初始化的应用设计,避免因容器启动过程缓慢而被错误地标记为失败。
关于每种探针的原理说明,请参见原理介绍。
健康检查方法
支持以下三种健康检查方法:
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文件名称。