
在Kubernetes中,调度器的核心功能是自动分配Pod到合适节点,但通过以下高级特性可精细化控制调度逻辑,满足复杂场景需求:
一、节点亲和性与反亲和性(Node Affinity/Anti-Affinity)
通过节点标签(Labels)和注解(Annotations)实现定向调度或规避调度,支持硬性规则(强制)和软性规则(建议)。
1、硬性规则(requiredDuringSchedulingIgnoredDuringExecution)
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "failure-domain.beta.kubernetes.io/zone"
operator: NotIn
values: ["asia-south1-a"] # 排除该区域节点2、软性规则(preferredDuringSchedulingIgnoredDuringExecution)
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100 # 权重越高优先级越高
preference:
matchExpressions:
- key: "failure-domain.beta.kubernetes.io/zone"
operator: In
values: ["asia-south1-a"] # 优先选择此区域关键操作符:
In、NotIn、Exists等,支持复杂逻辑组合。
二、Pod亲和性与反亲和性(Pod Affinity/Anti-Affinity)
基于已有Pod的分布控制新Pod的调度位置,常用于高可用或性能优化场景。
1、Pod反亲和性(避免同节点部署)
示例:确保Redis缓存Pod分散在不同节点
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["redis"]
topologyKey: "kubernetes.io/hostname" # 以节点为调度域2、Pod亲和性(同节点部署)
示例:将Pod调度到已有Redis Pod的节点
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["redis"]
topologyKey: "kubernetes.io/hostname" # 与Redis同节点拓扑域(
**topologyKey**):
kubernetes.io/hostname:节点级隔离failure-domain.beta.kubernetes.io/``zone:可用区级隔离三、组合策略实现复杂调度
场景示例:Web应用与缓存Pod的协同调度
配置方案:
# 缓存Deployment(反亲和性)
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["redis"]
topologyKey: "kubernetes.io/hostname" # 禁止同节点多副本
# Web Deployment(亲和性+反亲和性)
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web"]
topologyKey: "kubernetes.io/hostname" # Web自身也分散部署
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["redis"]
topologyKey: "kubernetes.io/hostname" # 必须与Redis同节点四、其他高级调度机制
1、污点与容忍度(Taints and Tolerations)
NoSchedule),Pod需声明容忍度才能调度。2、自定义调度器
3、调度框架插件
MostAllocated优化资源利用率)。特性 | 适用场景 | 规则类型 |
|---|---|---|
节点亲和性/反亲和性 | 节点级定向调度(如区域隔离) | 硬性/软性 |
Pod亲和性/反亲和性 | Pod协同部署(如微服务同节点) | 硬性/软性 + 拓扑域 |
污点与容忍度 | 节点状态感知(如维护模式) | 节点标记 + Pod声明 |
通过组合上述策略,可精确控制Pod分布,平衡资源利用率、容灾与性能需求。实际应用中需注意规则冲突(如硬性规则叠加导致无节点可用),建议优先使用软性规则保障调度弹性。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!😊
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!