失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Pod 健康检查(探针)

Pod 健康检查(探针)

时间:2020-03-18 01:36:06

相关推荐

Pod 健康检查(探针)

Pod 健康检查(探针)

一、健康检查(探针)1.1 探针的三种规则1.2 Probe 支持三种检查方法二、探针测试2.1 exec 探测方式2.2 httpGet 方式2.3 tcpSocket 方式2.4 就绪检测三、Pod 启动、退出 postStart 、preStop 动作总结

一、健康检查(探针)

健康检查:又称为探针( 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: v1kind: Pod #自主式pod类型metadata:labels:trest: livenessname: liveness-execspec:containers:- name: livenessimage: k8s.gcr.io/ busyboxargs:- /bin/sh-- -C- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60livenessProbe:exec:command:- cat- /tmp/healthyfailureThreshold: 1initialDelayseconds: 5periodSeconds: 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.yamlapiversion: v1kind: Podmetadata:name: liveness-execnamespace: defaultspec:containers:- name: liveness-exec-containerimage: busyboximagePullPolicy: .IfNotPresentcommand: ["/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.yamlkubectl describe pods liveness-exec

2.2 httpGet 方式

//示例2:httpGet方式apiVersion: v1kind: Podmetadata:labels:test: livenessname: liveness-httpspec:containers:- name: livenessimage: k8s.gcr.io/livenessargs:- /serverlivenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3

在这个配置文件中,可以看到 Pod 也只有一个容器。initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 3 秒。periodSeconds 字段指定了 kubelet 每隔 3 秒执行一次存活探测。kubelet 会向容器内运行的服务(服务会监听 8080 端口)发送一个 HTTP GET 请求来执行探测。如果服务器上 /healthz 路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的。如果处理程序返回失败代码,则 kubelet 会杀死这个容器并且重新启动它。

任何大于或等于 200 并且小于 400 的返回代码标示成功,其它返回代码都标示失败。

vim httpget.yamlapiVersion: v1kind: Podmetadata:name: liveness-httpgetnamespace: defaultspec:containers:- name: liveness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 10kubectl create -f httpget.yamlkubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.htmlkubectl get podsNAMEREADY STATUS RESTARTS AGEliveness-httpget 1/1Running 12m44s

2.3 tcpSocket 方式

//示例3:tcpSocket方式apiVersion: v1kind: Podmetadata:name: goproxylabels:app: goproxyspec:containers:- name: goproxyimage: k8s.gcr.io/goproxy:0.1ports:- containerPort: 8080readinessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20

这个例子同时使用 readinessProbe 和 livenessProbe 探测。kubelet 会在容器启动 5 秒后发送第一个 readinessProbe 探测。这会尝试连接 goproxy 容器的 8080 端口。如果探测成功,kubelet 将继续每隔 10 秒运行一次检测。除了 readinessProbe 探测,这个配置包括了一个 livenessProbe 探测。kubelet 会在容器启动 15 秒后进行第一次 livenessProbe 探测。就像 readinessProbe 探测一样,会尝试连接 goproxy 容器的 8080 端口。如果 livenessProbe 探测失败,这个容器会被重新启动。

vim tcpsocket.yamlapiVersion: v1kind: Podmetadata:name: probe-tcpspec:containers:- name: nginximage: soscscs/myapp:v1livenessProbe:initialDelaySeconds: 5timeoutSeconds: 1tcpSocket:port: 8080periodSeconds: 3kubectl create -f tcpsocket.yamlkubectl exec -it probe-tcp -- netstat -natpActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 00 0.0.0.0:80 0.0.0.0:*LISTEN1/nginx: master prokubectl get pods -wNAME READY STATUS RESTARTS AGEprobe-tcp 1/1Running 04sprobe-tcp 1/1Running 114sprobe-tcp 1/1Running 226s

2.4 就绪检测

//示例4:就绪检测vim readiness-httpget.yamlapiVersion: v1kind: Podmetadata:name: readiness-httpgetnamespace: defaultspec:containers:- name: readiness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 10kubectl create -f readiness-httpget.yaml//readiness探测失败,无法进入READY状态kubectl get pods NAMEREADY STATUS RESTARTS AGEreadiness-httpget 0/1Running 018skubectl exec -it readiness-httpget sh# cd /usr/share/nginx/html/# ls50x.html index.html# echo 123 > index1.html # exitkubectl get pods NAMEREADY STATUS RESTARTS AGEreadiness-httpget 1/1Running 02m31skubectl exec -it readiness-httpget -- rm -rf /usr/share/nginx/html/index.htmlkubectl get pods -wNAMEREADY STATUS RESTARTS AGEreadiness-httpget 1/1Running 04m10sreadiness-httpget 0/1Running 14m15s

//示例5:就绪检测2vim readiness-myapp.yamlapiVersion: v1kind: Podmetadata:name: myapp1labels:app: myappspec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10 ---apiVersion: v1kind: Podmetadata:name: myapp2labels:app: myappspec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10 ---apiVersion: v1kind: Podmetadata:name: myapp3labels:app: myappspec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10 ---apiVersion: v1kind: Servicemetadata:name: myappspec:selector:app: myapptype: ClusterIPports:- name: httpport: 80targetPort: 80kubectl create -f readiness-myapp.yamlkubectl get pods,svc,endpoints -o wideNAME READY STATUS RESTARTS AGEIP NODENOMINATED NODE READINESS GATESpod/myapp1 1/1Running 03m42s 10.244.2.13 node02 <none> <none>pod/myapp2 1/1Running 03m42s 10.244.1.15 node01 <none> <none>pod/myapp3 1/1Running 03m42s 10.244.2.14 node02 <none> <none>NAME TYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGESELECTOR......service/myapp ClusterIP 10.96.138.13 <none> 80/TCP 3m42s app=myappNAME ENDPOINTS AGE......endpoints/myapp 10.244.1.15:80,10.244.2.13:80,10.244.2.14:80 3m42skubectl exec -it pod/myapp1 -- rm -rf /usr/share/nginx/html/index.html//readiness探测失败,Pod 无法进入READY状态,且端点控制器将从 endpoints 中剔除删除该 Pod 的 IP 地址kubectl get pods,svc,endpoints -o wideNAME READY STATUS RESTARTS AGEIP NODENOMINATED NODE READINESS GATESpod/myapp1 0/1Running 05m17s 10.244.2.13 node02 <none> <none>pod/myapp2 1/1Running 05m17s 10.244.1.15 node01 <none> <none>pod/myapp3 1/1Running 05m17s 10.244.2.14 node02 <none> <none>NAME TYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGESELECTOR......service/myapp ClusterIP 10.96.138.13 <none> 80/TCP 5m17s app=myappNAME ENDPOINTS AGE......endpoints/myapp 10.244.1.15:80,10.244.2.14:80 5m17s

三、Pod 启动、退出 postStart 、preStop 动作

vim post.yamlapiVersion: v1kind: Podmetadata:name: lifecycle-demospec:containers:- name: lifecycle-demo-containerimage: soscscs/myapp:v1lifecycle: #此为关键字段postStart:exec:command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /var/log/nginx/message"]preStop:exec:command: ["/bin/sh", "-c", "echo Hello from the poststop handler >> /var/log/nginx/message"]volumeMounts:- name: message-logmountPath: /var/log/nginx/readOnly: falseinitContainers:- name: init-myserviceimage: soscscs/myapp:v1command: ["/bin/sh", "-c", "echo 'Hello initContainers' >> /var/log/nginx/message"]volumeMounts:- name: message-logmountPath: /var/log/nginx/readOnly: falsevolumes:- name: message-loghostPath:path: /data/volumes/nginx/log/type: DirectoryOrCreatekubectl create -f post.yamlkubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODENOMINATED NODE READINESS GATESlifecycle-demo 1/1Running 02m8s 10.244.2.28 node02 <none> <none>kubectl exec -it lifecycle-demo -- cat /var/log/nginx/messageHello initContainersHello from the postStart handler//在 node02 节点上查看[root@node02 ~]# cd /data/volumes/nginx/log/[root@node02 log]# lsaccess.log error.log message[root@node02 log]# cat message Hello initContainersHello from the postStart handler#由上可知,init Container先执行,然后当一个主容器启动后,Kubernetes 将立即发送 postStart 事件。//删除 pod 后,再在 node02 节点上查看kubectl delete pod lifecycle-demo[root@node02 log]# cat message Hello initContainersHello from the postStart handlerHello from the poststop handler#由上可知,当在容器被终结之前, Kubernetes 将发送一个 preStop 事件。

总结

健康检查:又称为探针(Probe)

探针是由kubelet对容器执行的定期诊断。

探针的三种规则:

livenessProbe:判断容器是否正在运行。如果探测失败,则kubelet会杀死容器,并且容器将根据 restartPolicy 来设置 Pod 状态。如果容器不提供存活探针,则默认状态为Success。

readinessProbe:判断容器是否准备好接受请求。如果探测失败,端点控制器将从与 Pod 匹配的所有 service endpoints 中剔除删除该Pod的IP地址。初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默认状态为Success。

startupProbe(这个1.17版本增加的):判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。如果配置了 startupProbe 探测,在则在 startupProbe 状态为 Success 之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。 如果 startupProbe 失败,kubelet 将杀死容器,容器将根据 restartPolicy 来重启。如果容器没有配置 startupProbe, 则默认状态为 Success。

#注:以上规则可以同时定义。在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态的。

Probe支持三种检查方法:

exec:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。

tcpSocket:对指定端口上的容器的IP地址进行TCP检查(三次握手)。如果端口打开,则诊断被认为是成功的。

httpGet:对指定的端口和路径上的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的

每次探测都将获得以下三种结果之一:

●成功:容器通过了诊断。

●失败:容器未通过诊断。

●未知:诊断失败,因此不会采取任何行动

如果觉得《Pod 健康检查(探针)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。