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

相关推荐
碣石潇湘无限路1 小时前
【云原生】Kubernetes CEL 速查表
容器·贪心算法·kubernetes
阿里云云原生1 小时前
大模型 Token 的消耗可能是一笔糊涂账
云原生
mingyuewu3 小时前
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
macos·docker·容器
企鹅侠客5 小时前
Prometheus operator怎么添加targets和告警规则
运维·云原生·kubernetes·prometheus·pod
专注代码七年6 小时前
Docker运维篇
运维·docker·容器
一杯敬朝阳 一杯敬月光7 小时前
WIN11 企业版 部署Dify+Docker
运维·docker·容器
Leo Han7 小时前
k8s常用命令(持续更新中)
docker·容器·kubernetes
KubeSphere 云原生7 小时前
云原生周刊:Kubernetes v1.33 要来了
云原生·容器·kubernetes
孔令飞8 小时前
关于 LLMOPS 的一些粗浅思考
人工智能·云原生·go