什么是 k8s Affinity(亲和性)

在 Kubernetes(K8s)中,Affinity(亲和性) 是一种 Pod 调度策略,它用于控制 Pod 在什么条件下可以被调度到特定的节点上。它比 Taints 和 Tolerations 更灵活,可以基于 节点属性Pod 之间的关系 来影响调度决策。

什么是 k8s Affinity(亲和性)_第1张图片

Affinity 分类

什么是 k8s Affinity(亲和性)_第2张图片

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/

你可能感兴趣的:(Cloud,Docker,Kubernetes,kubernetes,容器,云原生,LoadBalancer)