[转帖]亲和性调度

亲和性,调度 · 浏览次数 : 0

小编点评

## NodeAffinity 节点亲和性 **简介:** NodeAffinity 是 Kubernetes 中一种用于指定节点亲和性的策略。当多个 Pod 在同一个拓扑域中运行时,它们可能需要满足一些特定的条件才能在同一个 Node 上运行。 **两种亲和性表达:** * `requiredDuringScheduleIgnoreDuringExecution`: 要求在执行之前必须满足特定条件才能运行,并在执行完成后立即删除标签。 * `preferredDuringScheduleIgnoreDuringExecution`: 要求在执行之前必须满足特定条件才能运行,但执行完成后可以保留标签。 **实例:** **1. 匹配多个标签的节点:** ```yaml nodeAffinity: requiredDuringScheduleIgnoreDuringExecution: nodeSelectorTerms: - key: kubernetes.io/arch operator: In values: ["amd64", "arm"] ``` **2. 匹配单个标签的节点:** ```yaml nodeAffinity: requiredDuringScheduleIgnoreDuringExecution: nodeSelectorTerms: - key: security operator: In values: ["s1"] ``` **3. 匹配多个拓扑域的节点:** ```yaml nodeAffinity: podAffinity: requiredDuringSchedulingIgnoreDuringExecution: podAnffinity: requiredDuringSchedulingIgnoreDuringExecution: labelSelector: matchExpressions: - key: security operator: In values: ["s1"] podAntiAffinity: requiredDuringSchedulingIgnoreDuringExecution: podAntiAnffinity: requiredDuringSchedulingIgnoreDuringExecution: labelSelector: matchExpressions: - key: app operator: In values: ["nginx"] ``` **注意事项:** * 只能定义一个 `nodeAffinity` 或一个 `podAffinity`。 * `nodeAffinity` 和 `podAffinity` 不能同时定义。 * `name` 属性用于指定节点亲和性策略的名称。

正文

简介

前面的 nodeSelector 调度略显生硬,如果场景是:某个 Pod 最好调度到磁盘大的节点上,如果暂时没有,小点也行,比方说数据库;
如果场景是:某个 Pod,坚决不能调度到某类节点上,其余无所谓,比如说负载均衡不能调度到不对外开放端口的节点上;
诸如此类…

关于这些,nodeSelector 就不太行了。


nodeAffinity 节点亲和性

目前有两种亲和性表达:

  • RequiredDuringScheduleIgnoreDuringExecution:调度时要求,执行时忽略。
  • PreferedDuringScheduleIgnoreDuringExecution:调度时最好有,执行时忽略。

这什么意思呢,以第一个为例,就是调度的时候必须要有我需要的标签,调度完运行时有没有无所谓了。
第二个就是在调度的时候最好有我要的标签,没有那退而求其次吧。

动手验证:那么 nodeSelector 的 Pod 所在的 Node 在 pod 调度完成之后被删除了标签会怎么样呢?

apiVersion: v1
kind: pod
metadate:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringScheduleIgnoreDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - ["amd64","arm"]
      preferedDuringScheduleIgnoreDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disk-type
            operator: In
            values:
            - ssd
  containers:
  - name: with-node-affinity
    image: mysql

    operator 的可选操作:

    In: label的值在某个列表中
    NotIn:label的值不在某个列表中
    Exists:某个label存在
    DoesNotExist:某个label不存在
    Gt:label的值大于某个值(字符串比较)
    Lt:label的值小于某个值(字符串比较)
    equal:label存在且值等于指定的值
    

      注意事项:

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

      此外,我还发现了一个有趣的现象(因为这里没有一套模板,那么什么情况下字段能重复出现,什么情况下字段只有一次出现呢?在数组里可以重复出现,在字典里就出现一次。)


      podAffinity

      Pod 的亲和与互斥调度策略,从 1.4 版本开始引入,目的在于相关联的两种或多种 Pod 是否可以在同一个 拓扑域中共存或互斥,前者被称为 podAffinity,后者被称为 podAntiAffinity。
      一个拓扑域由一些 Node 节点组成,这些 Node 节点通常有相同的地理空间坐标,在极端情况下,我们也可以认为一个 node 就是一个拓扑域。

      k8s 内置了以下一些常用的默认拓扑域:

      • kubernetes.io/hostname
      • topology.kubernetes.io/region
      • topology.kubernetes.io/zone

      pod 亲和性的具体做法是通过在 Pod 上定义增加 topylogyKey 属性,来声明对应的目标拓扑域内几种相关联的 Pod 要在一起或不在一起。


      亲和性调度实例

      apiVersion: v1
      metadate:
        name: pod-flag
        labels:
          security: "s1"
          app: "nginx"
        spec:
          containers:
          - name: nginx
            image: nginx
      
        apiVersion: v1
        metadate:
          name: pod-anffinity
          spec:
            affinity:
              podAnffinity:
                requiredDuringSchedulingIgnoreDuringExecution:
                - labelSelector:
                    matchExpressions:
                    - key: security
                      operator: In
                      values:
                      - s1
                 topologyKey: kubernetes.io/hostname 
            containers:
            - name: nginx2
              image: nginx
        

          创建 pod 之后,可以看到两个 pod 在同一个 Node 上运行。


          互斥性调度实例

          apiVersion: v1
          metadate:
            name: pod-flag
            labels:
              security: "s1"
              app: "nginx"
            spec:
              containers:
              - name: nginx
                image: nginx
          
            apiVersion: v1
            metadate:
              name: pod-anffinity
              spec:
                affinity:
                  podAnffinity:
                    requiredDuringSchedulingIgnoreDuringExecution:
                    - labelSelector:
                        matchExpressions:
                        - key: security
                          operator: In
                          values:
                          - s1
                      topologyKey: topologyKey.kubernetes.io/zone
                  podAntiAnffinity:
                    requiredDuringSchedulingIgnoreDuringExecution:
                    - labelSelector:
                        matchExpressions:
                        - key: app
                          operator: In
                          values:
                          - nginx
                       topologyKey: kubernetes.io/hostname
                containers:
                - name: nginx3
                  image: nginx
            

              这里要求这个 pod 和 security=s1 的 pod 在同一个 zone,但是和 app 为 nginx 的 pod 不为同一个 node,然后就会发现它没地方去了,因为我就一个 node hhhhh。。

              与[转帖]亲和性调度相似的内容:

              [转帖]亲和性调度

              文章目录 简介nodeAffinity 节点亲和性podAffinity亲和性调度实例互斥性调度实例 简介 前面的 nodeSelector 调度略显生硬,如果场景是:某个 Pod 最好调度到磁盘大的节点上,如果暂时没有,小点也行,比方说数据库; 如果场景是:某个 Pod,坚决不能调度到某类节点上,

              [转帖]pod 调度详解:亲和、污点和容忍

              文章目录 兔子的故事自动调度定向调度亲和性调度nodeAffinityPodAffinityPodAntiAffinity 污点和容忍污点(Taints)查看污点设置污点删除污点 容忍 (toleratints)Pod 设置容忍Deployment 中设置容忍设置容忍时间容忍示例 污点驱逐 兔子的故

              [转帖]Kubernetes-15:一文详解Pod、Node调度规则(亲和性、污点、容忍、固定节点)

              https://www.cnblogs.com/v-fan/p/13609124.html Kubernetes Pod调度说明 简介 Scheduler 是 Kubernetes 的调度器,主要任务是把定义的Pod分配到集群的节点上,听起来非常简单,但要考虑需要方面的问题: 公平:如何保证每个节点

              [转帖]Redis如何绑定CPU

              文章系转载,便于分类和归纳,源文地址:https://www.yisu.com/zixun/672271.html 绑定 CPU Redis 6.0 开始支持绑定 CPU,可以有效减少线程上下文切换。 CPU 亲和性(CPU Affinity)是一种调度属性,它将一个进程或线程,「绑定」到一个或一组

              [转帖]Redis如何绑定CPU

              文章系转载,便于分类和归纳,源文地址:https://www.yisu.com/zixun/672271.html 绑定 CPU Redis 6.0 开始支持绑定 CPU,可以有效减少线程上下文切换。 CPU 亲和性(CPU Affinity)是一种调度属性,它将一个进程或线程,「绑定」到一个或一组

              【转帖】isolcpus功能与使用

              isolcpus功能存在已久,笔者追溯v2.6.11(2005年)那时内核就已经存在了isolcpus功能。根据kernel-parameters.txt 上的解释,”isolcpus功能用于在SMP均衡调度算法中将一个或多个CPU孤立出来。同时可通过亲和性设置将进程置于 “孤立CPU”运行,iso

              [转帖]Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

              一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理

              【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

              一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理

              [转帖]tmp 目录文件被自动清理问题的调查

              https://kodango.com/mistaked-to-delete-tmp-files 某次项目发布过程中,当我们把 rpm 包下发到每台 nc 之后,发现过了一会儿文件就被删除了,当时百思不得其解,第二天亲自试了下,果然能够稳定复现。 试了几次发现,放在 /tmp 目录下的文件,只要文件

              [转帖]进程间通信方式

              1)管道 管道分为有名管道和无名管道 无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端