一、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镜像拉取策略一般是针对Pod中单个容器的。