一、Pod常见状态与排查方法¶
参考链接: Pod生命周期
Pod 的 status 字段是一个 PodStatus 对象,其中包含一个 phase 字段。Pod 的phase 字段只有 Pending、Running、Succeeded、Failed、Unknown。
1.Pending(挂起)
(1)原因
Pod 已被 Kubernetes 系统接收,但仍有一个或多个容器未被创建。
(2)排查方法
可以通过kubectl describe 查看处于 Pending 状态的原因
$ k describe po xxx -n xxx
2.Running(运行中)
(1)原因
Pod 已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行状态,或者是正在启动或者重启。
(2)排查方法
可以通过kubectl logs 查看Pod日志
$ k logs xxx -n xxx
注意事项:Pod状态为Running,并不代表Pod正常,也需要READY为N/N
3.Succeeded(成功)
(1)原因
所有容器执行成功并终止,并且不会再次重启
(2)排查方法
可以通过kubectl logs 查看Pod日志
$ k logs xxx -n xxx
4.Failed(失败)
(1)原因
所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器 要么以非零状态退出,要么被系统终止
(2)排查方法
可以通过 kubectl logs 和 kubectl describe查看Pod日志和状态
$ k logs xxx -n xxx
$ k describe po xxx -n xxx
5.Unknown(未知)
(1)原因
通常是由于通信问题造成的无法获得 Pod 的状态
6.ImagePullBackOff ErrImagePull
(1)原因
镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的
(2)排查方法
可以通过 kubectl describe查看Pod日志和状态
$ k describe po xxx -n xxx
7.CrashLoopBackOff
(1)原因
容器启动失败,可以通过 logs 命令查看具体原因,一般为启动命令不正确,健康检查不通过,前台没有该进程等
8.OOMKilled
(1)原因
容器内存溢出,一般是容器的内存 Limit 设置的过小,或者程序本身有内存溢出
(2)排查方法
可以通过 kubectl logs查看Pod日志
$ k logs xxx -n xxx
9.Terminating
(1)原因
Pod 正在被删除
(2)排查方法
可以通过 kubectl describe查看具体原因
$ k describe po xxx -n xxx
10.SysctlForbidden
(1)原因
Pod 自定义了内核配置,但 kubelet 没有添加内核配置或配置的内核参数不支持
(2)排查方法
可以通过 kubectl describe查看具体原因
$ k describe po xxx -n xxx
11.Completed
(1)原因
容器内部主进程退出,一般计划任务执行结束会显示该状态
(2)排查方法
可以通过 kubectl logs查看Pod日志
$ k logs xxx -n xxx
12.ContainerCreating
(1)原因
Pod 正在创建,一般为正在下载镜像,或者有配置不当的地方
(2)排查方法
可以通过 kubectl describe查看具体原因
$ k describe po xxx -n xxx
二、Pod镜像拉取策略¶
参考链接:镜像
当你最初创建一个 Deployment、 StatefulSet、Pod 或者其他包含 Pod 模板的对象时,如果没有显式设定的话, Pod 中所有容器的默认镜像拉取策略是 IfNotPresent。这一策略会使得 kubelet在镜像已经存在的情况下直接略过拉取镜像的操作。
目前支持的策略如下:
| 操作方式 | 说明 |
|---|---|
| Always | 总是拉取,当镜像 tag 为 latest 或没有指定标签时,且 imagePullPolicy 未配置,默认为 Always |
| Never | 不管是否存在都不会拉取,如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。 |
| IfNotPresent | 镜像不存在时拉取镜像,如果 tag 为非 latest,且 imagePullPolicy 未配置,默认为 IfNotPresent |
如果想查看镜像拉取情况,可以通过 kubectl describe查看具体情况
$ k describe po xxx -n xxx
如果想指定镜像的拉取策略,可以通过 spec.containers[].imagePullPolicy 参数来实现。下面以设置镜像策略Always为例来说明
1.编写yaml文件
$ vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
ports:
- containerPort: 80
imagePullPolicy: Always
2.使用该yaml文件创建pod
$ k create -f nginx.yml
3.查看镜像拉取情况
$ k describe po nginx

小结:
- 如果yaml文件中拉取的镜像标签是latest或未指定标签,此时默认镜像拉取策略为Always
- 如果yaml文件中拉取的镜像标签是指定版本标签,此时默认镜像拉取策略为IfNotPresent
三、Pod重启策略¶
参考链接:容器重启策略
Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。
| 操作方式 | 说明 |
|---|---|
| Always | 默认策略。容器失效时,自动重启该容器 |
| OnFailure | 容器以不为 0 的状态码终止,自动重启该容器 |
| Never | 无论何种状态,都不会重启 |
restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时,kubelet 会按指数回退方式计算重启的延迟(10s、20s、40s、...),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行重置操作。
如果想查看镜像拉取情况,可以通过 kubectl get查看具体情况
$ kubectl get po xxx -oyaml -n xxx
如果想指定容器的拉取策略,可以通过 spec.restartPolicy 参数来实现。下面以设置镜像策略OnFailure为例来说明
1.编写yaml文件
$ vim nginx01.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
ports:
- containerPort: 80
command: ["sleep","4"]
imagePullPolicy: Always
restartPolicy: OnFailure
2.使用该yaml文件创建pod
$ k create -f nginx01.yml
3.查看pod
$ k get -f nginx01.yml
NAME READY STATUS RESTARTS AGE
nginx 0/1 Completed 0 52s
4.查看Pod重启策略
$ k get -f nginx01.yml -oyaml

总结:Pod重启策略是针对Pod里的所有容器,Pod镜像拉取策略一般是针对Pod中单个容器的。