1、概述
在上一篇文章中,一旦容器探测出现了问题,kubernetes就会对容器所在的Pod进行重启,其实这是由pod的重启策略决定的,pod的重启策略有 3 种,分别如下:
重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长以此为10s、20s、40s、80s、160s和300s,300s是最大延迟时长。
2、容器重启策略实例
创建pod-restartpolicy.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-restartpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
httpGet:
scheme: HTTP
port: 80
path: /hello # 存活性探针检测此地址时由于/hello 不存在导致容器重启
restartPolicy: Never # 设置重启策略为Never
实例操作效果
#创建pod
[root@k8s-master ~]# kubectl apply -f pod-restartpolicy.yaml
pod/pod-restartpolicy created
#获取pod
[root@k8s-master ~]# kubectl get pod -n dev -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-restartpolicy 0/1 ContainerCreating 0 9s <none> k8s-node2 <none> <none>
[root@k8s-master ~]# kubectl get pod -n dev -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-restartpolicy 1/1 Running 0 29s 172.17.169.143 k8s-node2 <none> <none>
#查看pod详情 可以看出倒数第二步访问http 404 最后 容器终止
[root@k8s-master ~]# kubectl describe pod pod-restartpolicy -n dev
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 45s default-scheduler Successfully assigned dev/pod-restartpolicy to k8s-node2
Normal Pulling 44s kubelet Pulling image "nginx"
Normal Pulled 29s kubelet Successfully pulled image "nginx" in 15.467788602s
Normal Created 29s kubelet Created container nginx
Normal Started 29s kubelet Started container nginx
Warning Unhealthy 5s (x3 over 25s) kubelet Liveness probe failed: HTTP probe failed with statuscode: 404
Normal Killing 5s kubelet Stopping container nginx
#等几秒钟再查看pod状态变为 Completed(已完成)
[root@k8s-master ~]# kubectl get pod -n dev -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-restartpolicy 0/1 Completed 0 54s 172.17.169.143 k8s-node2 <none> <none>
至此我们就能看出容器重启策略的重要性。
3、总和
因为重启策略默认的就是Always,这也是合理的,因此在一般情况下,重启策略不需要设置,这里仅仅是作为知识点拿出来展示一下,在实际使用中,在大多数情况下都不需要进行重启策略配置。
Pod 的重启策略与控制方式息息相关,当前可用于管理Pod 的控制器包括ReplicationController ,Job,DaemonSet,还可以通过kubelet 管理(静态Pod)。
每种控制器对Pod 的重启策略要求如下:
(1)RC和DaemonSet : 必须设置为Always,需要保证该容器持续运行。
(2)Job : OnFailure 或 Never,确保容器执行完成后不再重启。
(3)kubelet : 在Pod 失效时自动重启它,不论将RestartPolicy 设置为什么值,也不会对Pod进行健康检查。