高级配置:健康检查

EAS提供了健康检查功能,该功能采用Kubernetes的健康检查机制,可以自动检测并恢复失败的容器,确保只有健康的实例接收流量并避免向不健康的实例分配资源。本文为您介绍如何配置健康检查功能。

使用限制

仅当您创建了包含健康检查逻辑的自定义镜像,并使用该镜像部署服务时,才能使用健康检查功能。

原理介绍

EAS的健康检查功能采用Kubernetes的健康检查机制,通过探针技术和健康检查方法来检测和管理服务的健康状况和可用性。其中:

  • 支持的探针类型:

    探针类型

    说明

    存活探针(Liveness Probes)

    用于判断容器是否存活,如果存活探针探测到容器不健康,kubeletkill掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含存活探针,那么kubelet认为该容器的存活探针返回的值永远是Success,即容器存活。

    就绪探针(Readiness Probes)

    用于判断容器服务是否可用,达到Ready状态的Pod才可以接收请求。ServiceEndpoint的关联关系也根据PodReady状态设置:

    • PodReady状态为False时,K8sPod IPService关联的后端Endpoint列表中隔离。

    • 等待PodReady状态变更为True时,K8sPod 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"] 

构建自定义镜像的具体操作步骤,请参见使用企业版实例构建镜像。您需要参考服务部署:自定义镜像,了解更多关于构建自定义镜像时需要注意的细节。另一种方式是将代码保存在NASGit仓库中,部署时通过存储挂载的方式将其接入服务实例,详情请参见高级配置:服务存储挂载。本文使用第一种方式为您介绍如何在部署服务时配置健康检查功能

部署服务时配置健康检查功能

通过控制台配置健康检查功能

  1. 进入模型在线服务(EAS)页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应的工作空间。

    3. 在工作空间页面的左侧导航栏选择模型部署 > 模型在线服务(EAS),进入模型在线服务(EAS)页面。

  2. 单击部署服务,然后在自定义模型部署区域,单击自定义部署

  3. 新建服务页面,配置以下关键参数,其他参数配置说明,请参见服务部署:控制台

    1. 模型服务信息区域,配置以下参数。

      参数

      描述

      镜像选择

      选择镜像地址,并在文本框中输入已准备好的自定义镜像地址,例如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文件配置的端口保持一致。

    2. 服务功能配置区域,单击健康检查,并打开健康检查开关。image

    3. 健康检查配置面板,单击添加按钮添加健康检查项,并配置以下参数。7b344ac6ea7fa47e7c575015749dabfe

      说明

      允许添加最多三个健康检查项,每个健康检查项可配置一种探针类型,且不能重复。

      参数

      描述

      探针类型

      支持使用以下三种探针类型:

      • 存活探针:用于检测容器是否处于正常运行状态。

      • 就绪探针:确保容器已经完成初始化并准备好处理请求。

      • 启动探针:专为需要较长时间初始化的应用设计,避免因容器启动过程缓慢而被错误地标记为失败。

      关于每种探针的原理说明,请参见原理介绍

      健康检查方法

      支持以下三种健康检查方法:

      • http_get:通过容器的IP地址、端口号以及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则容器健康。

      • tcp_socket:通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP连接,则容器健康。

      • exec(自定义健康检查):在容器中执行指定命令,如果执行成功后退出码为0,则健康检查成功。

      调用路径

      健康检查方法选择http_get时,支持配置该参数。

      检查的HTTP Server访问地址,前缀为http://localhost,后缀自定义,默认为/

      端口号

      健康检查方法选择http_gettcp_socket时,支持配置该参数。

      检查端口号,例如8000。

      运行命令

      健康检查方法选择exec时,支持配置该参数。

      输入运行命令。前端根据您输入的运行命令,自动将其转化为相应的格式,并输入到部署JSON中。

      初始化检查延时时长

      健康检查延迟时长,容器启动后多久开始进行第一次健康检查工作,默认为0秒。

      轮询检查时间间隔

      健康检查频率,默认为10秒。频率过高会对Pod带来较大的额外开销,频率过低则无法及时反映容器产生的错误。

      检查超时时长

      健康检查的超时时长,默认1秒。超时则健康检查将被认定为失败。

      检测成功认定次数

      处于成功状态时,健康检查连续失败几次,可被认定为失败,就绪探针默认为3次,存活探针和启动探针默认为1次。

      检测失败认定次数

      处于失败状态时,健康检查连续成功几次,可被认定为成功,默认1次。

    4. 单击确定

  4. 参数配置完成后,单击部署

通过本地客户端配置健康检查功能

  1. 下载并认证客户端,以Windows 64版本为例。

  2. 在客户端文件所在目录新建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次。

  3. 打开终端工具,在JSON文件所在目录,使用以下命令创建服务。更多操作说明,请参见命令使用说明

    eascmdwin64.exe create <service.json>

    其中:<service.json>需要替换为您创建的JSON文件名称。