kubelet Pod 的状态分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubelet Pod 的状态分析相关的知识,希望对你有一定的参考价值。

参考技术A pod从创建到最后的创建成功会分别处于不同的阶段,在源码中用PodPhase来表示不同的阶段:

一个pod的完整创建,通常会伴随着各种事件的产生,k8s种事件的种类总共只有4种:

PodStatus 有一组PodConditions。 PodCondition中的ConditionStatus,它代表了当前pod是否处于某一个阶段(PodScheduled,Ready,Initialized,Unschedulable),“true” 表示处于,“false”表示不处于。

容器的状态:

举一个例子来说明一下情况

kubectl apply -f busybox.yaml

1. 写入数据到etcd

2. 开始被调度,但是还未调度到具体node上,请注意:PodScheduled的status=“true”

3.  被调度到了具体的node上hostip绑定了,并且被所有初始化容器已经启动完毕(注意busybox.yaml中pod没有指定init container,所以这里很快就被设置成true),被调度到的节点watch到并开始创建容器(此阶段是在拉去镜像)然后创建容器 ,而此时Ready的status是false,仔细看会发现,containerStatus的状态为waiting

4. 容器创建成功,Ready的status=“true”,此时容器的status也为running,这个时候,对应的pod的PodPhase也应该为running

CrashLoopBackOff: 容器退出,kubelet正在将它重启

InvalidImageName: 无法解析镜像名称

ImageInspectError: 无法校验镜像

ErrImageNeverPull: 策略禁止拉取镜像

ImagePullBackOff: 正在重试拉取

RegistryUnavailable: 连接不到镜像中心

ErrImagePull: 通用的拉取镜像出错

CreateContainerConfigError: 不能创建kubelet使用的容器配置

CreateContainerError: 创建容器失败

m.internalLifecycle.PreStartContainer  执行hook报错

RunContainerError: 启动容器失败

PostStartHookError: 执行hook报错

ContainersNotInitialized: 容器没有初始化完毕

ContainersNotReady: 容器没有准备完毕

ContainerCreating:容器创建中

PodInitializing:pod 初始化中

DockerDaemonNotReady:docker还没有完全启动

NetworkPluginNotReady: 网络插件还没有完全启动

pod健康检查(LivenessProbe和ReadinessProbe)

LivenessProbe:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,则kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”。

ReadinessProbe:用于判断容器是否启动完成(ready状态),可以接收请求。如果ReadinessProbe探针检测到失败,则Pod的状态被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。

LivenessProbe三种实现方式: 

未完待续

以上是关于kubelet Pod 的状态分析的主要内容,如果未能解决你的问题,请参考以下文章

kubelet 原理解析二:pleg

kubelet 的工作流程

[k8s] kubelet单组件启动静态pod

kubernetes之kubelet运行机制分析

Kubernetes如何管理pod更高可用

kubernetes控制器