亲和性(Affinity) 和 反亲和性(Anti-Affinity)

文章介绍了Kubernetes的nodeAffinity和podAntiAffinity机制,nodeAffinity用于指定Pod应调度到的节点,确保Pod在特定条件下运行;podAntiAffinity则防止相同应用或服务的Pod在同一节点上部署,提高系统可用性和鲁棒性。这两种机制提供了灵活的集群资源管理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kubernetes 亲和性与反亲和性调度笔记

一、亲和性概述

在 Kubernetes 中,亲和性机制对于 Pod 的调度和部署起着关键作用,它能够帮助我们更精准地控制 Pod 在节点上的分布,提升应用的可用性、性能和资源利用率。下面将介绍两种重要的亲和性机制:nodeAffinitypodAntiAffinity

1.1 相关参考资料

亲和性相关图片

二、nodeAffinity

2.1 概念

nodeAffinity 用于指定 Pod 应该调度到哪些节点上运行。借助 nodeAffinity,我们可以确保 Pod 运行在特定的节点集合中,或者避免其运行在某些不期望的节点上。它主要通过节点标签或其他属性来定义节点的选择条件。

2.2 示例代码

nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: bpx/node
        operator: Exists

2.3 代码解释

上述代码中,requiredDuringSchedulingIgnoredDuringExecution 表示在调度时必须满足该亲和性规则,但在 Pod 运行后节点标签发生变化时,不会影响 Pod 的运行。matchExpressions 定义了匹配规则,这里 keybpx/nodeoperatorExists,意味着调度器会选择带有 bpx/node 标签的节点来运行 Pod。

nodeAffinity 示例图片

三、podAntiAffinity

3.1 概念

podAntiAffinity 用于指定 Pod 不能与哪些 Pod 部署在同一个节点上。通过使用 podAntiAffinity,可以避免在同一个节点上部署相同的应用程序或服务,从而提高应用程序的可用性和鲁棒性。当某个节点出现故障时,由于相同应用的 Pod 分布在不同节点,不会导致整个应用不可用。

3.2 示例代码及解释

3.2.1 首选反亲和性规则
podAntiAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - podAffinityTerm:
      labelSelector:
        matchLabels:
          DBType: mysql
          Type: Database
      topologyKey: kubernetes.io/hostname
    weight: 100

此代码中,preferredDuringSchedulingIgnoredDuringExecution 表示调度器会尽量遵循该反亲和性规则,但不是强制要求。podAffinityTerm 定义了反亲和性的具体规则,labelSelector 中的 matchLabels 指定了要匹配的 Pod 标签,这里是 DBType: mysqlType: DatabasetopologyKeykubernetes.io/hostname,意味着调度器会尽量避免将带有这些标签的 Pod 调度到同一个主机名的节点上。weight 为 100,表示该规则的优先级权重,权重越高,调度器越会优先考虑遵循此规则。

podAntiAffinity 首选规则示例图片

3.2.2 强制反亲和性规则
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchLabels:
          io.cilium/app: operator
      topologyKey: kubernetes.io/hostname

这里使用了 requiredDuringSchedulingIgnoredDuringExecution,表示调度时必须遵循该反亲和性规则。调度器会确保带有 io.cilium/app: operator 标签的 Pod 不会被调度到同一个主机名的节点上。

四、总结

nodeAffinitypodAntiAffinity 都是 Kubernetes 中非常实用的调度机制,但使用场景不同。如果需要控制 Pod 运行的节点,应该使用 nodeAffinity;如果需要避免在同一个节点上部署相同的应用程序或服务,应该使用 podAntiAffinity。通过合理运用这两种机制,可以更好地管理和优化 Kubernetes 集群中的 Pod 部署。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值