Pod状态描述
1 2 3 4 5 6 |
状态值 描述 Pending API Server已经创建该Pod,但在Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程。 Runnung Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态。 Succeeded Pod内所有容器均成功执行后退出,且不会再重启。 Failed Pod内所有容器均已退出,但至少有一个容器退出为失败状态。 Unknown 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致。 |
状态列为 STATUS
1 2 3 4 |
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.编写配置清单
1 2 3 4 5 6 7 8 9 10 |
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
1 2 |
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
1 2 3 4 5 6 7 |
#找到相应的容器 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上会发现以下过程
1 2 3 4 5 6 7 8 9 |
#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
,我们这属于正常退出,退出后则不会再次启动容器。
1 2 3 4 5 6 7 8 9 10 11 |
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状态
1 2 |
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上停止此容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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> |