设置节点亲和调度(nodeAffinity)
Kubernetes在调度工作负载时支持将节点作为亲和对象,将工作负载调度至具有指定标签和标签值的节点上。例如,某些节点支持使用GPU算力,则可以使用节点亲和调度,确保高性能计算的Pod最终运行在GPU节点上。
配置节点亲和调度策略
您可以通过不同的方式配置节点亲和性调度策略,将Pod调度到满足条件的节点。
本文示例中,集群内已创建GPU节点,并设置标签为gpu=true,您可以通过该标签将Pod调度到GPU节点上。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”。
- 在创建工作负载时,在“高级设置”中找到“调度策略”,选择节点亲和调度的策略类型,本示例中选择自定义亲和策略。创建工作负载的其余步骤详情请参见创建工作负载。
- 选择合适的节点亲和性规则,并单击,添加相应的调度策略。本示例中在必须满足的类别下添加调度策略,表示节点必须拥有指定节点才可以调度该工作负载。
- 在右侧弹出窗口中单击“添加策略”,设置节点标签筛选规则。
您也可以单击“指定节点”或“指定可用区”通过控制台快速选择需要调度的节点或可用区。
“指定节点”和“指定可用区”本质也是通过标签实现,只是通过控制台提供了更为便捷的操作,无需手动填写节点标签和标签值。指定节点使用的是 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
- 调度策略添加完成后,单击“创建工作负载”。
- 验证Pod全部运行在目标节点上。
工作负载节点亲和性规则通过节点标签实现。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操作符,反向筛选节点标签值即可。