设置节点亲和调度
Kubernetes在调度工作负载时支持将节点作为亲和对象,将工作负载调度至具有指定标签和标签值的节点上。例如,某些节点支持使用GPU算力,则可以使用节点亲和调度,确保高性能计算的Pod最终运行在GPU节点上。
通过控制台配置节点亲和调度策略
- 在创建工作负载时,在“高级设置”中找到“调度策略”。创建工作负载的步骤详情请参见创建工作负载。
- 选择节点亲和调度的策略类型。
- 不配置:不设置节点亲和策略。
- 指定节点调度:指定工作负载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:仅在节点亲和性中设置,调度节点的标签值小于列表值 (字符串比较)。
标签值
设置节点亲和性时,填写节点标签对应的标签值。
- 调度策略添加完成后,单击“创建工作负载”。
通过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操作符,反向筛选节点标签值即可。