ACS集群中Node对象以虚拟节点的形式提供,虚拟节点以label的形式标记了各类属性,例如可用区、地域,以及虚拟节点的GPU型号等。在ACS集群中,您可以通过Kubernetes原生调度语义实现节点亲和性调度,通过在nodeSelector
或nodeAffinity
字段中填写特定的节点属性,可以将应用运行在特定属性的虚拟节点上。本文介绍ACS的节点亲和性调度。
前提条件
已安装调度器组件kube-scheduler,且版本满足以下要求。
ACS集群版本
调度器组件版本
ACS集群版本
调度器组件版本
1.31
v1.31.0-aliyun-1.2.0及以上
1.30
v1.30.3-aliyun-1.1.1及以上
1.28
v1.28.9-aliyun-1.1.0及以上
已安装acs-virtual-node组件,版本为v2.12.0-acs.4或以上。
注意事项
nodeSelector
nodeSelector中可以直接指定虚拟节点中的标签,来实现节点亲和性调度。针对不同种类的虚拟节点,ACS分别支持以下标签。
虚拟节点类型 | Label | 含义 | 样例 |
虚拟节点类型 | Label | 含义 | 样例 |
普通虚拟节点 | topology.kubernetes.io/zone | 网络可用区 | topology.kubernetes.io/zone: cn-shanghai-b |
高性能网络GPU型虚拟节点 | topology.kubernetes.io/zone | 网络可用区 | topology.kubernetes.io/zone: cn-shanghai-b |
alibabacloud.com/hpn-zone | 高速网络可用区 | alibabacloud.com/hpn-zone: B1 | |
alibabacloud.com/gpu-model-series | GPU型号 | alibabacloud.com/gpu-model-series: <example-model> |
nodeAffinity
nodeAffinity同样可以声明节点的亲和性属性,但其语法表达能力更强,对于不同的计算类型,ACS在具体字段上存在以下约束。
计算类型 | 协议字段 | 含义 | 约束条件 |
计算类型 | 协议字段 | 含义 | 约束条件 |
| requiredDuringSchedulingIgnoredDuringExecution | 只有在规则被满足的时候才能执行调度,类似 | nodeSelectorTerms字段中:
|
preferredDuringSchedulingIgnoredDuringExecution | 按权重指定节点亲和性,调度器会尝试寻找满足对应规则的节点,如果找不到匹配的节点,调度器仍然会调度该Pod。 | 不支持。 |
对于通用型和性能型实例,nodeAffinity
协议不存在以上约束。
操作示例
示例中展示了通过配置nodeSelector将应用调度到指定可用区的效果。
执行以下命令,查看集群中的虚拟节点。
kubectl get node
预期输出:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.3-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.3-xx
使用以下YAML内容,创建dep-node-selector-demo.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 4 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo spec: containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # 指定可用区为cn-hangzhou-j nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-j
执行以下命令,将应用部署到集群。
kubectl apply -f dep-node-selector-demo.yaml
执行以下命令,查看Pod调度的分布情况。
kubectl get pod -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-node-selector-demo-b4578576b-cgpfq 1/1 Running 0 112s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-fs8kl 1/1 Running 0 110s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-nh8zm 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-rpp8l 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none>
可以看到4个Pod都分布在
cn-hangzhou-j
可用区。
- 本页导读 (0)
- 前提条件
- 注意事项
- nodeSelector
- nodeAffinity
- 操作示例