Pod常见的状态和重启策略
常见的Pod状态
Pending
发生原因:
- Pod中的容器还没有全部创建完成。
排查建议:检查Pod依赖的存储是否有权限挂载、镜像是否可以下载等。 - 调度没有完成,没有任何一个节点能满足调度条件,已经创建了Pod 但是没有适合它运行的节点。
排查建议:Pod里是否设定了 nodeName 或者 nodeSelector;是否受污点和容忍度的影响等。
PodScheduled
Pod正处于调度中,在scheduler刚开始调度的时候,还没有将Pod分配到指定的Node,在筛选出合适的节点后就会更新etcd数据,将Pod分配到指定的Node
Unschedulable
Pod不能被调度, scheduler没有匹配到合适的Node节点
PodInitializing
pod 初始化中
ImagePullBackOff
发生原因:Pod所在的Node节点下载镜像失败
Initialized
所有Pod中的初始化容器已经完成了
Running
Pod内部的容器已经被创建并且启动。
Error
发生原因:Pod 启动过程中发生了错误
CrashLoopBackOff
发生原因:容器曾经启动了,但可能又异常退出了。
排查建议:先看Pod里的容器运行的服务是否正常。通过看Pod日志 "kubectl logs -f {pod名称} -n {pod的命名空间}"
Terminating
Pod 正在被销毁
Succeeded
Pod 中的所有容器都被成功终止,即Pod 里所有的容器均已terminated。
Failed
Pod 中的所有容器都已终止了,但至少有一个容器是因为失败终止。例如:容器以非0状态退出或者被系统终止。
Evicted
发生原因:出现这种情况,多见于系统内存或硬盘资源不足。
排查建议:可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。
Unknown
发生原因:通常是由于pod所在的node节点通信错误。pod是什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的。如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看Unknown。
Pod的重启策略
Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,当某个容器异常退出或者健康检查失败时,kubelet 将根据重启策略来进行相应的操作。
Pod 的 spec 字段中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。
策略解读:
- Always:只要容器异常退出,kubelet就会自动重启该容器。(这个是默认的重启策略)
- OnFailure(常用):当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
- Never:不论容器运行状态如何,kubelet都不会重启该容器。
使用Always重启策略
创建pod资源文件
bash
vim pod.yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
namespace: default
spec:
restartPolicy: Always # 设置Pod的重启策略
containers:
- name: tomcat-pod-java
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
创建资源
bash
kubectl apply -f pod.yaml
1)正常停止容器里的tomcat服务
进入容器
(ps. "-c tomcat-pod-java": 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)
bash
kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash
正常关闭服务
bash
/usr/local/tomcat/bin/shutdown.sh
查看pod状态
bash
kubectl get pods -w
发现正常停止容器里的tomcat服务,容器重启了一次,pod又恢复正常了
2)非正常停止容器里的tomcat服务
进入容器
bash
kubectl exec -it demo-pod -- /bin/bash
强行终止服务
bash
kill 1
查看pod状态
bash
kubectl get pods -w
上面可以看到容器终止了,并且又重启一次,重启次数增加了一次
使用Never重启策略
创建pod资源文件
bash
vim pod.yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
namespace: default
spec:
restartPolicy: Never # 设置Pod的重启策略
containers:
- name: tomcat-pod-java
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
创建资源
触发小提醒:没改镜像直接用apply无效。
bash
kubectl apply -f pod.yaml
需要执行2个命令,重启pod
bash
kubectl delete -f pod.yaml
kubectl create -f pod.yaml
1)正常停止容器里的tomcat服务
进入容器
(ps. "-c tomcat-pod-java": 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)
bash
kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash
正常关闭服务
bash
/usr/local/tomcat/bin/shutdown.sh
查看pod状态
bash
kubectl get pods -w
发现正常停止容器里的tomcat服务,pod正常运行,容器没有重启
2)非正常停止容器里的tomcat服务
进入容器
bash
kubectl exec -it demo-pod -- /bin/bash
强行终止服务
bash
kill 1
查看pod状态
bash
kubectl get pods -w
上面可以看到容器状态是error,并且没有重启,这说明重启策略是never,pod里容器服务无论如何终止,都不会重启
使用OnFailure重启策略(常用)
创建pod资源文件
bash
vim pod.yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
namespace: default
spec:
restartPolicy: OnFailure # 设置Pod的重启策略
containers:
- name: tomcat-pod-java
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
创建资源
bash
kubectl delete -f pod.yaml
kubectl create -f pod.yaml
1)正常停止容器里的tomcat服务
进入容器
(ps. "-c tomcat-pod-java": 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)
bash
kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash
正常关闭服务
bash
/usr/local/tomcat/bin/shutdown.sh
查看pod状态
bash
kubectl get pods -w
发现正常停止容器里的tomcat服务,退出码是0,pod里的容器不会重启
2)非正常停止容器里的tomcat服务
进入容器
bash
kubectl exec -it demo-pod -- /bin/bash
强行终止服务
bash
kill 1
查看pod状态
bash
kubectl get pods -w
上面可以看到非正常停止pod里的容器,容器退出码不是0,那就会重启容器