微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

一、Pod状态

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

Pod的状态:

状态值描述
PendingAPI Server已经创建该Pod,但Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程
RunningPod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
SucceededPod内所有容器均成功执行退出,且不会再重启
FailedPod内所有容器均已退出,但至少有一个容器退出为失败状态
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当前的状态发生事件AlwaysOnFailureNever
包含一个容器Running容器成功退出RunningSucceededSucceeded
包含一个容器Running容器失败退出RunningRunningFailed
包含两个容器Running1个容器失败退出RunningRunningRunning
包含两个容器Running容器被OOM杀掉RunningRunningFailed

四、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会认为容器已经无法提供服务,将会重启该容器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