使用探针对容器进行健康检查

Liveness Probe和Readiness Probe是用于检测容器状态的机制,其中Liveness Probe用于检测容器是否正常运行,Readiness Probe用于检测容器是否已经就绪。本文介绍如何配置Liveness Probe和Readiness Probe对容器进行健康检查,以便ECI更好地监控和管理容器的运行状态,确保服务的高可用性和稳定性。

功能说明

ECI支持通过存活探针和业务探针来检查容器的状态和运行情况。

探针

说明

应用场景

应用存活探针( Liveness Probe)

用于检查容器是否正常运行。

  • 如果检查成功,则表示容器正常运行。

  • 如果检查失败,系统会根据配置的容器重启策略进行相应的处理。

  • 如果未配置该探针,则默认容器一直正常运行。

  • 当应用程序处于运行状态但无法进行进一步操作时,Liveness Probe将捕获到deadlock,重启对应的容器,使得应用程序在存在bug的情况下依然能够运行。

  • 长时间运行的应用程序最终可能会转换到broken状态,此时除了重新启动,无法恢复。Liveness Probe可以检测并补救这种情况。

应用业务探针(Readiness Probe)

用于检查容器是否已经准备就绪,可以为请求提供服务。

  • 如果检查成功,则表示容器已经准备就绪,可以接收业务请求。

  • 如果检查失败,则表示容器没有准备就绪,系统将停止向该容器发送任何请求,直至重新检查成功。

  • 如果未配置该探针,则默认容器已经准备就绪。

如果应用程序暂时无法对外部流量提供服务,例如应用程序需要在启动期间加载大量数据或配置文件,此时,如果不想终止应用程序,也不想向其发送请求,可以通过Readiness Probe来检测和缓解这种情况。

配置说明(OpenAPI)

调用CreateContainerGroup接口创建ECI实例时,您可以通过容器中的LivenessProbe和ReadinessProbe参数来设置应用存活探针和应用业务探针。相关参数说明如下表所示。更多信息,请参见CreateContainerGroup

LivenessProbe相关参数

重要

设置LivenessProbe相关参数时,HttpGet、Exec和TcpSocket这三种检查方式,只能选择其中一种。

名称

类型

示例值

描述

Container.N.LivenessProbe.HttpGet.Path

string

/healthyz

使用HTTP请求方式进行健康检查时,HTTP Get请求检测的路径。

Container.N.LivenessProbe.HttpGet.Port

integer

8888

使用HTTP请求方式进行健康检查时,HTTP Get请求检测的端口号。

Container.N.LivenessProbe.HttpGet.Scheme

string

HTTP

使用HTTP请求方式进行健康检查时,HTTP Get请求对应的协议类型,取值范围:

  • HTTP

  • HTTPS

Container.N.LivenessProbe.Exec.Command.N

array

cat /tmp/healthy

使用命令行方式进行健康检查时,在容器内执行的命令。

Container.N.LivenessProbe.TcpSocket.Port

integer

8000

使用TCP Socket方式进行健康检查时,TCP Socket检测的端口。

Container.N.LivenessProbe.InitialDelaySeconds

integer

5

容器启动多久后开始检查。单位为秒。

Container.N.LivenessProbe.PeriodSeconds

integer

1

检查执行的周期,默认为10秒,最小为1秒。

Container.N.LivenessProbe.SuccessThreshold

integer

1

从上次检查失败后重新认定检查成功的检查次数阈值(必须是连续成功),默认为1。当前必须为1。

Container.N.LivenessProbe.FailureThreshold

integer

3

从上次检查成功后认定检查失败的检查次数阈值(必须是连续失败),默认为3。

Container.N.LivenessProbe.TimeoutSeconds

integer

1

检查超时的时间,默认为1秒,最小为1秒。

ReadinessProbe相关参数

重要

设置ReadinessProbe相关参数时,HttpGet、Exec和TcpSocket这三种检查方式,只能选择其中一种。

名称

类型

示例值

描述

Container.N.ReadinessProbe.HttpGet.Path

string

/healthyz

使用HTTP请求方式进行健康检查时,HTTP Get请求检测的路径。

Container.N.ReadinessProbe.HttpGet.Port

integer

8888

使用HTTP请求方式进行健康检查时,HTTP Get请求检测的端口号。

Container.N.ReadinessProbe.HttpGet.Scheme

string

HTTP

使用HTTP请求方式进行健康检查时,HTTP Get请求对应的协议类型,取值范围:

  • HTTP

  • HTTPS

Container.N.ReadinessProbe.Exec.Command.N

