Kubernetes探针
K8S探针是什么?
探针就是Kubernetes对于应用服务的检测,主要由kubelet对容器执行的定期诊断,来判断应用是否处于存活状态,服务是否可用。
K8S探针一共有三种:livenessProbe、readinessProbe、startupProbe。探测的方式也有三种:exec、httpGet、tcpSocket,探测方式可以运用在所有探针中,但是一个探针中只能有一种探测方式。
探针工作内容:
和微服务的心跳检测类似,每隔一段时间,检测这个容器是否还正常工作,检测状态分为三种,每次检测,都会得到其中一种状态,k8s会根据检测到的不同状态,对容器进行不同的处理。
- 成功:容器通过了诊断。
- 失败:容器未通过诊断。
- 未知:诊断失败,因此不会采取任何行动。
探针类型
livenessProbe
存活性探针,判断容器是否正在运行。
探测策略
- 如果探测失败,则kubelet会杀死容器,并且容器将根据
restartPolicy来设置Pod状态。 - 如果容器不提供存活探针,则默认状态为
Success。
容器重启策略
容器的容器策略由资源清单中的restartPolicy字段来配置进行控制。
restartPolicy字段可设置的值:Always、OnFailure、Nerver。
- Always:表示一旦不管以何种方式终止运行,kubelet都将重启
- OnFailure:表示只有Pod以非0退出码退出才重启
- Nerver:表示不再重启该Pod
失败的容器由kubelet以五分钟为上限的指数退避延迟(10秒,20秒,40秒…)重新启动,并在成功执行十分钟后重置。
readinessProbe
就绪性探针,用于判断容器是否准备好接受请求的准备。
探测策略:
- 如果探测失败,端点控制器将从与Pod匹配的所有
service endpoints中剔除删除该Pod的IP地址。 - 初始延迟之前的就绪状态默认为
Failure。 - 如果容器不提供就绪探针,则默认状态为
Success。
温馨提示:一旦就绪探针不通过检测,可能服务状态处于running状态,但是
READY却是0/1的情况。
startupProbe
启动探针,检测容器中的应用是否已经启动。
探测策略:
- 主要针对于不能确定具体启动时间的应用。如果匹配了startupProbe探测,则在startupProbe状态为Success之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。如果startupProbe失败,kubelet将杀死容器,容器将根据restartPolicy来重启。
- 如果容器不提供启动探针,则默认状态为
Success。
探针配置字段
每种探针下面都可以加上以下字段来设置探针的策略。
可配置字段:
- initialDelaySeconds:指定的这个秒以后才执行探测
- timeoutSeconds:探测超时,到了超时时间探测还没返回结果说明失败
- successThreshold:成功阈值,连续几次成才算成功
- failureThreshold:失败阈值,连续几次失败才算真失败
- periodSeconds:每隔几秒来运行这个
探针使用规则
以上的三种探针可以同时存在,一般情况下都是同时一起使用三种探针。
同时存在的规则顺序:
规则顺序是startupProbe会最先启动,并且启动探针只检测一次,剩下的两种只要你的pod存在就会一直去检测,然后在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态。
补充说明:如果容器不提供任何探针的情况下,则默认状态都为Success。
探针的探测机制
exec
通过在容器内执行指定命令,来判断命令退出时返回的状态码,如果为 0 表示正常。
【示例】
spec:
......
template:
......
spec:
containers:
- name: nginx
startupProbe:
......
#exec方式
exec:
command: ["/bin/sh","-c","curl http://localhost:80"]
httpGet
通过对容器的 IP 地址、端口和 URL 路径来发送 GET 请求;如果响应的状态码在 200 ~ 399 间,表示正常。
【示例】
spec:
......
template:
......
spec:
containers:
- name: nginx
startupProbe:
......
#httpGet方式
httpGet:
port: 80
path: /
tcpSocket
通过对容器的 IP 地址和指定端口,进行 TCP 检查,如果端口打开,表示正常。
【示例】
spec:
......
template:
......
spec:
containers:
- name: nginx
startupProbe:
......
#tcpSocket方式
tcpSocket:
port: 80
探针的配置示例
资源清单编写如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
minReadySeconds: 5
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.1
ports:
- containerPort: 80
#启动探针
startupProbe:
initialDelaySeconds: 20
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 10
periodSeconds: 10
#exec方式
exec:
command: ["/bin/sh","-c","curl http://localhost:80"]
#就绪探针
readinessProbe:
initialDelaySeconds: 20
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 10
periodSeconds: 10
#httpGet方式
httpGet:
port: 80
path: /
#存活探针
livenessProbe:
initialDelaySeconds: 20
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 10
periodSeconds: 10
#tcpSocket方式
tcpSocket:
port: 80
其中下面配置参数的含义,需要通过以下参数来配置探针的效果
注意:这里分别用了K8S探针的三种不同类型和不同方式来展示,可通过自行需求配置