pod调度之NodeAffinity:Node亲和性调度

NodeAffinity意为Node亲和性调度策略。是用于替换NodeSelector的全新调度策略。目前有两种节点节点亲和性表达:

  1. RequiredDuringSchedulingIgnoredDuringExecution:
    必须满足制定的规则才可以调度pode到Node上。相当于硬限制
  2. PreferredDuringSchedulingIgnoreDuringExecution:
    强调优先满足制定规则,调度器会尝试调度pod到Node上,但并不强求,相当于软限制。多个优先级规则还可以设置权重值,以定义执行的先后顺序。

IgnoredDuringExecution的意思是:
如果一个pod所在的节点在pod运行期间标签发生了变更,不在符合该pod的节点亲和性需求,则系统将忽略Node上Lable的变化,该pod能机选在该节点运行。
下面的例子设置了NodeAffinity调度的如下规则:

  1. RequiredDuringSchedulingIgnoredDuringExecution 要求只运行在amd64的节点上()
  2. PreferredDuringSchedulingIgnoreDuringExecution 要求尽量运行在磁盘类型为ssd()的节点上
    代码如下:
[root@bogon ~]# vim with-node-affinity.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: beta.kubernetes.io/arch
            operator: In
            values:
            - amd64
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disk-type
            operator: In
            values:
            - ssd
  containers:
  - name: with-node-affinity
    image: google/pause

NodeAffinity 语法支持的操作符包括:

  1. In
  2. NotIn
  3. Exists
  4. DoesNotExit
  5. Gt
  6. Lt

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

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

猜你喜欢

转载自blog.csdn.net/zhangshaohuas/article/details/107380234