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