作者:不焦躁的程序员 2023-10-14 15:36:14
云计算
云原生 本文主要从以下六个方面介绍Pod的健康检查:刚接触K8S的糗事、Pod生命周期、重启策略、健康检查、如何选择探针、实战。
要想Kubernetes里每个服务的可用性更高,那么对Pod的健康检查是少不了的。Pod生命周期和健康检查是我们最常接触的基础知识,虽说是基础吧,但如果理解不好,出现问题时很容易抓耳挠腮,揪头发。
本文主要从以下六个方面介绍Pod的健康检查:刚接触K8S的糗事、Pod生命周期、重启策略、健康检查、如何选择探针、实战,最后还会有知识点的总结和排查Pod问题的总结。
回想2019年我刚开始接触Kubernetes时,碰到Pod一直起不来的情况,就开始抓瞎。后来渐渐地掌握了一些排查方法之后,这种情况才得以缓解。
随着时间推移,又碰到了问题。有一天在部署某个springboot微服务时,在开发测试环境部署了好多次,只有几次能成功启动,大部分的部署未能成功启动。但是生产环境却每次都能成功部署。当时这个问题困扰了我很久。现在想来也是蛮有意思的。
相信很多你已经猜出来答案了,对,跟我们今天要讲的健康检查有关。
谈健康检查之前,首先得一起回顾下Pod的生命周期 或者 说是Pod的状态。
Pod 的生命周期,从 Pending 状态开始, 如果Pod中至少有一个应用容器正常启动,则进入 Running状态,之后,如果Pod中的容器正常退出则进入 Succeeded状态,如果Pod中的容器非正常终止则进入 Failed 状态。
Pod的重启是由该Pod所处的Node节点上的kubelet 进行判断和控制的。kubelet会根据重启策略进行相应操作。
Pod的重启策略有3个:Always、OnFailure、Never,默认是Always。
健康检查功能可以保障应用的可用性,以及控制何时可对外的访问。
K8S有3种检查探针:LivenessProbe存活探针、ReadinessProbe就绪探针、StartupProbe启动探针。
以上3种探针,每种都有3种实现方式:
在部署Java微服务应用时,我一般选用HTTPGetAction方式。
既然有3种探针,那么如何选择呢?
成年人的世界不做选择题,3个字,全都要,比如:应用场景是Spring微服务时,3种探针其实都会用上。
一个应用启动分3个阶段:开始启动 → 成功启动(存活) → 可对外访问。
那对应的探针使用顺序为:启动探针 → 存活探针 → 就绪探针。如下图:
如果只选择存活探针,就很尴尬:
如果不配置就绪探针的话,也很尴尬:
所以不做选择题,全都要,需要在每个阶段用上对应的探针。
(1) 编排yaml
比如:对Pod进行存活检测,30S之后,如果不存活则kill掉,然后重启。
apiVersion: v1
kind: Pod
metadata:
name: pod-lifecycle
namespace: demo
labels:
app: pod-lifecycle
spec:
containers:
- name: pod-lifecycle
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
# 等待5秒执行第一次探测
initialDelaySeconds: 5
# 探针连续失败了 3 次之后,K8S认为检查已失败,然后触发重启
failureThreshold: 3
# 每5秒执行一次存活探测
periodSeconds: 5
可以看到Pod被重启多次
(2) 排查异常
出现问题时也不用慌,可以通过kubectl get pods -n demo -o wide 和kubectl describe pod pod-lifecycle -n demo排查。可以清晰的看到异常的原因:存活检查失败。
(1) 编排yaml
比如:对Pod进行存活检测,30S之后,如果不存活则kill掉,然后重启。由于模拟了启动比较耗时,所以在容器还未成功启动,就直接被kill掉了,紧接着反复被kill掉。
apiVersion: v1
kind: Pod
metadata:
name: pod-lifecycle-2
namespace: demo
labels:
app: pod-lifecycle-2
spec:
containers:
- name: pod-lifecycle-2
image: busybox
args:
- /bin/sh
- -c
- sleep 20; touch /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
# 等待5秒执行第一次探测
initialDelaySeconds: 5
# 探针连续失败了 2 次之后,K8S认为检查已失败,然后触发重启
failureThreshold: 2
# 每5秒执行一次存活探测
periodSeconds: 5
执行yaml之后,可以看到,Pod重复这样的动作:健康检查失败被重启。
(2) 引入startupProbe解决此问题
apiVersion: v1
kind: Pod
metadata:
name: pod-lifecycle-3
namespace: demo
labels:
app: pod-lifecycle-3
spec:
containers:
- name: pod-lifecycle-3
image: busybox
args:
- /bin/sh
- -c
- sleep 20; touch /tmp/healthy; sleep 600
startupProbe:
exec:
command:
- cat
- /tmp/healthy
# 等待5秒执行第一次探测
initialDelaySeconds: 5
# 探针连续失败了 10 次之后,K8S认为检查已失败,然后触发重启
failureThreshold: 5
# 每5秒执行一次存活探测
periodSeconds: 5
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
# 等待5秒执行第一次探测
initialDelaySeconds: 5
# 探针连续失败了 2 次之后,K8S认为检查已失败,然后触发重启
failureThreshold: 2
# 每5秒执行一次存活探测
periodSeconds: 5
要想Kubernetes里每个服务的可用性更高,那么对Pod的健康检查是少不了的。本文重点如下:
讲到这里,文章开头我碰到的问题,你肯定也知道答案了。由于应用启动时间较长,但是只配置了存活探针,没有配置启动探针。再加上存活探针配置的整体时间又太短了,每台机器的性能又不同,所以导致有时候能启动成功,有时候启动失败。
分享题目:要想Pod好--健康检查少不了
分享链接:http://www.shufengxianlan.com/qtweb/news24/321924.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联