1. Pod生命周期
Pod在整个生命周期过程中被系统定义为各种状态,熟悉Pod的各种状态对我们理解如何设置Pod的调度策略、重启策略是很有必要的。
Pod的状态如下表所示:
状态值 | 描述 |
---|---|
Pending | API Server已经创建该Pod,但Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程 |
Running | Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态 |
Succeeded | Pod内所有容器均已成功执行退出,且不再重启 |
Failed | Pod内所有容器均已退出,但至少有一个容器退出为失败状态 |
Unknown | 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致 |
2. Pod重启策略
Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。
Pod的重启策略包括Always、OnFailure和Never,默认值为Always。
- Always:当容器失败时,由kubelet自动重启该容器;
- OnFailure:当容器终止运行且退出码不为0时,有kubelet自动重启该容器;
- Never:不论容器运行状态如何,kubelet都不会重启该容器。
kubelet重启失效容器的时间间隔以sync-frequency乘以2n来计算
,例如1、2、4、8倍等,最初延迟5min,并且在成功重启后的10min后重置该时间。
3. Pod健康检查
对Pod的健康状态检查可以通过两类探针来检查:LivenessProbe和ReadinessProbe。
-
LivenessProbe探针
:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做出相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”。 -
ReadinessProbe探针
:用于判断容器是否启动完成(ready状态),可以接收请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。
LivenessProbe有以下三种实现方式:
(1)ExecAction:在容器内部执行一个命令,如果该命令的返回码为0,则表示容器健康。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
-c
echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 15
timeoutSeconds: 1
(2)TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果能成功建立TCP连接,则表明容器健康。
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp-socket
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 15
timeoutSeconds: 1
(3)HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大约等于200且小于400,则认为容器状态健康。
apiVersion: v1
kind: Pod
metadata:
name: liveness-http-get
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /_status/healthz
port: 80
initialDelaySeconds: 15
timeoutSeconds: 1
对于每种探测方式,都需要设置initialDelaySeconds和timeoutSeconds两个参数,它们的含义分别如下:
-
initialDelaySeconds
:启动容器后进行首次健康检查的等待时间,单位为s; -
timeoutSeconds
:健康检查发送请求后等待响应的超时时间,单位为s。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。