本文介绍如何配置应用存活探针( Liveness Probe)和应用业务探针(Readiness Probe),对容器进行健康检查。
背景信息
Kubernetes中,容器的健康检查由kubelet定期执行,kubelet通过存活探针和业务探针来检查容器的状态和运行情况。
应用存活探针( Liveness Probe)
用于检查容器是否正常运行。如果检查成功,则表示容器正常运行。如果检查失败,系统会根据配置的容器重启策略进行相应的处理。如果未配置该探针,则默认容器一直正常运行。
应用存活探针可以应用于以下场景:
当应用程序处于运行状态但无法进行进一步操作时,Liveness Probe将捕获到deadlock,重启对应的容器,使得应用程序在存在bug的情况下依然能够运行。
长时间运行的应用程序最终可能会转换到broken状态,此时除了重新启动,无法恢复。Liveness Probe可以检测并补救这种情况。
应用业务探针(Readiness Probe)
用于检查容器是否已经就绪,可以为请求提供服务。如果检查成功,则表示容器已经准备就绪,可以接收业务请求。如果检查失败,则表示容器没有准备就绪,系统将停止向该容器发送任何请求,直至重新检查成功。
应用业务探针可以应用于以下场景:
如果应用程序暂时无法对外部流量提供服务,例如应用程序需要在启动期间加载大量数据或配置文件,此时,如果不想终止应用程序,也不想向其发送请求,可以通过Readiness Probe来检测和缓解这种情况。
Kubernetes方式
使用Kubernetes方式创建ECI实例时,您可以通过容器的livenesProbe和readinessProbe字段来设置Liveness Probe或者Readiness Probe。示例如下:
设置Liveness Probe
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: busybox:latest args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 #设置Liveness Probe,通过命令行方式进行检查 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 #容器启动5秒后开始检查 periodSeconds: 5 #每5秒执行一次检查
设置Readiness Probe
apiVersion: v1 kind: Pod metadata: labels: test: readiness name: readiness-exec spec: containers: - name: readiness image: busybox:latest args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 #设置Readiness Probe,通过命令行方式进行检查 readinessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 #容器启动5秒后开始检查 periodSeconds: 5 #每5秒执行一次检查
更多信息,请参见配置存活、就绪和启动探测器。
OpenAPI方式
调用CreateContainerGroup接口创建ECI实例时,您可以通过容器中的LivenessProbe和ReadinessProbe参数来设置应用存活探针和应用业务探针。相关参数说明如下表所示。更多信息,请参见CreateContainerGroup。
LivenessProbe相关参数
名称 | 类型 | 是否必选 | 示例值 | 描述 |
---|---|---|---|---|
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请求对应的协议类型,取值范围:
|
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秒。 |
Container.N.LivenessProbe.Exec.Command.N | RepeatList | 否 | cat /tmp/healthy | 使用命令行方式进行健康检查时,在容器内执行的命令。 |
Container.N.LivenessProbe.TcpSocket.Port | Integer | 否 | 8000 | 使用TCP Socket方式进行健康检查时,TCP Socket检测的端口。 |
ReadinessProbe相关参数
名称 | 类型 | 是否必选 | 示例值 | 描述 |
---|---|---|---|---|
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请求对应的协议类型,取值范围:
|
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秒。 |
Container.N.ReadinessProbe.Exec.Command.N | RepeatList | 否 | cat /tmp/healthy | 使用命令行方式进行健康检查时,在容器内执行的命令。 |
Container.N.ReadinessProbe.TcpSocket.Port | Integer | 否 | 8000 | 使用TCP Socket方式进行健康检查时,TCP Socket检测的端口。 |
控制台方式
通过弹性容器实例售卖页创建ECI实例时,您可以在容器配置的高级配置中开启健康检查功能。配置操作如下图所示。
使用控制台配置时,仅支持命令行和HTTP请求两种检查方式,不支持TCP Socket方式。
相关参数说明如下表所示。
参数 | 描述 |
---|---|
时间设置 | 包括延迟时间和超时时间。
|
检查方式 | 包括以下两种方式:
|
命令行脚本 | 当检查方式配置为命令行脚本时,需要配置在容器内执行的命令行脚本。 |
HTTP请求方式 | 当检查方式配置为HTTP请求方式时,需要配置HTTP Get请求包含的路径、端口和协议。 |
配置示例
以Nginx容器为例,创建一个设置了Liveness Probe和Readiness Probe的ECI实例,然后模拟服务异常,以查看探针的配置效果。
使用Java SDK创建一个ECI实例。
创建ECI实例时,容器镜像使用Nginx,设置Liveness Probe和Readiness Probe的代码示例如下:
//配置应用存活探针,在容器运行5秒后,每3秒检测一次80端口,超时时间为10秒,成功和失败的阈值均为3次 CreateContainerGroupRequest.Container.ContainerProbe livenessProbe = new CreateContainerGroupRequest.Container.ContainerProbe(); livenessProbe.setTcpSocketPort(80); livenessProbe.setInitialDelaySeconds(5); livenessProbe.setPeriodSeconds(3); livenessProbe.setFailureThreshold(3); livenessProbe.setSuccessThreshold(1); livenessProbe.setTimeoutSeconds(10); //配置应用业务探针,在容器运行5秒后,每3秒检测一次80端口,超时时间为10秒,成功阈值为1次,失败阈值为3次 CreateContainerGroupRequest.Container.ContainerProbe readinessProbe = new CreateContainerGroupRequest.Container.ContainerProbe(); readinessProbe.setTcpSocketPort(80); readinessProbe.setInitialDelaySeconds(5); readinessProbe.setPeriodSeconds(3); readinessProbe.setFailureThreshold(3); readinessProbe.setSuccessThreshold(3); readinessProbe.setTimeoutSeconds(10);
查看ECI实例创建成功的相关事件。
ECI实例创建成功后,查看实例事件,可以看到实例正常启动。
修改Nginx监听端口,模拟服务异常。
修改Nginx监听端口。
vi /etc/nginx/conf.d/default.conf
修改示例如下:
重启Nginx。
nginx -s reload
查看探针的生效情况。
重启Nginx几秒后,容器会自动进行重启。此时查看实例事件,可以看到在Liveness Probe和Readiness Probe各有三次失败之后,容器进行了重启。