什么是 k8s Affinity(亲和性)

在 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/

### Kubernetes 节点亲和性配置使用教程与最佳实践 节点亲和性和反亲和性Kubernetes中用于控制Pod调度行为的重要特性之一。这使得管理员能够指定哪些节点对于特定类型的Pod来说是有吸引力或是排斥的。 #### 定义节点亲和性策略 节点亲和性可以通过两种方式定义: - **requiredDuringSchedulingIgnoredDuringExecution**: 这种模式下,只有当节点满足所有的规则条件时才会考虑该节点作为候选者。 - **preferredDuringSchedulingIgnoredDuringExecution**: 对于这种偏好型约束,在所有其他因素相同的情况下,会优先选择那些更适合此规则描述的节点;但是即使不完全匹配也不会阻止Pod被分配给某个节点[^4]。 #### 配置节点亲和性的YAML示例 下面是一个简单的例子展示了如何在Pod规格文件里加入节点亲和性设置: ```yaml apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-value ``` 这段代码指定了两个部分:一个是硬性需求(`requiredDuringSchedulingIgnoredDuringExecution`),它规定了Pod只能运行在一个具有`kubernetes.io/e2e-az-name=e2e-az1` 或 `e2e-az2`标签的节点上;另一个则是软性建议(`preferredDuringSchedulingIgnoredDuringExecution`),表示如果可能的话应该倾向于把Pod放在带有`another-node-label-key=another-value`标签的节点之上。 #### 实际应用场景下的最佳实践 为了最大化利用节点资源并确保高可用性,推荐遵循以下几个原则来进行节点亲和性配置: - 明确区分必需项和优选项之间的差异,并据此调整相应的参数; - 合理规划集群内的节点标签体系,以便更容易实现细粒度的调度控制; - 结合污点容忍(Taints and Tolerations)机制一起使用,进一步增强灵活性; - 测试不同的组合方案以找到最适合业务场景的方式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值