K8s核心资源对象-Pod(状态以及原地升级)
K8s核心资源对象-Pod(状态以及原地升级)
基于1.25
Pod的PodStatus
// PodStatus represents information about the status of a pod. Status may trail the actual |
Pod的阶段
- Pending:Pod已经被K8s接受,但是容器还没有被创建
- Running:Pod已经绑定到一个节点上,所有的容器已经创建。至少有一个容器在运行,或者启动或重启
- Succeeded:成功结束,Pod中所有容器结束,不会重启
- Failed:Pod所有容器终止,至少有一个容器失败,容器以非0退出或者系统终止
容器的状态
K8s会跟踪Pod中每一个容器的状态
- Waiting:等待,处于Waiting 依旧在运行它启动的条件
- 可能在拉取容器,查看Reason 字段,可以查看当前的状态的原因
- Running:运行中,容器正常运行中
- 如果设置了postStart回调,可以观测到回调已经执行
- Terminated:已终止,执行已经结束
- 如果设置了preStop,在进入Terminated之前,运行
Pod的状态
PodCondition表示Pod的状态
ContainersReady:表示容器已经就绪,可以开始提供服务
PodInitialized:POd初始化已经完成,比如Pod容器镜像、网络和存储卷资源
PodReady:表示Pod已经就绪,可以接受流量
PodScheduled:表示Pod已经被K8s绑定在节点上
AlphaNoCompatGuaranteeDisruptionTarget:表示Pod可以容忍故障,即当需要维护宿主机或者调用框架选择容器,Pod可以容忍部分或者整个Pod丢失
-
// These are valid conditions of pod.
const (
// PodScheduled represents status of the scheduling process for this pod.
PodScheduled PodConditionType = "PodScheduled"
// PodReady means the pod is able to service requests and should be added to the
// load balancing pools of all matching services.
PodReady PodConditionType = "Ready"
// PodInitialized means that all init containers in the pod have started successfully.
PodInitialized PodConditionType = "Initialized"
// PodReasonUnschedulable reason in PodScheduled PodCondition means that the scheduler
// can't schedule the pod right now, for example due to insufficient resources in the cluster.
PodReasonUnschedulable = "Unschedulable"
// ContainersReady indicates whether all containers in the pod are ready.
ContainersReady PodConditionType = "ContainersReady"
// AlphaNoCompatGuaranteeDisruptionTarget indicates the pod is about to be deleted due to a
// disruption (such as preemption, eviction API or garbage-collection).
// The constant is to be renamed once the name is accepted within the KEP-3329.
AlphaNoCompatGuaranteeDisruptionTarget PodConditionType = "DisruptionTarget"
)
生成Pod的状态
// generateAPIPodStatus creates the final API pod status for a pod, given the |
原地升级(In-place Update)
为什么需要原地升级
- Pod处理的负载显著增大,资源不够
- 负载小,分配的资源没有合理利用
- 资源分配不合理
OpenKruise
开源项目OpenKruise支持K8s拓展的AdvanceStatefulSet、CloneSet、SidecarSet的原地升级。需要把updateStragegy的type类型转换为俩种类型之一:
- InPlaceIfPossible:如果可能,控制器尝试原地更新Pod,而不是重新创建Pod
- 目前只有
spec.template.spec.container[x].image
支持原地升级
- 目前只有
- InPlaceOnly:原地升级,不能修改
spec.tamplate
和spec.template.spec.container[x].image
外的任何字段
updateStragegy默认值ReCreate,必须显示的设置才能原地升级
API变更
Pod.Spec.Containers.Resoures
:变成纯粹的声明,表示Pod的期望Pod.Status.ContainersStatuses[i].ResourceAllocated
:(新字段,v1.ResourceList)表示分配给Pod以其容器的Node资源Pod.Status.ContainersStatuses[i].Resource
:(新字段,v1.Resource requirement)表示Pod以及容器持有的实际资源Pod.Status.Resize
:(新字段,map[string]string)类型,显示给定容器的给定资源情况
容器调整策略
ResizePlicy支持以下策略:
- RestartNotRequired:默认值,如果可能不重启情况下调整大小
- 不保证容器不重启
- 可能导致容器终止
- Restart:容器需要重启才能应用新资源
调整状态
新增Pod.Status.Resize[]是新增的一个字段,表示了kubelete是否接受或者拒绝了对给定资源的建议调整操作。
- 当
Pod.Spec.Containers[i].Resource.Request
字段和Pod.Status.Containers[i].Resources
字段不相同的时候,这个字段解释原因
这个字段可设置以下值:
- Proposed:建议调整的大小,还没有被接受或者拒绝
- InProgress:建议调整的大小进行进行,已经被接受
- Deferred:延迟,理论可行,但是不是选择执行,需要重新评估
- Infeaible:不可行,被拒绝了
- (no value):不建议调整大小
CRI变化
kubelete调用UpdateContainerResource
调整资源配额,目前此采用runtimeapi.LinuxContainerResources
,适用于Docker和Kata,不适用于Windows。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论