概述
Kubernetes对Pod的健康状态可以通过两类探针来检查,kubelet定期执行这两类探针来诊断容器的健康状况。
- LivenessProbe探针:用于判断容器是否存活(Running状态),如果LivenessProbe探针检测到容器不健康,则kubelet会杀掉该容器并且根据容器的重启策略执行相应处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是Success。
- ReadinessProbe探针:用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接受请求。对于被Service管理的Pod,Service和Pod Endpoint的关联关系也将基于Pod是否能被Ready进行设置。如果运行过程中Ready状态变为Flase,则系统将其自动从Service的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回后端Endpoint列表。这样就能保证客户端在访问Service时不回被转发到服务不可用的Pod实例上。
实现方式
LivenessProbe探针和ReadinessProbe探针都可以配置以下三种实现方式:
ExecAction
在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康。
apiVersion: v1kind: Podmetadata: labels: test: liveness name: liveness-execspec: containers: - name: liveness image: k8s.gcr.io/busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 //启动容器后进行首次检查的等待时间 periodSeconds: 5 //监控检查发送请求后等待响应的超时时间。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。
为了执行探测,kubelet cat /tmp/healthy
在目标容器中执行命令,如果命令成功,则返回0,并且kubelet认为该容器是活动的且健康的。
容器启动时,它将执行以下命令
/bin/sh -c "touchu /tmp/healthy;sleep 30;rm -rf /temp/healthy;sleep 600
在容器寿命的前30s内,有一个/tmp/healthy
文件。因此在前30s内,该命令 cat /tmp/healthy
将返回成功代码,30s后,cat /tmp/healthy
将返回失败代码。
TCPGetAction
apiVersion: v1kind: Podmetadata: labels: test: liveness name: liveness-httpspec: containers: - name: liveness image: k8s.gcr.io/liveness args: - /server livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3 //每三秒执行一个活动探测
为了执行探测,kubelet将HTTP GET请求发送到在容器中运行并且正在侦听端口8080的服务器。如果服务器/healthz
路径的处理程序返回成功代码,则kubelet会认为该容器处于活动状态且运行状态良好。
任何大于等于200且小于400的状态码均表示成功。
TCPSocketAction
apiVersion: v1kind: Podmetadata: name: goproxy labels: app: goproxyspec: containers: - name: goproxy image: k8s.gcr.io/goproxy:0.1 ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20
TCP检查的配置与HTTP检查非常相似。本示例同时使用了就绪和活跃度探针。容器启动5秒后,kubelet将发送第一个就绪探测器。这将尝试连接到goproxy
端口8080上的容器。如果探测成功,则Pod将标记为就绪。kubelet将继续每10秒运行一次此检查。
除了就绪探针之外,此配置还包括活动探针。容器启动后,kubelet将运行第一个活动探针15秒。就像就绪探针一样,这将尝试goproxy
在端口8080上连接到 容器。如果活动探针失败,则将重新启动容器。