Kubernetes亲和性调度通过affinity字段实现,含节点亲和(硬/软)与Pod亲和/反亲和(硬/软),需正确选用topologyKey、operator及weight等参数。

Kubernetes 的 Affinity 亲和性调度策略主要通过 affinity 字段在 Pod 或 Deployment 的 YAML 中声明,核心是控制 Pod 调度到哪些节点、或与哪些已有 Pod 共存/分离。配置不难,但关键在于选对类型、写对语法、用对操作符。
节点亲和性(Node Affinity):按节点标签做调度约束
这是最常用的一类,替代老旧的 nodeSelector,支持更灵活的匹配逻辑。
- 硬亲和(
requiredDuringSchedulingIgnoredDuringExecution):必须满足,否则 Pod 卡在 Pending 状态。 - 软亲和(
preferredDuringSchedulingIgnoredDuringExecution):带权重的偏好,不满足也会调度,只是得分低。
例如,强制 Pod 只运行在 SSD 磁盘且 CPU 架构为 amd64 的节点上:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disk-type
operator: In
values: ["ssd"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]再加一条软偏好:优先调度到可用区 us-east-1b 的节点,权重设为 80:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values: ["us-east-1b"]Pod 亲和性与反亲和性(Pod Affinity / Anti-Affinity):按已有 Pod 标签做调度决策
适用于服务间协同或隔离场景,比如“数据库 Pod 必须和缓存 Pod 在同一节点”或“同一 Deployment 的副本不能挤在同一台机器上”。
硬性 Pod 反亲和(确保高可用):
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["my-web"]
topologyKey: kubernetes.io/hostname这段配置让所有带 app=my-web 标签的 Pod 互斥——每个节点最多一个,避免单点故障。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
软性 Pod 亲和(提升性能):
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: ["redis-cache"]
topologyKey: topology.kubernetes.io/zone表示“尽量把当前 Pod 和 app=redis-cache 的 Pod 调度到同一可用区”,降低跨区网络延迟。
关键细节提醒
-
topologyKey决定“拓扑域范围”,常用值有kubernetes.io/hostname(同节点)、topology.kubernetes.io/zone(同可用区)、topology.kubernetes.io/region(同地域)。 -
operator支持In、NotIn、Exists、DoesNotExist、Gt、Lt,比nodeSelector的等值匹配强得多。 -
weight只用于软策略,取值 1–100,多个软规则之间会累加得分。 - 硬策略和软策略可以共存,但硬策略不满足时,软策略根本不会生效。
不复杂但容易忽略

















