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