概述
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: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
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: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
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: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
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上连接到 容器。如果活动探针失败,则将重新启动容器。
发表回复