“Yeah It’s on. ”
生命周期和健康检测
健康检测
根据探测结果来实现自动化容器的重启或故障切换等操作,从而提高应用的可靠性和可用性。三种健康探测方式:Liveness Probe(存活探测)、Readiness Probe(就绪探测)、Startup Probe(启动探测)
- Liveness Probe(存活探测):
- 作用: 确定容器是否仍在运行。如果探测失败,kubelet将杀死容器,并根据RestartPolicy决定是否重新启动该容器。
- 适用场景: 检测程序是否处于永久故障状态,需要重启。
- Readiness Probe(就绪探测):
- 作用: 确定容器是否准备好可以接收流量。只有当Pod中的所有容器都通过了就绪探测,它才会获取它的IP并加入集群负载均衡流量。
- 适用场景: 确认容器启动后是否已准备好开始接收流量,如程序初始化、缓存预热等。
- Startup Probe(启动探测):
- 作用: 指示容器中的应用程序在启动过程中是否正常运行。在容器启动后,它会禁用liveness probe,直到给定的失效超时时间段或者启动成功探测通过为止。
- 适用场景: 处理启动时间较长的容器,避免它们在应用程序完全启动之前被杀掉。
总结
- Liveness Probe关注容器是否”存活”
- Readiness Probe关注容器是否”准备好”可以接收请求
- Startup Probe用于延长启动过程中的宽限期,避免启动过程被判定失败
注意
Startup Probe只会在容器启动初运行,与Liveness Probe和Readiness Probe不同,Startup Probe的目的是为了应对启动时间较长的容器,给予容器一个合理的启动宽限期,避免在启动过程中被判定为失败而被杀掉。
Startup Probe的工作流程如下:
- 当容器启动时,kubelet会首先执行Startup Probe。
- 在Startup Probe成功之前,Liveness Probe会被禁用,即容器在启动阶段暂时不受Liveness Probe的影响。
- 如果Startup Probe在指定的超时时间内成功,则kubelet会视为容器启动成功,并开始执行Liveness Probe和Readiness Probe。
- 如果Startup Probe在超时时间内一直失败,kubelet会重启容器。
因此,Startup Probe只会在容器启动时执行一次,用于判断容器是否已经成功启动。一旦容器启动成功,后续的健康检查将由Liveness Probe和Readiness Probe接管。
需要注意的是,Startup Probe是一个可选的配置,如果容器的启动时间较短,或者你更希望在启动过程中立即执行Liveness Probe,则可以不配置Startup Probe。
探测检测方式
-
exec:在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。
-
TCPSocket:通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立TCP 连接,则表明
容器健康。
-
HTTPGet:通过容器的 IP 地址、端口号及路径调用 HTTP Get 方法,如果响应的状态码大于等
于 200 且小于 400,则认为容器健康
注意
- readinessProbe:
- 当readinessProbe检测失败时,意味着容器尚未准备好提供服务。
- Kubernetes会从该Pod对应的Endpoints列表中删除这个Pod的IP:Port条目。
- 这样,流量就不会被转发到这个未准备好的Pod上。
- 但是,Pod本身并不会被终止或重启。
- livenessProbe:
- 当livenessProbe检测失败时,意味着容器处于无法恢复的失败状态。
- Kubernetes会杀死这个容器,并根据Pod的重启策略(restartPolicy)来决定是否重新启动一个新的容器。
- 如果重启成功,新的容器将被添加到对应Service的Endpoints列表中。
这种机制可以确保:
- 通过readinessProbe,只有准备好的Pod才会被添加到Endpoints列表中接收流量。
- 通过livenessProbe,处于失败状态的容器会被重启,从而保证了服务的可用性和健康状态。
例:
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
[root@master1 ~]# vim live-http.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
labels:
app: nginx
spec:
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 20
periodSeconds: 10
restartPolicy: Always
initialDelaySeconds:首次探测之前等待的时间,单位是秒。在容器启动之后,等待指定的时间后才开始进行探测,避免容器还未启动完成就开始进行探测,导致探测失败。
periodSeconds:探测器的周期时间,单位是秒。探测器将在每隔一定时间间隔内进行一次探测。默认周期时间是 10 秒
容器重启策略:
-
Always: 当容器失败时,总是重启容器。这是默认的重启策略。
-
OnFailure: 当容器因为非零退出代码(容器出现错误)退出时,才会重启容器。
-
Never: 从不重启容器,即使容器失败。