亲和性和反亲和性
2025/12/21大约 1 分钟
亲和性和反亲和性
核心概念
亲和性(Affinity):控制Pod调度到特定节点或与特定Pod在一起
反亲和性(Anti-Affinity):控制Pod避开特定节点或避免与特定Pod在一起
一、节点亲和性(Node Affinity)
1. 硬性要求(required)
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values: ["ssd"]2. 软性偏好(preferred)
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: zone
operator: In
values: ["zone-a"]二、Pod亲和性(Pod Affinity)
让Pod调度到同一区域:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["cache"]
topologyKey: kubernetes.io/hostname三、Pod反亲和性(Pod Anti-Affinity)
避免Pod调度到同一节点:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web"]
topologyKey: kubernetes.io/hostname四、典型应用场景
| 类型 | 场景 | 示例 |
|---|---|---|
| 节点亲和性 | 特定硬件需求 | GPU节点、SSD磁盘 |
| Pod亲和性 | 相关服务部署在一起降低延迟 | Web与缓存部署在同一节点 |
| Pod反亲和性 | 高可用分散部署 | 多副本分散到不同节点/可用区 |
五、关键参数
- topologyKey: 定义拓扑域(如hostname、zone)
- required: 硬性规则,不满足则不调度
- preferred: 软性规则,尽量满足
- weight: 软性规则权重(1-100)
六、最佳实践
- 高可用:使用podAntiAffinity分散关键服务副本
- 性能优化:使用podAffinity将频繁通信的服务部署在一起
- 资源隔离:使用nodeAffinity将不同类型负载调度到专用节点
- 避免过度约束:优先使用preferred,保留调度灵活性