提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
学习目标:
- 探针有哪些规则
- 通过什么方法检查
- 探针运行的方式
一、健康检查(探针)
健康检查:又称为探针( Probe),探针是由 kubelet 对容器执行的定期诊断。
官网示例:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
1.1 探针的三种规则
liveness Probe
- liveness Probe:存活探针:判断容器是否正在运行。如果探测失败,则 kubelet 会杀死容器,并且容器将根据 restartPolicy 来设置 pod状态。如果容器不提供存活探针,则默认状态为 Success。
readiness Probe
- readiness Probe:可读性探针:判断容器是否准备好接受请求。如果探测失败,端点控制器将从与 Pod 匹配的所有 service endpoints 中 剔除删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。
startup Probe
- startup Probe(1.17版本增加的):**判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。**如果配置了 startupProbe 探测,在则在 startupProbe 状态为 Success 之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。如果 startupProbe 失败,kubelet 将杀死容器,容器将根据 restartPolicy 来重启。如果容器没有配置 startupProbe,则默认状态为Success。
注:以上规则可以同时定义。在 readinessProbe 检测成功之前,Pod 的 running 状态是不会变成 ready 状态的。
1.2 Probe 支持三种检查方法
- exec:在容器内执行 指定一段命令。如果命令退出时 返回码为 0 则认为诊断成功。
- tcpSocket:对指定端口上的容器的IP地址 进行TCP检查(三次握手)。如果端口打开,TCP 连接成功,则诊断被认为是成功的。
- httpGet:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码在 200~400 之间,则诊断被认为是成功的。监测的是 路径上的文件在不在。
每次探测都将获得以下三种结果之一:
● 成功:容器通过了诊断。
● 失败:容器未通过诊断。
● 未知:诊断失败,因此不会采取任何行动。
二、探针测试
2.1 exec 探测方式
//示例1: exec 方式
apiVersion: v1
kind: Pod #自主式pod类型
metadata:
labels:
trest: 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 60
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
failureThreshold: 1
initialDelayseconds: 5
periodSeconds: 5
//initialDelaySeconds:容器启动,探针延后工作,默认是0s。
指定 kubelet在执行第一次探测前 应延迟等待X秒后开始探测,即第一次探测是在容器启动后的第6秒才开始执行。默认是0秒,最小值是0。
//periodSeconds:探针探测周期,指定了kubelet应该每5秒执行一次存活探测。默认是10秒。最小值是1。
#failureThreshold:当探测失败时,Kubernetes将在放弃之前重试的次数。
存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是3。最小值是1。
#timeoutSeconds:探测的超时后等待多少秒。默认值是1秒。最小值是1。(在Kubernetes 1.20版本之前,exec 探针会忽略timeoutSeconds探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。)
可以看到Pod 中只有一个容器。kubelet 在执行第一次探测前需要等待5秒,kubelet 会每5秒执行一次存活探测。kubelet 在容器内执行命令 cat /tmp/healthy来进行探测。如果命令执行成功并且返回值为 0,kubelet就会认为这个容器是健康存活的。
vim exec.yaml
apiversion: v1
kind: Pod
metadata:
name: liveness-exec
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox
imagePullPolicy: .IfNotPresent
command: ["/bin/sh","-c","touch /tmp/live ; sleep 30; rm -rf /tmp/live; sleep 3600"]
livenessProbe : #设置存活探针
exec: #exec 检查方法
command: [ "test" , "-e", "/tmp/live"] #检查文件目录是否存在
initialDelayseconds: 1 #容器启动,探针延后1秒工作
periodSeconds: 3 #kubelet应该每3秒执行一次存活探测
#保存后,创建资源
kubectl create -f exec.yaml
kubectl describe pods liveness-exec
2.2 httpGet 方式
//示例2:httpGet方式
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-Heade