0
点赞
收藏
分享

微信扫一扫

Kubernetes Pod亲和性调度(NodeAffinity)

诗远 2022-02-23 阅读 66

NodeAffinity意为Node 亲和性的调度策略,是用于替换NodeSelector 的全新调度策略。目前有两种节点亲和性表达。
(1)RequiredDuringSchedulingIgnoredDuringExecution: 必须满足指定的规则才可以调度Pod 到Node 上(功能与nodeSelector很像,但是使用的是不同的语法),相当于硬限制。
(2)PreferredDuringSchedulingIgnoredDuringExecution: 强调优先满足指定规则,调度器会尝试调度Pod 到 Node 上,但是并不强求,相当于软限制。多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。

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

下面的例子设置了NodeAffinity 调度的如下规则。
(1)requiredDuringSchedulingIgnoredDuringExecution:要求只运行在amd64的节点上(beta.kubernetes.io/arch In amd64)。
(2)preferredDuringSchedulingIgnoredDuringExecution:要求尽量运行在磁盘类型为ssd(disk-type In ssd)的节点上。

代码如下:

apiVersion: v1
kind: Pod
metadata: 
  name: with-node-affinity
spec: 
  affinity: 
    nodeAffinity: 
      requiredDuringSchedulingIgnoreDuringExecution: 
        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: gcr.io/gooler_containers/pause:2.0

从上面的配置中可以看到In 操作符,NodeAffinity 语法支持的操作符包括In,NotIn,Exists,DoesNotExists,Gt,Lt 。虽然没有节点排斥功能,但是用NotIn 和 DoesNotExist就可以实现排斥的功能了。

NodeAffinity 规则设置的注意事项如下:
(1)如果同时定义了NodeSelector 和 nodeAffinity ,那么必须两个条件都得到满足,Pod才能最终运行在指定的Node 上。
(2)如果nodeAffinity 指定了多个NodeSelectorTerms,那么其中一个能匹配成功即可。
(3)如果在nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions 才能运行该Pod。

举报

相关推荐

0 条评论