在 Kubernetes(K8s)中,Affinity(亲和性) 是一种 Pod 调度策略,它用于控制 Pod 在什么条件下可以被调度到特定的节点上。它比 Taints 和 Tolerations 更灵活,可以基于 节点属性 或 Pod 之间的关系 来影响调度决策。
Affinity 主要分为 Node Affinity(节点亲和性) 和 Pod Affinity/Anti-Affinity(Pod 亲和性/反亲和性) 两种:
作用:让 Pod 优先或必须调度到符合某些特定标签的节点上。
使用方式:在 Pod spec.affinity.nodeAffinity
中定义亲和性规则,例如:
yaml
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: "In"
values: ["ssd"]
这表示 Pod 只能调度到 disktype=ssd
的节点。
requiredDuringSchedulingIgnoredDuringExecution
:调度时必须满足条件,运行后忽略约束。
另一种 preferredDuringSchedulingIgnoredDuringExecution
则是 软约束,即 Kubernetes 尽量调度到满足条件的节点,但如果没有可选的节点,它仍然可以运行在其他节点上。
作用:让 Pod 尽量调度到 某些特定 Pod 已经运行的节点上,比如你希望 微服务组件部署在相同的节点 以减少网络延迟。
使用方式:
yaml
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: "web"
topologyKey: "kubernetes.io/hostname"
这表示 Pod 会优先调度到已经运行 app=web
的节点上。
topologyKey
决定亲和性范围,如 "kubernetes.io/hostname"
表示节点级亲和性。
weight
影响调度决策,值越大,优先级越高。
作用:让 Pod 避免调度到已经运行了某些特定 Pod 的节点上,例如避免两个高负载的服务运行在同一个节点上,降低故障风险。
使用方式:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
podAffinityTerm:
labelSelector:
matchLabels:
app: "cache"
topologyKey: "kubernetes.io/hostname"
这表示 Pod 不会调度到运行 app=cache
的节点,可以用于防止缓存服务集中在单个节点上,保证负载均衡。
高效资源利用:将数据库 Pod 亲和到高 IOPS 存储节点上,保证数据库性能。
降低网络延迟:微服务 Pod 亲和在同一节点,减少网络开销。
高可用性设计:使用 Anti-Affinity 让 Pod 均匀分布,避免单点故障。
多级数据中心部署:在不同数据中心间控制 Pod 亲和性,使应用合理分布。
Affinity 提供了更灵活的调度控制方式,比 Taints 和 Tolerations更加 精细化,可以根据 Pod 与 Pod 的关系 或 节点属性 影响调度。
Powered by Moshow@https://zhengkai.blog.csdn.net/