Kubernetes实践之深入掌握Pod——Pod健康检查和服务可用性检查

1|0Pod健康检查和服务可用性检查

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: 用来表示监测的超时时间,如果超过这个时长后,则认为监测失败

1|1 LivenessProbe和ReadinessProbe均可配置以下三种实现方式

例子中只使用livenessProbe更换只需要改为readinessProbe:

(1)ExecAction:在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康

在下面的例子中,通过执行“cat /tmp/health”命令来判断一个容器运行是否正常。在该Pod运行后,将在创建/tmp/health文件10s后删除该文 件,而LivenessProbe健康检查的初始探测时间(initialDelaySeconds)为 15s,探测结果是Fail,将导致kubelet杀掉该容器并重启它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code-pre class="code-pre" id="pre-tWR5z6"><code-line class="line-numbers-rows"></code-line>apiVersion: v1
<code-line class="line-numbers-rows"></code-line>kind: Pod
<code-line class="line-numbers-rows"></code-line>metadata:
<code-line class="line-numbers-rows"></code-line>  labels:
<code-line class="line-numbers-rows"></code-line>    test: liveness
<code-line class="line-numbers-rows"></code-line>  name: liveness-exec
<code-line class="line-numbers-rows"></code-line>spec:
<code-line class="line-numbers-rows"></code-line>  containers:
<code-line class="line-numbers-rows"></code-line>  - name: liveness
<code-line class="line-numbers-rows"></code-line>    image: busybox
<code-line class="line-numbers-rows"></code-line>   command: ["sh", "-c"]
<code-line class="line-numbers-rows"></code-line>    args:
<code-line class="line-numbers-rows"></code-line>    - /bin/sh
<code-line class="line-numbers-rows"></code-line>    - -c
<code-line class="line-numbers-rows"></code-line>    - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
<code-line class="line-numbers-rows"></code-line>    livenessProbe:
<code-line class="line-numbers-rows"></code-line>      exec:
<code-line class="line-numbers-rows"></code-line>        command:
<code-line class="line-numbers-rows"></code-line>        - cat
<code-line class="line-numbers-rows"></code-line>        - /tmp/health
<code-line class="line-numbers-rows"></code-line>      initialDelaySeconds: 15
<code-line class="line-numbers-rows"></code-line>      timeoutSeconds: 1
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml
</code-pre>

(2)TCPSocketAction:通过容器的IP地址和端口号执行TCP检 查,如果能够建立TCP连接,则表明容器健康

在下面的例子中,通过与容器内的localhost:80建立TCP连接进行健康检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code-pre class="code-pre" id="pre-ZN2y4H"><code-line class="line-numbers-rows"></code-line>apiVersion: v1
<code-line class="line-numbers-rows"></code-line>kind: Pod
<code-line class="line-numbers-rows"></code-line>metadata:
<code-line class="line-numbers-rows"></code-line>  name: pod-with-healthcheck2
<code-line class="line-numbers-rows"></code-line>spec:
<code-line class="line-numbers-rows"></code-line>  containers:
<code-line class="line-numbers-rows"></code-line>  - name: nginx
<code-line class="line-numbers-rows"></code-line>    image: nginx
<code-line class="line-numbers-rows"></code-line>    ports:
<code-line class="line-numbers-rows"></code-line>    - containerPort: 80
<code-line class="line-numbers-rows"></code-line>    livenessProbe:
<code-line class="line-numbers-rows"></code-line>      tcpSocket:
<code-line class="line-numbers-rows"></code-line>        port: 80
<code-line class="line-numbers-rows"></code-line>      initialDelaySeconds: 30
<code-line class="line-numbers-rows"></code-line>      timeoutSeconds: 1
</code-pre>

(3)HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康

 在下面的例子中,kubelet定时发送HTTP请求到 localhost:80/_status/healthz来进行容器应用的健康检查(文件是之前build镜像创建的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code-pre class="code-pre" id="pre-4fpKKB"><code-line class="line-numbers-rows"></code-line>apiVersion: v1
<code-line class="line-numbers-rows"></code-line>kind: Pod
<code-line class="line-numbers-rows"></code-line>metadata:
<code-line class="line-numbers-rows"></code-line>  name: pod-with-healthcheck
<code-line class="line-numbers-rows"></code-line>spec:
<code-line class="line-numbers-rows"></code-line>  containers:
<code-line class="line-numbers-rows"></code-line>  - name: nginx
<code-line class="line-numbers-rows"></code-line>    imagePullPolicy: Never
<code-line class="line-numbers-rows"></code-line>    image: harbor.op.com/public/nginx-hralthz:latest
<code-line class="line-numbers-rows"></code-line>    ports:
<code-line class="line-numbers-rows"></code-line>    - containerPort: 80
<code-line class="line-numbers-rows"></code-line>    livenessProbe:
<code-line class="line-numbers-rows"></code-line>      httpGet:
<code-line class="line-numbers-rows"></code-line>        path: /healthz
<code-line class="line-numbers-rows"></code-line>        port: 80
<code-line class="line-numbers-rows"></code-line>      initialDelaySeconds: 10
<code-line class="line-numbers-rows"></code-line>      timeoutSeconds: 1
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>[root@lab-26 ~]# kubectl apply -f /data/k8s-yaml/test/dp.yaml
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>[root@lab-26 ctchat]# kubectl get pod -owide
<code-line class="line-numbers-rows"></code-line>NAME                    READY   STATUS    RESTARTS   AGE     IP              NODE       NOMINATED NODE   READINESS GATES
<code-line class="line-numbers-rows"></code-line>dapi-test-pod-volume    1/1     Running   0          6h41m   172.152.106.4   minikube             
<code-line class="line-numbers-rows"></code-line>pod-with-healthcheck    1/1     Running   0          44s     172.152.106.6   minikube             
<code-line class="line-numbers-rows"></code-line>pod-with-healthcheck2   1/1     Running   0          68m     172.152.106.7   minikube             
<code-line class="line-numbers-rows"></code-line>[root@lab-26 ctchat]# curl http://172.152.106.6/healthz
<code-line class="line-numbers-rows"></code-line>ok
</code-pre>

 


__EOF__

本文作者Wshile
本文链接https://www.cnblogs.com/Wshile/p/12951429.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Wshile  阅读(315)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示