阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Pod 的健康检查-探针

93次阅读
没有评论

共计 2629 个字符,预计需要花费 7 分钟才能阅读完成。

一、Pod 的健康检查 - 探针

1.1、探针基本概念

​探针是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler 有三种类型的处理程序:

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

2、TCPSocketAction: 对指定端口上的容器的 IP 地址进行 TCP 检查,如果端口打开则诊断被认为是成功的。

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

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

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

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

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

探测方式

​1、livenessProbe: 指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其重启策略的影响。如果容器不提供存活探针,则默认状态为 Success。

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

1.2、探针实现

就绪检测:

vim readinessProbe-httpget.yaml apiVersion: v1 kind: Pod metadata: name: readiness-httpget-pod spec: containers: - name: readiness-httpget-container image: docker.io/nginx imagePullPolicy: IfNotPresent readinessProbe: httpGet: port: 80 path: /index.html initialDelaySeconds: 1 periodSeconds: 3

我们先运行该 Pod 然后查看其状态:

Pod 的健康检查 - 探针

已经成功开始运行,这个时候我们进入到该 Pod 然后将其 index.html 文件删除后,在看其状态:

Pod 的健康检查 - 探针

这个时候我们可以看到,虽然容器处于 Running 状态,但是却处于 No Ready 的状态,这个时候我们通过 kubectl describe pod readiness-httpget-pod 命令,查看一下具体的信息:

Pod 的健康检查 - 探针

我们看到,显示“Readiness probe failed: HTTP probe failed with statuscode: 404”就绪探测失败,错误代码 404 表明页面不存在。

1.3、存活检测:

  • EXEC
vim livenessProbe-exec.yaml apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod spec: containers: - name: liveness-exec-container image: docker.io/busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"] livenessProbe: exec: command: ["test","-e","/tmp/live"] initialDelaySeconds: 1 periodSeconds: 3

然后查看下我们 Pod 的实时状态:

Pod 的健康检查 - 探针

​经过一段时间等待,我们发现 liveness-exec-pod 出现了重启的现象,这是因为,在我们创建这个 Pod 的时候,我们会在 /tmp 下创建一个 live 的文件,60 秒以后会将其删除,当进行存活检测的时候发现该文件没有了,那么 Pod 认为里面的容器死亡了,就会重启,那么就会重新执行一遍 yaml 文件内的配置,这个时候 live 文件又存在了,但是 60 秒以后,又会被删除,就会在重启一遍,以此类推。

  • HTTPGET
vim livenessProbe-httpget.yaml apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod spec: containers: - name: liveness-httpget-container image: docker.io/nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: httpGet: port: http path: /index.html initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 10

然后我们查看一下 Pod 的状态:

Pod 的健康检查 - 探针

这个时候我们通过“kubectl exec liveness-httpget-pod -it – rm -rf /usr/share/nginx/html/index.html”命令将 index.html 文件删除掉,我们在进行查看 Pod 的状态:

Pod 的健康检查 - 探针

经过一段时间等待,我们发现 liveness-httpget-pod 出现了重启的现象,这是因为,当我们手动删除了 index.html 文件后,当进行存活检测的时候发现该文件没有了,那么 Pod 认为里面的容器死亡了,就会重启,那么就会重新执行一遍 yaml 文件内的配置,这个时候 index.html 文件又存在了,如果我们再次删除该文件,就会在重启一遍,以此类推。

  • TCPSocket
vim livenessProbe-tcp.yaml apiVersion: v1 kind: Pod metadata: name: probe-tcp spec: containers: - name: nginx image: docker.io/nginx livenessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 tcpSocket: port: 808

然后我们查看一下 Pod 的状态:

Pod 的健康检查 - 探针

​我们可以看到,开始的时候,Pod 创建成功,但是 30 秒以后,重启了第一次,在经过 30 秒以后,又重启了一次,这是因为,nginx 默认开启的端口为 80,而当我们开始存活检测的时候,端口为 808,因为没有这个端口,所以认定 Pod 死亡,所以重启,当又开始存活检测的时候,依然没有端口,所以继续重启,以此类推。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-06-09发表,共计2629字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中