一、Pod存活性探测
有不少的应用长时间持续运行后逐渐转为不可用状态,并且仅能通过重启操作来恢复,Kubernetes的容器存活性探测机制可发现诸如此类的问题,并根据探测结果结合重启策略触发后续的行为。存活性探测是隶属于容器级别的配置,kubelet可基于它判定何时需要重启一个容器,该诊断操作由容器的处理器(handler)进行定义的。Kubernetes支持三种处理器用于Pod的探测:
1)ExecAction:在容器中执行一个命令,并根据其返回的状态码进行诊断的操作称为Exec探测,状态码为0表示探测诊断成功,否则Pod即为不健康状态
2)TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能够成功打开即为正常状态,否则为不健康状态
3)HTTPGetAction:通过向容器IP地址的某个指定端口的指定path发起HTTP GET请求进行诊断,响应码为2XX或3XX时即为成功,否则为失败
存活性探测:用于判定容器是否处于"运行"状态;一旦此类检测未通过,kubelet将杀死容器并根据其restartPolicy决定是否将其重启;未定义存活性检测的容器默认状态为"Success"
就绪性探测:用于判断容器是否准备就绪并可对外提供服务;未通过检测的容器意味着其尚未准备就绪,端点控制器(如Service对象)会将其IP从所有匹配到此Pod对象的Service对象的端点列表中移除;检测通过之后,会再次将其IP添加至端点列表中
二、容器的重启策略
容器程序发生崩溃或容器申请超出限制等原因都可能会导致Pod对象的终止,此时是否应该重建该Pod对象则取决于其重启策略(restartPolicy)属性的定义:
1)Always:但凡Pod对象终止就将其重启,此为默认设定
2)OnFailure:仅在Pod对象出现错误时方才将其重启
3)Never:从不重启
需要注意的是,restartPolicy适用于Pod对象中的所有容器,而且它仅用于控制在同一节点上重新启动Pod对象的相关容器。首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长依次是10秒、20秒、40秒、80秒、160秒和300秒,300秒是最大延迟。事实上,一旦绑定到一个节点,Pod对象将永远不会被重新绑定到另一个节点上,它要么被重启,要么终止,直到节点发生故障或者被删除。
三、Exec探针
exec类型的探针通过在目标容器中执行由用户自定义的命令来判断容器的健康状态,若命令状态返回值为0则表示"成功"通过检测,其它值均为"失败"状态。
1)编写exec探针yaml文件
]# cat exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: exec-pod
labels:
test: liveness-exec
spec:
containers:
- name: liveness-exec-demo
image: busybox
imagePullPolicy: IfNotPresent
args: ["/bin/sh","-c"," touch /tmp/healthy; sleep 60; rm -rf /tmp/healthy; sleep 600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
]# kubectl apply -f exec.yaml
pod/exec-pod created
2)检测Pod内文件是否存在
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
exec-pod 1/1 Running 0 12s 10.244.1.42 node1 <none> <none>
]# kubectl exec exec-pod -it -- /bin/sh
/ # ls /tmp/ -l
total 0
-rw-r--r-- 1 root root 0 Aug 1 11:21 healthy
/ # exit
此处可以看到容器中是存在此文件的
3)再次查看Pod状态
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
exec-pod 1/1 Running 1 2m37s 10.244.1.42 node1 <none> <none>
# kubectl exec exec-pod -it -- /bin/sh
/ # ls -l /tmp/
total 0
过了60秒之后,再次查看Pod的状态发现该Pod已经重启了一次,说明Pod的存活性检测失败了,再进入Pod中查看文件已经被删除了
4)查看Pod的详细信息
]# kubectl describe pods exec-pod
Name: exec-pod
Namespace: default
Priority: 0
Node: node1/172.16.2.101
Start Time: Sat, 01 Aug 2020 19:21:03 +0800
Labels: test=liveness-exec
Annotations: Status: Running
IP: 10.244.1.42
IPs:
IP: 10.244.1.42
Containers:
liveness-exec-demo:
Container ID: docker://e06871bd25c2b0d556821a2bd87de0e2f4862bb43bb90cb2b7e5fe2b6b740772
Image: busybox
Image ID: docker-pullable://busybox@sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Port: <none>
Host Port: <none>
Args:
/bin/sh
-c
touch /tmp/healthy; sleep 60; rm -rf /tmp/healthy;