在Kubernetes中配置Pod的亲和性(Affinity)和反亲和性(Anti-Affinity)是通过定义Pod调度策略实现资源优化和高可用的核心手段。以下为实践要点:
-
核心概念
- 亲和性:将Pod调度到与特定节点或已有Pod共置,例如将缓存服务与数据库部署在同一可用区以降低延迟。
- 反亲和性:避免Pod集中在同一节点或拓扑域,例如Web服务分散部署以防止单节点故障。
-
配置实现
-
Node Affinity(节点级调度)
- 使用
nodeSelector
基础标签匹配,或通过affinity.nodeAffinity
定义复杂规则:affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "disk-type" operator: In values: ["ssd"]
required*
为硬性约束(必须满足SSD标签),preferred*
为软性约束(优先SSD)。
- 使用
-
Pod Affinity/Anti-Affinity(Pod间调度)
- 通过
podAffinity
或podAntiAffinity
定义,依赖topologyKey
(如kubernetes.io/hostname
)划分拓扑域:affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: nginx topologyKey: "kubernetes.io/hostname"
此配置阻止同一节点运行多个
app=nginx
的Pod。
- 通过
-
-
实战场景
- 高可用:StatefulSet中通过
podAntiAffinity
强制Pod分散在不同节点(topologyKey: hostname
)。 - 性能优化:AI训练Pod与GPU节点绑定(
nodeAffinity
),且避免同一GPU卡分配多任务(podAntiAffinity
)。
- 高可用:StatefulSet中通过
-
注意事项
- 标签管理:确保节点和Pod标签准确,避免因标签缺失导致调度失败。
- 资源冲突:硬性约束可能导致Pod无法调度(Pending),需结合
kubectl describe pod
排查事件日志。 - 平衡策略:过度使用
required*
可能限制调度灵活性,建议生产环境中混合软硬约束。
通过合理设计亲和性规则,可显著提升集群的资源利用率和业务连续性。建议通过kubectl get pods -o wide
观察调度结果,并通过模拟节点故障验证高可用性。