节点亲和性调度

ACS集群中Node对象以虚拟节点的形式提供,虚拟节点以label的形式标记了各类属性,例如可用区、地域,以及虚拟节点的GPU型号等。在ACS集群中,您可以通过Kubernetes原生调度语义实现节点亲和性调度,通过在nodeSelector或nodeAffinity字段中填写特定的节点属性,可以将应用运行在特定属性的虚拟节点上。本文介绍ACS的节点亲和性调度。

前提条件

  • 已创建ACS集群。具体操作,请参见创建ACS集群

  • 已安装kube-scheduler组件,详见kube-scheduler

  • 已安装acs-virtual-node,版本为v2.12.0-acs.4及以上。

注意事项

nodeSelector中可以直接指定虚拟节点中的标签,来实现节点亲和性调度。针对不同种类的虚拟节点,ACS分别支持以下标签。

虚拟节点类型

Label

含义

样例

普通虚拟节点

topology.kubernetes.io/zone

网络可用区

topology.kubernetes.io/zone: cn-shanghai-b

nodeAffinity同样可以声明节点的亲和性属性,但其语法表达能力更强,对于不同的compute class,ACS在具体字段上存在以下约束。

计算类

协议字段

含义

约束条件

  • GPU型

requiredDuringSchedulingIgnoredDuringExecution

只有在规则被满足的时候才能执行调度,类似nodeSelector

nodeSelectorTerms字段中:

  • 仅支持在matchExpressions中填写以上亲和性标签。

  • 不支持填写matchFields。

preferredDuringSchedulingIgnoredDuringExecution

按权重指定节点亲和性,调度器会尝试寻找满足对应规则的节点,如果找不到匹配的节点,调度器仍然会调度该Pod。

不支持。

对于通用型和性能型实例,nodeAffinity协议不存在以上约束。

操作示例

示例中展示了通过配置nodeSelector将应用调度到指定可用区的效果。

  1. 执行以下命令,查看集群中的虚拟节点。

    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
  2. 使用以下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
  3. 执行以下命令,将应用部署到集群。

    kubectl apply -f dep-node-selector-demo.yaml
  4. 执行以下命令,查看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可用区。