首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes Pod 删除的优先级机制

Kubernetes Pod 删除的优先级机制

作者头像
用户11081884
发布2026-07-20 18:42:40
发布2026-07-20 18:42:40
180
举报

Kubernetes 集群中,当需要缩减工作负载(如 Deployment)时,Kubernetes 并不是随机选择要删除的 Pod,而是遵循一套精心设计的排序算法来决定删除顺序。本文将深入解析这套优先级机制的原理,并提供实际应用示例。

一、内置删除顺序算法

ReplicaSet 控制器在缩容时,会对候选 Pod 按以下 8 条规则逐级比较;只要某一级别能区分顺序,就不再继续向后比较:

1、调度状态:未调度spec.nodeName 为空)的 Pod 优先于已调度的 Pod

2、Pod 阶段Pending < Unknown < Running

3、就绪状态:未就绪(Ready=FalseReady 条件不存在)的 Pod 优先于已就绪的 Pod

4、删除成本controller.kubernetes.io/pod-deletion-cost 值较小的优先。

5、节点分布:同节点上属于同一 ReplicaSetPod 数量越多,越优先删除(打散分布)。

6、就绪时长:就绪时间越短(最近一次 Ready=True 的时长)越优先。

7、重启次数:容器重启次数之和越多越优先。

8、创建时间:创建时间戳越新越优先。

若以上规则仍完全相同,则按 Pod UUID 的字母序排列,保证确定性。

注意:

  • 规则 1–3 旨在优先清理“不健康”或“未完成调度”的实例。
  • 规则 4 允许用户自定义权重,见下一节。
  • 规则 5 是官方“尽力把 Pod 打散到不同节点”策略的直接体现。

二、自定义删除优先级(pod-deletion-cost)

Kubernetes 1.22 起,controller.kubernetes.io/pod-deletion-cost 注解进入 Beta 并默认开启,可用于手动调整 Pod 的“保活权重”。

使用方式

Pod 模板或单独 Pod metadata.annotations 中加入:

代码语言:javascript
复制
controller.kubernetes.io/pod-deletion-cost: "100"
  • 取值范围:-2147483648 ~ 2147483647
  • 数值越小,越优先被删除;数值越大,越倾向于保留。

生产建议

1、金丝雀/灰度发布:给新版本 Pod 设置较高 cost(如 1000),缩容时优先下线旧版本。

2、节点维护:对需腾空节点上的 Pod 设置较低 cost(如 -100),加速驱逐。

3、成本优化:运行在昂贵 GPU 节点上的 Pod 设置高 cost,减少被缩容概率。

4、缓存/状态密集 Pod:给包含热缓存的 Pod 设置高 cost,避免频繁重建导致冷启动。

三、示例

1. 为 Deployment 模板统一设置 cost

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        controller.kubernetes.io/pod-deletion-cost: "100"
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80

说明:模板级注解会对该 Deployment 产生的所有 Pod 生效;后续滚动升级也会继承。

2. 为不同 Pod 设置差异化 cost(手动注入)

代码语言:javascript
复制
# 先运行 5 副本 Deployment(默认 cost=0)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: weighted-app
spec:
  replicas: 5
  selector:
    matchLabels:
      app: weighted-app
  template:
    metadata:
      labels:
        app: weighted-app
    spec:
      containers:
      - name: app
        image: my-app:latest
---
# 手动创建低 cost Pod,缩容时优先被删除
apiVersion: v1
kind: Pod
metadata:
  name: pod-low-cost
  labels:
    app: weighted-app        # 必须匹配上方 selector
  annotations:
    controller.kubernetes.io/pod-deletion-cost: "10"
spec:
  containers:
  - name: app
    image: my-app:latest
---
# 手动创建高 cost Pod,缩容时尽可能保留
apiVersion: v1
kind: Pod
metadata:
  name: pod-high-cost
  labels:
    app: weighted-app
  annotations:
    controller.kubernetes.io/pod-deletion-cost: "1000"
spec:
  containers:
  - name: app
    image: my-app:latest

验证步骤:

代码语言:javascript
复制
kubectl scale deploy weighted-app --replicas=3
# 观察 pod-low-cost 被优先删除,pod-high-cost 最后删除

KubernetesPod 删除优先级机制提供了精细的控制能力,在大规模集群中尤为重要。通过理解这些规则和合理使用 pod-deletion-cost 注解,可以更智能地管理集群资源,确保业务连续性和稳定性。

1、Kubernetes 内置 8 级排序算法,确保缩容过程可预测、可调试。

2、通过 pod-deletion-cost 注解,业务可在不改动控制器代码的前提下,灵活干预删除顺序。

3、合理使用该机制,可在金丝雀发布、节点维护、成本优化等场景显著降低业务中断风险。

如果你觉得这篇文章有用,欢迎关注、点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、自定义删除优先级(pod-deletion-cost)
    • 使用方式
    • 生产建议
  • 三、示例
    • 1. 为 Deployment 模板统一设置 cost
    • 2. 为不同 Pod 设置差异化 cost(手动注入)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档