K8s系列之:Pod生命周期和重启策略

K8s系列之:Pod生命周期和重启策略

一、Pod状态

Pod在整个生命周期过程中被系统定义为各种状态。

Pod的状态:

状态值 描述
Pending API Server已经创建该Pod,但Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程
Running Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
Succeeded Pod内所有容器均成功执行退出,且不会再重启
Failed Pod内所有容器均已退出,但至少有一个容器退出为失败状态
Unknown 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致

二、Pod的重启策略

Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。

Pod的重启策略包括:

  • Always:当容器失效时,由kubelet自动重启该容器
  • OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器
  • Never:不论容器运行状态如何,kubelet都不会重启该容器
  • 默认值为Always

kubelet重启失效容器的时间间隔以sync-frequency乘以2n来计算,例如1、2、4、8倍等,最长延时5min,并且在成功重启后的10min后重置该时间。

Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静态Pod)。

每种控制器对Pod的重启策略要求如下:

  • RC和DaemonSet:必须设置为Always,需要保证该容器持续运行
  • Job:OnFailure或Never,确保容器执行完成后不再重启
  • kubelet:在Pod失效时自动重启它

三、Pod重启策略和状态转换场景关系

常见的状态转换场景:

Pod包含的容器数 Pod当前的状态 发生事件 Always OnFailure Never
包含一个容器 Running 容器成功退出 Running Succeeded Succeeded
包含一个容器 Running 容器失败退出 Running Running Failed
包含两个容器 Running 1个容器失败退出 Running Running Running
包含两个容器 Running 容器被OOM杀掉 Running Running Failed

四、Pod健康检查

对Pod的健康状态检查可以通过两类探针来检查:

  • LivenessProbe和ReadinessProbe
  • LivenessProbe探针:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是"Success"。
  • ReadinessProbe探针:用于判断容器是否启动完成(ready状态),可以接收请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。

五、LivenessProbe探针

kubelet定期执行LivenessProbe探针来诊断容器的健康状况。LivenessProbe有以下三种实现方式:

1.ExecAction

  • 在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康。

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

apiVersion: v1
kind: Pod
metadata: 
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: gcr.io/google_containers/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连接,则表明容器健康。

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

apiVersion: v1
kind: Pod
metadata: 
  name: pod-with-healthcheck
spec:
  containers:
 - name: nginx
    image: nginx
    ports: 
    - containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 15
      timeoutSeconds: 1

3.HTTPGetAction

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

在下面的例子中,kubelet定时发送HTTP请求到localhost:80/_status/healthz来进行容器应用的健康检查。

apiVersion: v1
kind: Pod
metadata: 
  name: pod-with-healthcheck
spec:
  containers:
 - name: nginx
    image: nginx
    ports: 
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /_status/healthz
        port: 80
      initialDelaySeconds: 30
      timeoutSeconds: 1

六、initialDelaySeconds和timeoutSeconds参数含义

  • initialDelaySeconds:启动容器后进行首次健康检查的等待时间,单位为s
  • timeoutSeconds:健康检查发送请求后等待响应的超时时间,单位为s。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。
上一篇:k8s工作负载


下一篇:Kubernetes 介绍