Pod健康检查和服务可用性检查
Kubernetes对Pod的健康状态可以通过两类探针来检查:
(1)LivenessProbe探针:用于判断容器是否存活(Running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。
(2)ReadinessProbe探针:用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。对于被Service管理的 Pod,Service与Pod Endpoint的关联关系也将基于Pod是否Ready进行设置。如果在运行过程中Ready状态变为False,则系统自动将其从Service 的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回 后端Endpoint列表。
对于LivenessProbe和ReadinessProbe用法都一样,拥有相同的参数和相同的监测方式。
- initialDelaySeconds:用来表示初始化延迟的时间,也就是告诉监测从多久之后开始运行,单位是秒
- timeoutSeconds: 用来表示监测的超时时间,如果超过这个时长后,则认为监测失败
LivenessProbe和ReadinessProbe均可配置以下三种实现方式
例子中只使用livenessProbe更换只需要改为readinessProbe:
(1)ExecAction:在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康
在下面的例子中,通过执行“cat /tmp/health”命令来判断一个容器运行是否正常。在该Pod运行后,将在创建/tmp/health文件10s后删除该文 件,而LivenessProbe健康检查的初始探测时间(initialDelaySeconds)为 15s,探测结果是Fail,将导致kubelet杀掉该容器并重启它
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
command: ["sh", "-c"]
args:
- /bin/sh
- -c
- echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 15
timeoutSeconds: 1
[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml
(2)TCPSocketAction:通过容器的IP地址和端口号执行TCP检 查,如果能够建立TCP连接,则表明容器健康
在下面的例子中,通过与容器内的localhost:80建立TCP连接进行健康检查:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-healthcheck2
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30
timeoutSeconds: 1
(3)HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康
在下面的例子中,kubelet定时发送HTTP请求到 localhost:80/_status/healthz来进行容器应用的健康检查(文件是之前build镜像创建的)
apiVersion: v1
kind: Pod
metadata:
name: pod-with-healthcheck
spec:
containers:
- name: nginx
imagePullPolicy: Never
image: harbor.op.com/public/nginx-hralthz:latest
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
timeoutSeconds: 1
[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml
[root@lab-26 ctchat]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dapi-test-pod-volume 1/1 Running 0 6h41m 172.152.106.4 minikube
pod-with-healthcheck 1/1 Running 0 44s 172.152.106.6 minikube
pod-with-healthcheck2 1/1 Running 0 68m 172.152.106.7 minikube
[root@lab-26 ctchat]# curl http://172.152.106.6/healthz
ok