十一、Kubernetes调度-亲和力与反亲和力-Affinity-AntiAffinity

亲和力Affinity

存在的问题:

  • 某些Pod优先选择有ssd=true标签的节点,如果没有在考虑部署到其它节点,如其他没有标签,会pending;
  • 某些Pod需要部署在ssd=true和type=physical的节点上,但是优先部署在ssd=true的节点上;会有优先级
  • 同一个应用的Pod不同的副本或者同一个项目的应用尽量或必须不部署在同一个节点或者符合某个标签的一类节点上或者不同的区域;
  • 相互依赖的两个Pod尽量或必须部署在同一个节点上。比如有些pod之间依赖比较大。

一、Affinity分类

  • Pod和节点之间的关系

  • Pod和Pod之前的关系


  • 反亲和力:不要部署在一块

  • 亲和力:要部署在一块

Affinity亲和力分为三类:

  • NodeAffinity: 节点亲和力/反亲和力
  • PodAffnity: Pod亲和力
  • PodAntiAffinity: Pod反亲和力

每一类又分为两个小类

在这里插入图片描述

NodeAffinity: 节点亲和力/反亲和力

  • requiredDuringSchedulingIgnoredDuringExecution:硬亲和力,即支持必须部要在指定的节点上,也支持必须不部署在指定的节点上。

  • preferredDuringSchedulingIgnoredDuringExecution:软亲和力,尽量部署在满足条件的节点上,或者是尽量不要部署在被区配的节点.

PodAffnity: Pod亲和力

  • requiredDuringSchedulingIgnoredDuringExecution:硬亲和力,将 A应用和 B应用部署在一块。

  • preferredDuringSchedulingIgnoredDuringExecution:软亲和力,尽量将 A 应用和 B应用部署在一块

PodAntiAffinity: Pod反亲和力

- requiredDuringSchedulingIgnoredDuringExecution:硬亲和力,不要将 A应用和 B应用部署在一块。

- preferredDuringSchedulingIgnoredDuringExecution:软亲和力,尽量不要将 A 应用和 B应用部署在一块。


IgnoredDuringExecution的意思是:如果一个Pod所在的节点在Pod运行期间标签发生了变更,不再符合该Pod的节点亲和性需求,则系统将忽略Node上Label的变化,该Pod能继续在该节点上运行。

配置容器的反亲和力,可以使pod分开到各个node上,如果挂掉一个,其他也可以用。

在这里插入图片描述

提高可用率-部署至不同机房/机柜

在这里插入图片描述

不同的项目分开放,都分开放,有问题,影响最小,不把鸡蛋放在同一个篮子

在这里插入图片描述


二、NodeAffinity:节点亲和性调度

编写yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name   # 两个key,都要满足
            operator: In                     # 两个key,都要满足
            values:                          # 两个key,都要满足
            - e2e-az1                        # 两个key,都要满足
          - key: hostname                   # 两个key,都要满足
            operator: In                     # 两个key,都要满足
            values:                          # 两个key,都要满足
            - k8s-node02                     # 两个key,都要满足
        - matchExpressions:               
          - key: subnet
            operator: In
            values:
            - subnet-172-10-1
      preferredDuringSchedulingIgnoredDuringExecution: 
      - weight:1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
              - another-node-label-value
  containers:
  - name: with-node-affinity
    image: nginx

1、 详细解释

nodeAffinity 中的两个策略:

  • requiredDuringSchedulingIgnoredDuringExecution(必须满足的调度条件)
    • nodeSelectorTerms: 定义了多个匹配条件,所有的 matchExpressions 必须全部满足
    • key 的匹配:匹配 kubernetes.io/e2e-az-namehostname,这两个条件都必须成立,Pod 才会被调度到指定节点上。
  • preferredDuringSchedulingIgnoredDuringExecution(优先满足的调度条件)
    • 如果符合 another-node-label-key 的节点可用,则 Pod 更倾向于被调度到这个节点上,但不是强制性的。

2、 代码中的逻辑:

  1. 调度的强制条件:
    • 节点必须有以下两个标签,并且它们的值分别是:
      • kubernetes.io/e2e-az-name: e2e-az1
      • hostname: k8s-node02
    • 也可以满足 subnet: subnet-172-10-1 的条件。
  2. 调度的优先条件:
    • 更倾向于节点上具有标签 another-node-label-key: another-node-label-value,但不强制。

3、 整体解释:

  1. nodeSelectorTerms 是一个列表,每个 nodeSelectorTerm 是一个单独的条件。
  2. 逻辑关系:
    • 多个 matchExpressions 在同一个 nodeSelectorTerm 中时:需要 同时满足(AND 关系)
    • 多个 nodeSelectorTerm 之间:只需满足 其中一个(OR 关系)

