Kubernetes


Pod的restartPolicy和自动重启container的机制是什么?

一 pod的restartPolicy

我们都知道,相较于纯container而言,pod管理的container如果出现故障、错误的话,Kubernetes会自动重启pod管理的container。那么,pod是怎么实现重启container的呢?

答案是通过一个字段:restartPolicy。注意,该字段是设置在pod级别的,意味着该pod管理的所有container都受该参数影响。

1 restartPolicy该字段有3种取值:

  • Always:每次都重启container,不管容器进程退出代码是什么;该值是默认值。
  • OnFailure:只有container出现故障,即容器进程退出代码非0的情况下,pod会重启container;
  • Never:即使container process出现故障,也不重启container;

2 如何查看pod的restartPolicy字段

通过从Kubernetes API Server 获取pod的yaml来查询。具体就不举例了,kubectl get pod pod_name -o yaml;从命令结果中查看restartPolicy字段就可以了。

[root@master-node ~]# kubectl get pods
NAME                       READY   STATUS             RESTARTS        AGE
curl                       0/1     CrashLoopBackOff   8 (3m15s ago)   12d
curl-with-ambassador       2/2     Running            0               35d
downward                   1/1     Running            0               35d
fortune-configmap-volume   2/2     Running            0               43d
fortune-https              2/2     Running            0               42d
kiada-init                 2/2     Running            0               5h54m
kiada-ssl                  2/2     Running            9 (3h44m ago)   5h3m
my-job-jfhz9               0/1     Completed          0               12d
[root@master-node ~]# kubectl get pod my-job-jfhz9 -oyaml|grep restartPolicy
  restartPolicy: OnFailure
[root@master-node ~]# kubectl get pod curl -oyaml|grep restartPolicy
  restartPolicy: Always
[root@master-node ~]# 

其中,my-job-jfhz9是1个job类型的pod。其restartPolicy = OnFailure很好理解,只有当这个job执行失败了,即container process的退出代码是非0的情况下,pod才会重启该container。否则,该job执行成功,container process退出代码是0的情况下,pod就不重启该container。这也符合job类型pod特征。

二 pod重启container的机制

1 机制

当pod中的container

第1次出现故障时,pod会等待10秒重启该container;

如果出现第2次故障,pod会等待20秒,再去重启该container;

如果出现第3次故障,pod会等待40秒,再去重启该container;

如果出现第4次故障,pod会等待80秒,再去重启该container;

如果出现第5次故障,pod会等待160秒,再去重启该container;

如果出现第6次故障,pod会等待5分钟,再去重启该container;

接下来,如果继续出现故障,则每次间隔等待5分钟之后,再去重启container

pod重启container间隔10s、20s、40s、80s、160s、5m…5m

反之,如果出现故障(不管它是第几次出现故障)的container被pod重启之后,成功运行了超过10分钟。那么,下一次该container再次出现故障之后,pod将会立即重启该container,它重启container的时间间隔被重置了。

2 实验验证pod重启container机制

如果,启动1个pod之后,获取该pod中的container id和pod所在node IP之后,通过到pod所在节点上,手工执行docker stop docker_id;观察pod重启container机制。通过kubectl get pod pod_name -oyaml;可以依次看到类似下述信息。

state:
      waiting:
        message: back-off 10s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161
  
started: false
    state:
      waiting:
        message: back-off 20s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161  
​
state:
      waiting:
        message: back-off 40s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161
    
​
state:
      waiting:
        message: back-off 1m20s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161
  phase: Running
  
state:
      waiting:
        message: back-off 2m40s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161    
  
state:
      waiting:
        message: back-off 5m0s restarting failed container=main pod=curl_default(6ce37a07-b540-49e7-a945-01cf58e58895)
        reason: CrashLoopBackOff
  hostIP: 172.16.11.161

三小结和参考

Kubernetes作为容器编排系统,把container封装到pod中之后,通过pod的restartPolicy字段来控制container的重启策略,内部则是有一套设定的时间间隔来控制何时重启container。

《Kubernetes in Action Second Edition》 Marko luksa

Chapter 06 managing the lifecycle of the Pod’s containers P148–P152.

延伸阅读:

如何查看和分析Kubernetes中podphase、conditions?它们有什么作用?

Pod中container的状态小结

留言