文档首页/ 云容器引擎 CCE/ 用户指南/ 工作负载/ 调度工作负载/ 设置节点亲和调度(nodeAffinity)
更新时间:2024-11-12 GMT+08:00

设置节点亲和调度(nodeAffinity)

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

配置节点亲和调度策略

您可以通过不同的方式配置节点亲和性调度策略,将Pod调度到满足条件的节点。

本文示例中,集群内已创建GPU节点,并设置标签为gpu=true,您可以通过该标签将Pod调度到GPU节点上。

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”
  3. 在创建工作负载时,在“高级设置”中找到“调度策略”,选择节点亲和调度的策略类型,本示例中选择自定义亲和策略。创建工作负载的其余步骤详情请参见创建工作负载

    表1 调度策略类型

    参数

    参数说明

    示例

    节点亲和

    • 不配置:不设置节点亲和策略。
    • 指定节点调度:指定工作负载Pod部署的节点。若不指定,将根据集群默认调度策略随机调度。
    • 指定节点池调度:指定工作负载Pod部署的节点池。若不指定,将根据集群默认调度策略随机调度。
    • 自定义亲和策略:根据节点标签实现灵活的调度策略,支持的亲和性规则请参见表2。选择合适的策略类型后可以添加对应的调度策略,参数详情请参见表3

    自定义亲和策略

  4. 选择合适的节点亲和性规则,并单击,添加相应的调度策略。本示例中在必须满足的类别下添加调度策略,表示节点必须拥有指定节点才可以调度该工作负载。

    表2 亲和性规则

    参数

    参数说明

    示例

    节点亲和性

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

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

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

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

    必须满足

  5. 在右侧弹出窗口中单击“添加策略”,设置节点标签筛选规则。

    您也可以单击“指定节点”“指定可用区”通过控制台快速选择需要调度的节点或可用区。

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

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

    参数

    参数说明

    示例

    权重

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

    -

    标签名

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

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

    gpu

    操作符

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

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

    In

    标签值

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

    true

  6. 调度策略添加完成后,单击“创建工作负载”。
  7. 验证Pod全部运行在目标节点上。

    1. 在集群控制台左侧导航栏中选择“工作负载”
    2. 单击工作负载名称,进入详情页面,查看实例列表,验证Pod全部运行在目标节点上,即节点包含gpu=true标签。

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

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

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

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"

节点亲和性调度不存在反亲和策略,如果需要实现节点反亲和,您可使用NotIn和DoesNotExist操作符,反向筛选节点标签值即可。