整体逻辑:

  • 匹配成功的条件是:

    1. 满足 kubernetes.io/e2e-az-name: e2e-az1 hostname: k8s-node02
      OR
    2. 满足 subnet: subnet-172-10-1

换句话说:只要节点满足任意一个 nodeSelectorTerm,Pod 就会被调度到该节点。

nodeSelectorTerms:
  - matchExpressions:                 # 这是一个 nodeSelectorTerm
    - key: kubernetes.io/e2e-az-name  # 第一个 matchExpression
      operator: In
      values:
      - e2e-az1
    - key: hostname                   # 第二个 matchExpression
      operator: In
      values:
      - k8s-node02

  - matchExpressions:                 # 这是第二个 nodeSelectorTerm
    - key: subnet                     # 这是一个单独的 matchExpression
      operator: In
      values:
      - subnet-172-10-1

总结:

  1. 代码确实有两个 nodeSelectorTerm
    • 第一个 nodeSelectorTerm 有两个 matchExpressions,它们是 AND 关系。
    • 第二个 nodeSelectorTerm 只有一个 matchExpression,它与第一个 nodeSelectorTermOR 关系。
  2. 如果只希望一个 nodeSelectorTerm,所有条件都在一起(全部 AND 关系),写成并列的key。

<[]PreferredSchedulingTerm> 这总表示[ ] 是对象列表,下一行要用-开头。
<NodeSelector>是对象,下一行不用-开头。

在这里插入图片描述

operator配置解释
preferredDuringSchedulinglgnoredDuringExecution:

  • weight:软亲和力的权重,权重越高优先级越大,范围1-100;
  • preference: 软亲和力配置项,和weight同级,可以配置多个,matchExpressions和硬亲和力一致
  • operator:标签匹配的方式;
  • In:相当于key = value的形式;
  • NotIn:相当于key != value的形式,与in相反,符合就不部署;
  • Exists:节点存在label的key为指定的值即可,不能配置values字段;
  • DoesNotExist:节点不存在label的key为指定的值即可,不能配置values字段;
  • Gt:大于value指定的值,条件为数字;
  • Lt:小于value指定的值,条件为数字;

NodeAffinity规则设置的注意事项如下

  • ◎ 如果同时定义了nodeSelector和nodeAffinity,那么必须两个条件都得到满足,Pod才能最终运行在指定的Node上。
  • ◎ 如果nodeAffinity指定了多个nodeSelectorTerms,那么其中一个能匹配成功即可。
  • ◎ 如果在nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions才能运行该Pod。

三、PodAffinity和PodAntiAffinity

在实际的生产环境中有一类特殊的Pod调度需求:存在某些相互依赖、频繁调用的Pod,它们需要被尽可能地部署在同一个Node节点、机架、机房、网段或者区域(Zone)内,这就是Pod之间的亲和性;反之,出于避免竞争或者容错的需求,我们也可能使某些Pod尽可能地远离某些特定的Pod,这就是Pod之间的反亲和性或者互斥性。

示例yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          namespaces:
          - default
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: nginx
  • labelSelector: Pod选择器配置,可以配置多个pod标签
  • matchExpressions: 和节点亲和力配置一致
  • operator:配置和节点亲和力一致,但是没有Gt和Lt
  • topologyKey:匹配的拓扑域的key,也就是node节点上label的key(只写key名字,不写value)。key和value相同的为同一个域,可以用于标注不同的机房和地区
  • Namespaces:和哪个命名空间的Pod进行匹配,为空为当前命名空间

1、Pod Affinity解释

用于指定 Pod 调度时偏好与其他 Pod 的关系。具体配置如下:

  • requiredDuringSchedulingIgnoredDuringExecution

    • 这表示 必须满足的亲和性规则。Pod 调度时必须满足这个条件,否则 Pod 无法被调度到节点。
    • 一旦 Pod 被调度,之后的节点变化(例如其他 Pod 被删除)将不会影响已经调度的 Pod。
  • labelSelector:定义如何选择需要考虑的 Pod。

  • matchExpressions:定义与哪些 Pod 匹配。

    • key: security:要求目标 Pod 具有标签 security,即其标签键为 security
    • operator: In:表示这个 security 标签的值必须在指定的 values 列表中。
    • values: [S1]:表示目标 Pod 必须有 security=S1 标签。
  • topologyKey: topology.kubernetes.io/zone

    • 定义了一个拓扑关键字,表示 Pod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyan_Jiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值