目录
前言
PodStatus对象
pod 的 phase 字段
phase 作用
有哪些 phase
pod 的 conditions 字段
pod 有了 phase,为什么还要有 conditions
pod 的 conditions 的作用
pod 的 conditions 分类
conditions设计原则
condition字段内容
Kubernetes 中, pod 从创建到成功运行会分别处于不同的阶段,每个阶段又分为不同的状态,本文将简单介绍这个环节。
在 K8S 源码中,使用了 PodPhase 这个变量定义这几个阶段信息,如下图所示:
实际上还有一中状态Terminating,在代码和文档中都没有说明,但却是存在。这种情况出现杂无法获取所在主机的资源情况,一直在尝试建立连接。
Pod 有一个 PodStatus 对象,其中包含一个 PodConditions 数组。Pod 可能通过也可能未通过其中的一些状况测试。
用于描述、查看、分析 pod 当前处于什么状态。
通常情况下,在 pod 的生命周期中,每个 pod 会处于 5 个不同的 phase:pending,running,succeed,failed,unknown。同一时间,1 个 pod 只能处于 1 个 phase。
因为 pod 的 phase 比较简单的描述了 pod 处于哪个具体情况,但是没有明确说明具体原因。
用于描述 1 个 pod 当前是否处于哪个 phase,以及处于该 phase 的原因。及作为一个辅助手段,详细的展示 pod 的状态信息,用于问题排查分析时提供更多依据。同一时间,1 个 pod 可能处于多个 conditions。
Pod 的 conditions 表示了 Pod 的一些条件,是一个数组。pod的 conditions 状况默认有4个,它是由Pod controller生成,里面包含一些 Pod 必须满足的条件,只有所有的条件为 True 时,Pod 才可以提供服务。
通常分为 4 个 conditions:PodScheduled,Initialized,ContainersReady,Ready。见名知意:
Pod Lifecycle | KubernetesThis page describes the lifecycle of a Pod. Pods follow a defined lifecycle, starting in the Pending phase, moving through Running if at least one of its primary containers starts OK, and then through either the Succeeded or Failed phases depending on whether any container in the Pod terminated in failure.Whilst a Pod is running, the kubelet is able to restart containers to handle some kind of faults. Within a Pod, Kubernetes tracks different container states and determines what action to take to make the Pod healthy again.https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions
conditions
寄居于资源对象的status
字段中,与status
其他字段值一样都用来表示资源的状态。 不过conditions
的设计初衷是提供一种通用的数据结构表示资源的状态,它通常能够提供比status
其他字段更详细的信息(比如状态切换时间、更新时间),conditions
实际上是一种扩展机制,外部监控程序可以根据conditions
无差别地监控各种资源的状态,而不必过分关注资源对象status
中的其他信息。
通常status.conditions
字段类型为切片,切片中的每个元素表示资源的某个状态,该状态由特定的控制器更新,比如Deployment
控制器会更新deployment
对象的status.conditions
信息。conditions
作为扩展机制,它还支持第三方控制器增加新的状态。通常status.conditions
中的信息由控制器根据资源的status
其他字段计算出来。
通常一个condition
必须包含type
(状态类型)和status
(状态值)两个信息。在Kubernetes
v1.19版之前,关于condition
并没有统一的标准,导致众多API都自行定义了condition
。比如:
type DeploymentCondition struct
;type PodCondition struct
;庆幸的是,在Kubernetes
v1.19版本社区提供了一个标准的condition
类型定义,由于兼容性考虑,Kubernetes
既有的API不一定能采用这一标准类型,但对于后续新增的API将会使用这一标准类型,并且笔者建议用户设计的CRD扩展也应使用这一标准类型。
标准的condition
类型定义如下所示:
type ConditionStatus string
const (
ConditionTrue ConditionStatus = "True"
ConditionFalse ConditionStatus = "False"
ConditionUnknown ConditionStatus = "Unknown"
)
type Condition struct {
// 类型(使用驼峰风格),如”Available“。
Type string
// 状态(枚举值:”True“、”False“和”Unknown“)。
Status ConditionStatus
// 观察到的generation。
// 如果ObservedGeneration 比metada.generation小,说明不是最新状态。
// +optional
ObservedGeneration int64
// 上次变化时间
LastTransitionTime Time
// 状态变化原因(使用驼峰风格),如”NewReplicaSetAvailable“
Reason string
// 描述信息,如”Deployment has minimum availability“
Message string `json:"message" protobuf:"bytes,6,opt,name=message"`
}