K8S之Pod常见的状态和重启策略

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,那就会重启容器

相关推荐
chuanauc7 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉7 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信7 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记7 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花7 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay7 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu7 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记12 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样16 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家17 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook