
在 Kubernetes 集群中,当需要缩减工作负载(如 Deployment)时,Kubernetes 并不是随机选择要删除的 Pod,而是遵循一套精心设计的排序算法来决定删除顺序。本文将深入解析这套优先级机制的原理,并提供实际应用示例。
一、内置删除顺序算法
ReplicaSet 控制器在缩容时,会对候选 Pod 按以下 8 条规则逐级比较;只要某一级别能区分顺序,就不再继续向后比较:
1、调度状态:未调度(spec.nodeName 为空)的 Pod 优先于已调度的 Pod。
2、Pod 阶段:Pending < Unknown < Running。
3、就绪状态:未就绪(Ready=False 或 Ready 条件不存在)的 Pod 优先于已就绪的 Pod。
4、删除成本:controller.kubernetes.io/pod-deletion-cost 值较小的优先。
5、节点分布:同节点上属于同一 ReplicaSet 的 Pod 数量越多,越优先删除(打散分布)。
6、就绪时长:就绪时间越短(最近一次 Ready=True 的时长)越优先。
7、重启次数:容器重启次数之和越多越优先。
8、创建时间:创建时间戳越新越优先。
若以上规则仍完全相同,则按 Pod UUID 的字母序排列,保证确定性。
注意:
从 Kubernetes 1.22 起,controller.kubernetes.io/pod-deletion-cost 注解进入 Beta 并默认开启,可用于手动调整 Pod 的“保活权重”。
在 Pod 模板或单独 Pod 的 metadata.annotations 中加入:
controller.kubernetes.io/pod-deletion-cost: "100"1、金丝雀/灰度发布:给新版本 Pod 设置较高 cost(如 1000),缩容时优先下线旧版本。
2、节点维护:对需腾空节点上的 Pod 设置较低 cost(如 -100),加速驱逐。
3、成本优化:运行在昂贵 GPU 节点上的 Pod 设置高 cost,减少被缩容概率。
4、缓存/状态密集 Pod:给包含热缓存的 Pod 设置高 cost,避免频繁重建导致冷启动。
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 生效;后续滚动升级也会继承。
# 先运行 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验证步骤:
kubectl scale deploy weighted-app --replicas=3
# 观察 pod-low-cost 被优先删除,pod-high-cost 最后删除Kubernetes 的 Pod 删除优先级机制提供了精细的控制能力,在大规模集群中尤为重要。通过理解这些规则和合理使用 pod-deletion-cost 注解,可以更智能地管理集群资源,确保业务连续性和稳定性。
1、Kubernetes 内置 8 级排序算法,确保缩容过程可预测、可调试。
2、通过 pod-deletion-cost 注解,业务可在不改动控制器代码的前提下,灵活干预删除顺序。
3、合理使用该机制,可在金丝雀发布、节点维护、成本优化等场景显著降低业务中断风险。
如果你觉得这篇文章有用,欢迎关注、点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!