Kubernetes 容器健康检查与探测机制

近期文章:

为什么要对容器做探测?

Kubernetes 中 Pod 是最小的计算单元,而一个 Pod 又由多个容器组成,相当于每个容器就是一个应用,应用在运行期间,可能因为某些意外情况致使程序挂掉。那么如何监控这些容器状态稳定性,保证服务在运行期间不会发生问题,发生问题后进行重启等机制,就成为了重中之重的事情,考虑到这点 kubernetes 推出了活性探针机制。有了存活性探针能保证程序在运行中如果挂掉能够自动重启,但是还有个经常遇到的问题,比如说,在Kubernetes 中启动Pod,显示明明Pod已经启动成功,且能访问里面的端口,但是却返回错误信息。还有就是在执行滚动更新时候,总会出现一段时间,Pod对外提供网络访问,但是访问却发生404,这两个原因,都是因为Pod已经成功启动,但是Pod容器中应用程序还在启动中导致的,考虑到这点 Kubernetes 推出了就绪性探针机制。

默认的健康检查

Kubernetes 默认的健康检查机制: 每个容器启动时都会执行一个进程, 此进程由Dockerfile的CMD或ENTRYPOINT指定。 如果进程退出时返回码非零, 则认为容器发生故障, Kubernetes就会根据restartPolicy策略决定是否重启容器

kubernetes 三种探测方法

1、startupProbe 启动探测

探测容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

2、livenessProbe 存活探测

用指定的方式(exec、tcp、http)检测pod中的容器是否正常运行,如果检测失败,则认为容器不健康,那么Kubelet将根据Pod中设置的 restartPolicy策略来判断Pod 是否要进行重启操作,如果容器配置中没有配置 livenessProbe,Kubelet 将认为存活探针探测一直为success(成功)状态。

3、readinessProbe 就绪探测

就绪性探针,用于检测容器中的应用是否可以接受请求,当探测成功后才使Pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前端负载,如果探测失败,则将容器标记为未就绪状态,会把pod从前端负载移除。

可以自定义在pod启动时是否执行这些检测,如果不设置,则检测结果均默认为通过,如果设置,则顺序为 startupProbe > readinessProbe 和 livenessProbe,readinessProbe和livenessProbe是并发关系

真正的启动顺序

官方文档:Caution: Liveness probes do not wait for readiness probes to succeed. If you want to wait before executing a liveness probe you should use initialDelaySeconds or a startupProbe
也就是 liveness probes 并不会等到 readiness probes 成功之后才运行,根据上面的官方文档,liveness 和 readiness 应该是某种并发的关系。

三种探测方式

目前 livenessProbe 和 readinessProbe 、startupprobe 探测都支持下面三种探测方式
1、exec:在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。
2、TCPSocket:通过容器的 IP 地址和端口号执行 TCP 检 查,如果能够建立 TCP 连接,则表明容器健康。
3、HTTPGet:通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康

三种探测结果

1、Success:表示通过检测。
2、Failure:表示未通过检测。
3、Unknown:表示检测没有正常进行。

Pod 探针相关的属性

探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为
initialDelaySeconds:容器启动后要等待多少秒后探针开始工作,单位“秒”,默认是 0 秒,最小值是 0
periodSeconds: 执行探测的时间间隔(单位是秒),默认为 10s,单位“秒”,最小值是1
timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为1,单位“秒”。
successThreshold:连续探测几次成功,才认为探测成功,默认为 1,在 Liveness 探针中必须为1,最小值为1。
failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1


两种探针区别
readinessProbelivenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:
readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

查看帮助

kubectl explain pod.spec.containers

启动探测 startupProbe

查看startupProbe字段下的内容

kubectl explain pod.spec.containers.startupProbe

1、exec模式

apiVersion: v1 kind: Pod metadata:   name: startupprobe-exec spec:   containers:   - name: startup     image: tomcat     imagePullPolicy: IfNotPresent     ports:     - containerPort: 8080     startupProbe:       exec:         command:         - "/bin/sh"         - "-c"         - "ps axu|grep tomcat"       initialDelaySeconds: 20 #容器启动后多久开始探测       periodSeconds: 20 #执行探测的时间间隔       timeoutSeconds: 10 #探针执行检测请求后,等待响应的超时时间       successThreshold: 1 #成功多少次才算成功       failureThreshold: 3 #失败多少次才算失败

2、tcpSocket模式

apiVersion: v1 kind: Pod metadata:   name: startupprobe-tcp spec:   containers:   - name: startup     image: tomcat     imagePullPolicy: IfNotPresent     ports:     - containerPort: 8080     startupProbe:       tcpSocket:         port: 8080       initialDelaySeconds: 20       periodSeconds: 10       timeoutSeconds: 10       successThreshold: 1       failureThreshold: 3

3、httpGet模式

apiVersion: v1 kind: Pod metadata:   name: startuppro-httpget spec:   containers:   - name: startup-http     image: tomcat     imagePullPolicy: IfNotPresent     ports:     - containerPort: 8080     startupProbe:       httpGet:         path: /         port: 8080       initialDelaySeconds: 20       periodSeconds: 10       timeoutSeconds: 10       successThreshold: 1       failureThreshold: 3

存活性探测livenessProbe

官方文档

命令行查看帮助

kubectl explain pod.spec.containers.livenessProbe

Pod探针使用

1、LivenessProbe 探针使用示例

exec模式

apiVersion: v1 kind: Pod metadata:   name: liveness-exec   labels:      app: livness spec:   containers:   - name: liveness     image: busybox:1.28     imagePullPolicy: IfNotPresent     args:     - /bin/sh     - -c     - touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy;sleep 600     livenessProbe:       initialDelaySeconds: 10       periodSeconds: 5       exec:        command:        - cat         - /tmp/healthy

http模式

命令行查看帮助

kubectl explain pod.spec.containers.livenessProbe.httpGet

httpGet探测方式有如下可选的控制字段:
scheme: 用于连接host的协议,默认为HTTP。
host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
port:容器上要访问端口号或名称。
path:http服务器上的访问URI。
httpHeaders:自定义HTTP请求headers,HTTP允许重复headers

使用http模式

apiVersion: v1 kind: Pod metadata:   name: liveness-http   labels:     app: liveness spec:   containers:   - name: liveness     image: nginx     imagePullPolicy: IfNotPresent     livenessProbe:       httpGet:         path: /index.html         port: 80         scheme: HTTP       initialDelaySeconds: 10       periodSeconds: 5       timeoutSeconds: 10       failureThreshold: 3

任何大于或等于200且小于400的代码表示探测成功。
任何其他代码表示失败。

如果探测失败,则会杀死 Pod 进行重启操作。

tcp模式

apiVersion: v1 kind: Pod metadata:   name: liveness-tcp   labels:     app: liveness spec:   containers:   - name: liveness     image: nginx     imagePullPolicy: IfNotPresent     livenessProbe       tcpSocket: 80       initialDelaySeconds: 10       periodSeconds: 10       successThreshold: 1       failureThreshold: 3       timeoutSeconds: 10

就绪性探测readnessprobe

Pod 的 readinessProbe 探针使用方式和 livenessProbe 探针探测方法一样,也是支持三种,只是一个是用于探测应用的存活,一个是判断是否对外提供流量的条件
如果探测成功则代表内部程序成功启动,就开放对外提供接口访问,否则内部应用没有成功启动,暂不对外提供访问,直到就绪探针探测成功。