26. Kubernetes深入Pod-Pod重启策略

释放双眼,带上耳机,听听看~!

官方文档:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy

Pod状态描述

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

状态列为 STATUS

k8sops@k8s-master01:~$ kubectl get pods -o wide -n nginx-ns
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod-demo-nginx     1/1     Running   1          14d   10.244.2.15   k8s-node02   <none>           <none>
pod-demo-nginx02   2/2     Running   15         14d   10.244.2.18   k8s-node02   <none>           <none>

Pod重启策略(RestartPolicy)

Pod重启策略使用的参数为restartPolicy,字段有三个可选值:

  • Always:当容器终止退出后,总是重启容器,默认策略(适用于绝大多数需要24小时不间断运行的应用)
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。适于job(适用于一次性计划任务或者批处理任务,当进行计划任务或者批处理的跑失败的时候,在linux中会异常退出,这个时候才会重启容器,然后重新跑计划任务,如果计划任务成功,则返回0,正常退出,正常退出后则不在启动容器,符合预期,linux中正常运行返回0,异常退出返回非0,)
  • Never:当容器终止退出,从不重启容器。适于job(让无论是正常退出还是异常退出都不重启容器,一般用的比较少)

Pod Always重启策略示例

1.编写配置清单

cat restart_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: restart-pod
spec:
  containers:
  - name: restart-containers
    image: nginx:latest
  restartPolicy: Always

2.创建一个Pod资源

kubectl apply -f restart_pod.yaml

3.找到pod所运行的Node

kubectl get pods -o wide | grep restart-pod
restart-pod                         1/1     Running            1          5m58s   10.244.5.34   k8s-node03   <none>           <none>

4.到相应的Node上给结束掉这个Pod,不能在master上使用 kubectl delete pods/restart-pod 来介绍,因为这样会删掉Pod

#找到相应的容器
root@k8s-node03:~# docker ps | grep restart
32c70e9b113e        nginx                                               "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes                           k8s_restart-containers_restart-pod_default_c6ba7906-d5a7-47f8-b523-2a4ecddbc552_1
ea7e9d98da19        registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 13 minutes ago      Up 13 minutes                           k8s_POD_restart-pod_default_c6ba7906-d5a7-47f8-b523-2a4ecddbc552_0

#根据容器ID Stop掉容器
root@k8s-node03:~# docker stop 32c70e9b113e
32c70e9b113e

5.然后到master上会发现以下过程

#Pod已完成工作
k8sops@k8s-master01:~/manifests/pod$ kubectl get pods -o wide | grep restart-pod
restart-pod                         0/1     Completed          2          14m     10.244.5.34   k8s-node03   <none>           <none>

#Pod等待中
k8sops@k8s-master01:~/manifests/pod$ kubectl get pods -o wide | grep restart-pod
restart-pod                         0/1     CrashLoopBackOff   2          15m     10.244.5.34   k8s-node03   <none>           <none>

#Pod已经正常再次运行起来
k8sops@k8s-master01:~/manifests/pod$ kubectl get pods -o wide | grep restart-pod
restart-pod                         1/1     Running            3          15m     10.244.5.34   k8s-node03   <none>           <none>

6.通过 kubectl describe 命令查看更详细的事件信息

Pod OnFailure重启策略示例

1.编写资源配置清单
以下运行了一个Pod,容器镜像为centos,在容器中运行一个脚本,在/data/hello文件中写入数字1-300,每隔一秒写一个数字,写完后脚本执行结束,则退出容器(需要300秒,5分钟),重启策略使用 OnFailure,我们这属于正常退出,退出后则不会再次启动容器。

cat restart_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: restart-pod
spec:
  containers:
  - name: restart-containers
    image: centos:centos7.6.1810
    command:  [ "/bin/bash", "-ce", "for i in {1..300};do echo $i >> /hello;sleep 1;done" ]
  restartPolicy: OnFailure

2.创建资源对象

kubectl apply -f restart_pod.yaml

3.查看Pod状态

kubectl get pods -o wide | grep restart-pod
restart-pod                         1/1     Running            0          11s     10.244.2.28   k8s-node02   <none>           <none>

4.进入容器

kubectl exec -it pods/restart-pod -- /bin/bash

5.查看容器执行脚本进程

6.容器停止
当等待到5分钟,容器将脚本执行完成后,则退出容器,Pod状态也变为了 "Completed完成" 状态

因为我们使用的重启策略是OnFailure,我们的容器也属于正常退出,所以不会再去自动启动此容器

7.测试异常退出
再次创建此Pod,然后到指定的Node上停止此容器

kubectl apply -f restart_pod.yaml

#restart-pod容器被调度到了node2上
kubectl get pods -o wide | grep restart-pod
restart-pod                         1/1     Running            0          26s     10.244.2.29   k8s-node02   <none>           <none>

#来到node2上手动停止此容器
root@k8s-node02:~# docker ps | grep restart
5943923ce8ab        f1cb7c7d58b7                                        "/bin/bash -ce 'for …"   56 seconds ago      Up 55 seconds                           k8s_restart-containers_restart-pod_default_ae58b877-36b7-49da-b984-1d7f2a9e42da_0
1fc5c7dcc18d        registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 58 seconds ago      Up 56 seconds                           k8s_POD_restart-pod_default_ae58b877-36b7-49da-b984-1d7f2a9e42da_0
root@k8s-node02:~# docker stop 5943923ce8ab
5943923ce8ab

#再回到master上观察restart-pod状态,可以看到下面第一次看pod状态,已经为错误状态,紧接着再看一次Pod已经被重新启动起来,这就是被异常退出后通过OnFailure策略拉起来的Pod
k8sops@k8s-master01:~/manifests/pod$ kubectl get pods -o wide | grep restart-pod
restart-pod                         0/1     Error              0          81s     10.244.2.29   k8s-node02   <none>           <none>

k8sops@k8s-master01:~/manifests/pod$ kubectl get pods -o wide | grep restart-pod
restart-pod                         1/1     Running            1          84s     10.244.2.29   k8s-node02   <none>           <none>
Ops工具

25. Kubernetes深入Pod-Pod健康检查

2020-6-16 11:43:25

Ops工具

27. Kubernetes深入Pod-Pod调度策略

2020-6-16 11:43:39

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索