# 设置节点亲和调度（nodeAffinity）
Kubernetes在调度工作负载时支持将节点作为亲和对象，将工作负载调度至具有指定标签和标签值的节点上。例如，某些节点支持使用GPU算力，则可以使用节点亲和调度，确保高性能计算的Pod最终运行在GPU节点上。
#### 配置节点亲和调度策略
您可以通过不同的方式配置节点亲和性调度策略，将Pod调度到满足条件的节点。
- [通过控制台配置]
  本文示例中，集群内已创建GPU节点，并设置标签为gpu=true，您可以通过该标签将Pod调度到GPU节点上。
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称进入集群，在左侧选择"工作负载"，在右上角单击"创建工作负载"。
  
  3. 在创建工作负载时，在"高级配置"中找到"调度策略"，选择节点亲和调度的策略类型，本示例中选择**自定义亲和策略** 。创建工作负载的其余步骤详情请参见[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)。
     
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002068145737.png "点击放大")
     表1调度策略类型 
     | 参数     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 示例           |
     |:---|:---|:---|
     | 节点亲和 | - **不配置**：不设置节点亲和策略。  - **指定节点调度**：指定工作负载Pod部署的节点，系统将根据节点上的kubernetes.io/hostname标签筛选节点，每个节点具有唯一的标签值。若不指定，将根据集群默认调度策略随机调度。  - **指定节点池调度**：指定工作负载Pod部署的节点池，系统将根据节点上的cce.cloud.com/cce-nodepool标签筛选节点。对于同一个节点池下的节点，该标签值相同，因此该节点池下的所有节点均可被调度。若不指定，将根据集群默认调度策略随机调度。  - **自定义亲和策略** ：根据节点标签实现灵活的调度策略，支持的亲和性规则请参见[表2]。选择合适的策略类型后可以添加对应的调度策略，参数详情请参见[表3]。   | **自定义亲和策略** |
        
     
     
  
  4. 选择合适的节点亲和性规则，并单击![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002069623273.png "点击放大")，添加相应的调度策略。本示例中在**必须满足** 的类别下添加调度策略，表示节点必须拥有指定节点才可以调度该工作负载。
     
      表2亲和性规则 
     | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                         | 示例     |
     |:---|:---|:---|
     | 节点亲和性 | - **必须满足** ：即硬约束，设置必须要满足的条件，对应requiredDuringSchedulingIgnoredDuringExecution。 添加多条"必须满足"规则时，只需要满足一条规则就会进行调度。   - **尽量满足** ：即软约束，设置尽量满足的条件，对应preferredDuringSchedulingIgnoredDuringExecution。 添加多条"尽量满足"规则时，满足其中一条或者都不满足也会进行调度。    | **必须满足** |
        
     
     
  
  5. 在右侧弹出窗口中单击"添加策略"，设置节点标签筛选规则。 
     您也可以单击"指定节点"或"指定可用区"通过控制台快速选择需要调度的节点或可用区。
     "指定节点"和"指定可用区"本质也是通过标签实现，只是通过控制台提供了更为便捷的操作，无需手动填写节点标签和标签值。指定节点使用的是 kubernetes.io/hostname 标签，指定可用区使用的是 failure-domain.beta.kubernetes.io/zone 标签。
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002032044094.png "点击放大")
      表3节点亲和性调度策略设置参数说明 
     | 参数 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 示例     |
     |:---|:---|:---|
     | 权重    | 仅支持在"尽量满足"策略中添加。权重的取值范围为1-100，调度器在进行调度时会将该权重视为一个附加的评分项，并将其与节点的其他优先级函数评分相加。最终，调度器会将Pod调度到总分最大的节点上。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | -        |
     | 标签名  | 设置节点亲和性时，填写需要匹配的节点标签。 该标签可以使用系统默认的标签，也可以使用自定义标签。系统默认的节点标签详情请参见[节点固有标签](https://support.huaweicloud.com/usermanual-cce/cce_10_0004.html#cce_10_0004__section74111324152813)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | **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标签。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002033578976.png "点击放大")
        
        
     
     
     
     
   
- [通过YAML配置]
  工作负载节点亲和性规则通过节点标签实现。CCE集群中节点在创建时会自动添加一些标签，常用的节点标签如下（更多标签请参见[节点固有标签](https://support.huaweicloud.com/usermanual-cce/cce_10_0004.html#cce_10_0004__section74111324152813)）：
  - 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"
  ```
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  节点亲和性调度不存在反亲和策略，如果需要实现节点反亲和，您可使用NotIn和DoesNotExist操作符，反向筛选节点标签值即可。
#### 相关文档
- [设置指定节点调度（nodeSelector）](https://support.huaweicloud.com/usermanual-cce/cce_10_0891.html)
- [设置工作负载亲和/反亲和调度（podAffinity/podAntiAffinity）](https://support.huaweicloud.com/usermanual-cce/cce_10_0893.html)
- [节点池亲和性调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0767.html)
 
