Pod的restartPolicy和自动重启container的机制是什么?
Contents
一 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.
延伸阅读: