高级调度 —— 亲和力(Affinity)

发布时间 2023-11-03 23:58:18作者: yifanSJ
  • 污点:尽可能远离它,比如内存小
  • 亲和力:尽可能靠近它,比如它是SSD

一、NodeAffinity

节点亲和力:进行 pod 调度时,优先调度到符合条件的亲和力节点上

一)RequiredDuringSchedulingIgnoredDuringExecution

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

二)PreferredDuringSchedulingIgnoredDuringExecution

软亲和力:尽量部署在满足条件的节点上,或尽量不要部署在被匹配的节点上

三)应用

1、匹配类型

  • In
    部署在满足条件的节点上
  • NotIn
    匹配不在条件中的节点,实现节点反亲和性
  • Exists
    只要存在 key 名字就可以,不关心值是什么
  • DoesNotExist
    匹配指定 key 名不存在的节点,实现节点反亲和性
  • Gt
    value 为数值,且节点上的值小于指定的条件
  • Lt
    value 为数值,且节点上的值大于指定条件

2、配置模板

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity: # 亲和力配置
    nodeAffinity: # 节点亲和力
      requiredDuringSchedulingIgnoredDuringExecution: # 节点必须匹配下方配置
        nodeSelectorTerms: # 选择器
        - matchExpressions: # 匹配表达式
          - key: topology.kubernetes.io/zone # 匹配 label 的 key
            operator: In # 匹配方式,只要匹配成功下方的一个 value 即可
            values:
            - antarctica-east1 # 匹配的 value
            - antarctica-west1 # 匹配的 value
      preferredDuringSchedulingIgnoredDuringExecution: # 节点尽量匹配下方配置
      - weight: 1 # 权重[1,100],按照匹配规则对所有节点累加权重,最终之和会加入优先级评分,优先级越高被调度的可能性越高
        preference:
          matchExpressions: # 匹配表达式
          - key: another-node-label-key # label 的 key
            operator: In # 匹配方式,满足一个即可
            values:
            - another-node-label-value # 匹配的 value
#      - weight: 20
        ......
  containers:
  - name: with-node-affinity
    image: pause:2.0

二、PodAffinity

Pod 亲和力:将与指定 pod 亲和力相匹配的 pod 部署在同一节点。

一)RequiredDuringSchedulingIgnoredDuringExecution

必须将应用部署在一块

二)PreferredDuringSchedulingIgnoredDuringExecution

尽量将应用部署在一块

三)配置模板

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity: # 亲和力配置
    podAffinity: # pod 亲和力配置
      requiredDuringSchedulingIgnoredDuringExecution: # 当前 pod 必须匹配到对应条件 pod 所在的 node 上
      - labelSelector: # 标签选择器
          matchExpressions: # 匹配表达式
          - key: security # 匹配的 key
            operator: In # 匹配方式
            values: # 匹配其中的一个 value
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity: # pod 反亲和力配置
      preferredDuringSchedulingIgnoredDuringExecution: # 尽量不要将当前节点部署到匹配下列参数的 pod 所在的 node 上
      - weight: 100 # 权重
        podAffinityTerm: # pod 亲和力配置条件
          labelSelector: # 标签选择器
            matchExpressions: # 匹配表达式
            - key: security # 匹配的 key
              operator: In # 匹配的方式
              values:
              - S2 # 匹配的 value
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: pause:2.0

均为打标签进行匹配
kubectl label no k8s-node1 kubernetes.io/os=linux

三、PodAntiAffinity

Pod 反亲和力:根据策略尽量部署或不部署到一块

一)RequiredDuringSchedulingIgnoredDuringExecution

不要将应用与之匹配的部署到一块

podAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchExpressions:
      - key: security
        operator: In
        values:
        - S1
    topologyKey: topology.kubernetes.io/zone

二)PreferredDuringSchedulingIgnoredDuringExecution

尽量不要将应用部署到一块