K8S之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资源文件

vim pod.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

创建资源

kubectl apply -f pod.yaml

1)正常停止容器里的tomcat服务
进入容器
(ps. “-c tomcat-pod-java”: 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)

kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash

正常关闭服务

/usr/local/tomcat/bin/shutdown.sh

在这里插入图片描述

查看pod状态

kubectl get pods -w

在这里插入图片描述

发现正常停止容器里的tomcat服务,容器重启了一次,pod又恢复正常了

2)非正常停止容器里的tomcat服务
进入容器

kubectl exec -it demo-pod -- /bin/bash

强行终止服务

kill 1

查看pod状态

kubectl get pods -w

在这里插入图片描述

上面可以看到容器终止了,并且又重启一次,重启次数增加了一次

使用Never重启策略

创建pod资源文件

vim pod.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无效。

kubectl apply -f pod.yaml

需要执行2个命令,重启pod

kubectl delete -f pod.yaml

kubectl create -f pod.yaml

在这里插入图片描述

1)正常停止容器里的tomcat服务
进入容器
(ps. “-c tomcat-pod-java”: 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)

kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash

正常关闭服务

/usr/local/tomcat/bin/shutdown.sh

查看pod状态

kubectl get pods -w

在这里插入图片描述

发现正常停止容器里的tomcat服务,pod正常运行,容器没有重启

2)非正常停止容器里的tomcat服务
进入容器

kubectl exec -it demo-pod -- /bin/bash

强行终止服务

kill 1

查看pod状态

kubectl get pods -w

在这里插入图片描述

上面可以看到容器状态是error,并且没有重启,这说明重启策略是never,pod里容器服务无论如何终止,都不会重启

使用OnFailure重启策略(常用)

创建pod资源文件

vim pod.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

创建资源

kubectl delete -f pod.yaml

kubectl create -f pod.yaml

1)正常停止容器里的tomcat服务
进入容器
(ps. “-c tomcat-pod-java”: 指定进入pod里的哪个容器内,如果pod里只有一个容器可不写 -c)

kubectl exec -it demo-pod -c tomcat-pod-java -- /bin/bash

正常关闭服务

/usr/local/tomcat/bin/shutdown.sh

查看pod状态

kubectl get pods -w

在这里插入图片描述

发现正常停止容器里的tomcat服务,退出码是0,pod里的容器不会重启

2)非正常停止容器里的tomcat服务
进入容器

kubectl exec -it demo-pod -- /bin/bash

强行终止服务

kill 1

查看pod状态

kubectl get pods -w

在这里插入图片描述

上面可以看到非正常停止pod里的容器,容器退出码不是0,那就会重启容器

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K8s中的Pod控制器是用来管理和控制Pod的一种机制。Pod控制器负责创建、启动、停止、重启和删除Pod,以及监控和调节Pod状态Pod和Controller之间是通过label标签来建立关系,Controller又被称为控制器工作负载。Pod控制器可以根据需要创建多个Pod实例,以满足应用程序的需求。 常见Pod控制器包括Deployment、ReplicaSet、StatefulSet和DaemonSet等。Deployment控制器是K8s中最常用和最重要的Pod控制器之一。它通过创建和管理ReplicaSet来实现对Pod的控制。Deployment控制器可以定义应用的副本数、升级和回滚策略,以及弹性伸缩等功能。通过使用Deployment控制器,可以方便地部署和管理应用程序。 在使用K8s时,可以使用yaml文件来定义Pod控制器的配置和参数。通过指定不同的字段和数值,可以实现对Pod控制器的定制化配置。例如,可以在yaml文件中指定应用程序的镜像、资源需求、副本数等信息。 总结来说,K8s中的Pod控制器是用来管理和控制Pod的机制,通过label标签与Pod建立关系。常见Pod控制器包括Deployment、ReplicaSet、StatefulSet和DaemonSet。使用yaml文件可以对Pod控制器进行配置和定制化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [k8s技术交流,包括Pod概念和特点Pod种类Pod镜像拉取策略Pod重启策略Pod控制器Pod探针、Pod调度](https://download.csdn.net/download/lingmeng447/85358750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【k8s】6、pod控制器](https://blog.csdn.net/hancoder/article/details/118064163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值