更新时间:2024-07-20 GMT+08:00
分享

设置节点亲和调度

Kubernetes在调度工作负载时支持将节点作为亲和对象,将工作负载调度至具有指定标签和标签值的节点上。例如,某些节点支持使用GPU算力,则可以使用节点亲和调度,确保高性能计算的Pod最终运行在GPU节点上。

通过控制台配置节点亲和调度策略

  1. 在创建工作负载时,在“高级设置”中找到“调度策略”创建工作负载的步骤详情请参见创建工作负载
  2. 选择节点亲和调度的策略类型。

    • 不配置:不设置节点亲和策略。
    • 指定节点调度:指定工作负载Pod部署的节点。若不指定,将根据集群默认调度策略随机调度。
    • 指定节点池调度:指定工作负载Pod部署的节点池。若不指定,将根据集群默认调度策略随机调度。
    • 自定义亲和策略:根据节点标签实现灵活的调度策略,支持的调度策略类型请参见表1。选择合适的策略类型后,单击添加调度策略,参数详情请参见表2。您也可以单击“指定节点”“指定可用区”通过控制台快速选择需要调度的节点或可用区。

      “指定节点”“指定可用区”本质也是通过标签实现,只是通过控制台提供了更为便捷的操作,无需手动填写节点标签和标签值。指定节点使用的是 kubernetes.io/hostname 标签,指定可用区使用的是 failure-domain.beta.kubernetes.io/zone 标签。

      表1 节点亲和性设置

      参数名

      参数描述

      必须满足

      即硬约束,设置必须要满足的条件,对应requiredDuringSchedulingIgnoredDuringExecution。

      添加多条“必须满足”规则时,只需要满足一条规则就会进行调度。

      尽量满足

      即软约束,设置尽量满足的条件,对应preferredDuringSchedulingIgnoredDuringExecution。

      添加多条“尽量满足”规则时,满足其中一条或者都不满足也会进行调度。

      表2 节点亲和性调度策略设置参数说明

      参数名

      参数描述

      权重

      仅支持在“尽量满足”策略中添加。权重的取值范围为1-100,调度器在进行调度时会将该权重视为一个附加的评分项,并将其与节点的其他优先级函数评分相加。最终,调度器会将Pod调度到总分最大的节点上。

      标签名

      设置节点亲和性时,填写需要匹配的节点标签。

      该标签可以使用系统默认的标签,也可以使用自定义标签。

      操作符

      可以设置六种匹配关系(In、NotIn、Exists、DoesNotExist、Gt、Lt)。

      • In:亲和/反亲和对象的标签在标签值列表(values字段)中。
      • NotIn:亲和/反亲和对象的标签不在标签值列表(values字段)中。
      • Exists:亲和/反亲和对象存在指定标签名。
      • DoesNotExist:亲和/反亲和对象不存在指定标签名。
      • Gt:仅在节点亲和性中设置,调度节点的标签值大于列表值 (字符串比较)。
      • Lt:仅在节点亲和性中设置,调度节点的标签值小于列表值 (字符串比较)。

      标签值

      设置节点亲和性时,填写节点标签对应的标签值。

  3. 调度策略添加完成后,单击“创建工作负载”。

通过YAML配置节点亲和调度策略

工作负载节点亲和性规则通过节点标签实现。CCE集群中节点在创建时会自动添加一些标签,常用的节点标签如下(更多标签请参见节点固有标签):

  • topology.kubernetes.io/zone:表示节点所在的可用区(availability zone),可在指定可用区调度时使用。
  • kubernetes.io/hostname:节点的hostname,可在指定节点调度时使用。
  • cce.cloud.com/cce-nodepool:节点所属的节点池,可在指定节点池调度时使用。

设置节点亲和性示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  gpu
  labels:
    app:  gpu
spec:
  selector:
    matchLabels:
      app: gpu
  replicas: 3
  template:
    metadata:
      labels:
        app:  gpu
    spec:
      containers:
      - image:  nginx:alpine
        name:  gpu
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
          limits:
            cpu: 100m
            memory: 200Mi
      imagePullSecrets:
      - name: default-secret
      affinity:  # 设置调度策略
        nodeAffinity:  # 表示节点亲和性调度
          requiredDuringSchedulingIgnoredDuringExecution:  # 表示必须满足的调度策略
            nodeSelectorTerms:     # 根据节点标签选择满足条件的节点
              - matchExpressions:    # 节点标签匹配规则
                - key: gpu   # 节点标签的键为gpu
                  operator: In  # 表示存在values列表中的值即满足规则
                  values:   # 节点标签的值为true
                  - "true"
          preferredDuringSchedulingIgnoredDuringExecution:  # 表示尽量满足的调度策略
            - weight: 100  # 使用尽量满足策略时可设置优先级,取值为1-100,数值越大优先级越高
              preference:  # 使用尽量满足策略时,设置优先选择的节点标签匹配规则
                matchExpressions:   # 节点标签匹配规则
                  - key: topology.kubernetes.io/zone   # 节点可用区的标签
                    operator: In  # 表示存在values列表中的值即满足规则
                    values:   # 节点标签的值为az1
                    - "az1"

本示例中,必须满足的规则表示调度的节点必须包含一个键名为gpu的标签,且标签值为true。而尽量满足规则表示根据节点可用区的标签topology.kubernetes.io/zone进行优先级排序,尽量将Pod调度至可用区az1的节点上。

如果需要实现节点反亲和,可使用NotIn和DoesNotExist操作符,反向筛选节点标签值即可。

分享:

    相关文档

    相关产品