概述

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上连接到 容器。如果活动探针失败,则将重新启动容器。