array

cat /tmp/healthy

使用命令行方式进行健康检查时,在容器内执行的命令。

Container.N.ReadinessProbe.TcpSocket.Port

integer

8000

使用TCP Socket方式进行健康检查时,TCP Socket检测的端口。

Container.N.ReadinessProbe.InitialDelaySeconds

integer

5

容器启动多久后开始检查。单位为秒。

Container.N.ReadinessProbe.PeriodSeconds

integer

1

检查执行的周期,默认为10秒,最小为1秒。

Container.N.ReadinessProbe.SuccessThreshold

integer

1

从上次检查失败后重新认定检查成功的检查次数阈值(必须是连续成功),默认为1。当前必须为1。

Container.N.ReadinessProbe.FailureThreshold

integer

3

从上次检查成功后认定检查失败的检查次数阈值(必须是连续失败),默认为3。

Container.N.ReadinessProbe.TimeoutSeconds

integer

1

检查超时的时间,默认为1秒,最小为1秒。

配置说明(控制台)

通过弹性容器实例控制台创建ECI实例时,您可以在容器配置区域选择容器,展开该容器的高级配置,然后打开监控检查开关,并配置探针。示例如下:

说明

使用控制台配置时,仅支持命令行和HTTP请求两种检查方式,不支持TCP Socket方式。

健康检查1

参数

描述

时间设置

  • 延迟时间:容器启动多久后开始检查。

  • 超时时间:检查的超时等待时间,如果超时,则视为检查失败。

检查方式

根据需要选择检查方式。

  • 命令行脚本:探针在容器内执行命令,并检查命令退出的状态码,如果状态码为0,则表示检查成功。

  • HTTP请求方式:探针向容器发送HTTP请求,如果返回状态码符合以下要求:200≤状态码<400,则表示检查成功。

命令行脚本

当检查方式为命令行脚本时,需要配置在容器内执行的命令行脚本。

HTTP请求方式

当检查方式为HTTP请求方式时,需要配置HTTP Get请求包含的路径、端口和协议。

配置示例

创建一台设置了Liveness Probe和Readiness Probe的ECI实例,然后模拟服务异常,以查看探针的配置效果。

  1. 调用CreateContainerGroup接口创建一台ECI实例。

    以下示例采用TCP Socket方式进行健康检查:

    ContainerGroupName=test-probe
    # 使用Nginx镜像,同时自动创建和绑定一个EIP
    Container.1.Name=container-1
    Container.1.Image=nginx
    AutoCreateEip=true
    # 配置应用存活探针,在容器运行5秒后,每3秒检测一次80端口,成功阈值为1次,失败阈值为3次,超时时间为10秒
    Container.1.LivenessProbe.TcpSocket.Port=80
    Container.1.ReadinessProbe.InitialDelaySeconds=5
    Container.1.LivenessProbe.PeriodSeconds=3
    Container.1.LivenessProbe.SuccessThreshold=1
    Container.1.LivenessProbe.FailureThreshold=3
    Container.N.LivenessProbe.TimeoutSeconds=10
    # 配置应用业务探针,在容器运行5秒后,每3秒检测一次80端口,成功阈值为1次,失败阈值为3次,超时时间为10秒
    Container.1.ReadinessProbe.TcpSocket.Port=80
    Container.1.ReadinessProbe.InitialDelaySeconds=5
    Container.1.ReadinessProbe.PeriodSeconds=3
    Container.1.ReadinessProbe.SuccessThreshold=1
    Container.1.ReadinessProbe.FailureThreshold=3
    Container.1.ReadinessProbe.TimeoutSeconds=10
  2. 弹性容器实例控制台查看ECI实例事件。

    ECI实例创建成功后,单击实例ID可打开实例详情页面。在事件页签下查看实例事件,可以看到容器正常启动。

    健康检查2

  3. 连接容器。具体操作,请参见连接ECI实例

  4. 修改Nginx监听端口,模拟服务异常。

    1. 修改Nginx监听端口。

      说明

      本示例使用的Nginx镜像环境中没有安装vim,执行vi命令前需执行apt-get updateapt-get install vim安装vim。

      vi /etc/nginx/conf.d/default.conf

      将监听端口从80改为8080,示例如下:

      健康检查2.png

    2. 重启Nginx。

      nginx -s reload
  5. 查看探针的生效情况。

    重启Nginx几秒后,容器会自动进行重启。此时查看实例事件,可以看到在Liveness Probe和Readiness Probe检查失败后,容器进行了重启。

    健康检查4