ACK Pro集群支持ECS和ACS算力混合调度

自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您可以在应用发布或扩容过程中,自定义资源策略(ResourcePolicy),设置应用实例Pod被调度到ACS,实现ECS和ACS Pod的混合部署。

重要

自调度器版本v1.x.x-aliyun-6.4开始,自定义弹性资源优先级功能的ignorePreviousPod字段的默认值将修改为False,ignoreTerminatingPod字段的默认值将修改为True。涉及这些字段的存量ResourcePolicy不受影响,后续更新也不受影响。

使用限制

  • 本功能在缩容场景,与pod-deletion-cost同时使用,将无法保证一定按照逆序缩容。

  • max字段仅支持在集群版本为1.26及以上,且调度器版本为6.7及以上的版本中开启。

  • 在与弹性节点池同时使用时,可能会导致弹性节点池无法弹出节点。因此使用时请将弹性节点池包含在某个Unit中,且对应的Unit不设置max字段。

使用方式

关于ACK Pro集群自定义弹性资源优先级调度功能说明,请参见自定义弹性资源优先级调度

前提条件

  • 对于不同ACK版本的集群,调度器、虚拟节点版本需要满足以下要求。

    ACK版本

    调度器版本

    虚拟节点版本

    1.26及以上

    v1.26.3-aliyun-6.7.0及以上

    v2.13.0-beta.2及以上

  • 关于调度器各版本支持的功能,请参见kube-scheduler

  • 关于ACK Pro集群启用ACS算力,具体操作,请参见通过ACK集群Pro版使用ACS算力

ECS和ACS算力混合调度

当您需要部署一个Deployment,此时集群中有3种类型的资源,分别是包年包月的ECS、按量付费的ECS、ACS Pod。为了降低资源使用成本,您希望部署的服务优先调度顺序依次为:包年包月的ECS、按量付费的ECS、ACS Pod。同时在服务缩容时优先删除ACS Pod,然后删除按量付费的ECS上的Pod,最后删除包年包月的ECS上的Pod。示例节点为2核4 GB,ECS和ACS算力混合调度的具体操作步骤如下:

  1. 执行以下命令,对不同付费类型的节点分别打不同的label(此处也可以通过节点池的功能自动标识label)。

    kubectl label node cn-beijing.10.0.3.137 paidtype=subscription 
    kubectl label node cn-beijing.10.0.3.138 paidtype=subscription
    kubectl label node cn-beijing.10.0.6.46 paidtype=pay-as-you-go
    kubectl label node cn-beijing.10.0.6.47 paidtype=pay-as-you-go

    节点label说明

    • paidtype=subscription:包年包月ECS。

    • paidtype=pay-as-you-go:按量付费ECS。

  2. 使用以下YAML内容,创建ResourcePolicy自定义节点池调度顺序。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: nginx
      namespace: default
    spec:
      selector:
        app: nginx               # 此处要与后续创建的Pod的label相关联。
      strategy: prefer
      units:
      - resource: ecs
        nodeSelector:
          paidtype: subscription
      - resource: ecs
        nodeSelector:
          paidtype: pay-as-you-go
      - resource: acs 
  3. 使用以下YAML内容创建Deployment,部署2个Pod。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx                                           # 此处与上一步创建的ResourcePolicy的selector相关联。
            alibabacloud.com/compute-class: general-purpose      # 配置ACS Pod的算力类型,未配置默认general-purpose
            alibabacloud.com/compute-qos: default                # 配置ACS Pod的qos,未配置默认default
        spec:
          containers:
          - name: nginx
            image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: 2
              requests:
                cpu: 2
  4. 创建应用Nginx并查看部署结果。

    1. 执行以下命令,创建应用Nginx。

      kubectl apply -f nginx.yaml 

      预期输出:

      deployment.apps/nginx created
    2. 执行以下命令,查看部署结果。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-b****   1/1     Running   0          66s   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          66s   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      由预期输出得到,前两个Pod被调度到labelpaidtype=subscription的节点上,在本示例中为cn-beijing.10.0.3.137和cn-beijing.10.0.3.138。

  5. 对Pod进行扩容。

    1. 执行以下命令,将Pod扩容到4个。

      kubectl scale deployment nginx --replicas 4

      预期输出:

      deployment.apps/nginx scaled
    2. 执行以下命令,查看Pod状态。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running   0          16s     172.29.113.155   cn-beijing.10.0.6.47    <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running   0          3m48s   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running   0          16s     172.29.113.88    cn-beijing.10.0.6.46    <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          3m48s   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      由预期输出得到,当labelpaidtype=subscription的节点资源不足时,调度到labelpaidtype=pay-as-you-go的节点上,在本示例中为cn-beijing.10.0.6.46和cn-beijing.10.0.6.47。

    3. 执行以下命令,将Pod扩容到6个。

      kubectl scale deployment nginx --replicas 6

      预期输出:

      deployment.apps/nginx scaled
    4. 执行以下命令,查看Pod状态。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE                           NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running   0          3m10s   172.29.113.155   cn-beijing.10.0.6.47           <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running   0          6m42s   172.29.112.215   cn-beijing.10.0.3.137          <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running   0          3m10s   172.29.113.88    cn-beijing.10.0.6.46           <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          6m42s   172.29.113.23    cn-beijing.10.0.3.138          <none>           <none>
      nginx-9cdf7bbf9-s****   1/1     Running   0          36s     10.0.6.68        virtual-kubelet-cn-beijing-j   <none>           <none>
      nginx-9cdf7bbf9-v****   1/1     Running   0          36s     10.0.6.67        virtual-kubelet-cn-beijing-j   <none>           <none>

      由预期输出得到,ECS上的资源不足,Pod被调度到ACS的资源上,在本示例中为virtual-kubelet-cn-beijing-j。

  6. 对Pod进行缩容。

    1. 执行以下命令,将Pod从6个副本缩容到4个。

      kubectl scale deployment nginx --replicas 4

      预期输出:

      deployment.apps/nginx scaled
    2. 执行以下命令,查看Pod状态。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS        RESTARTS   AGE     IP               NODE                           NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running       0          4m59s   172.29.113.155   cn-beijing.10.0.6.47           <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running       0          8m31s   172.29.112.215   cn-beijing.10.0.3.137          <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running       0          4m59s   172.29.113.88    cn-beijing.10.0.6.46           <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running       0          8m31s   172.29.113.23    cn-beijing.10.0.3.138          <none>           <none>
      nginx-9cdf7bbf9-s****   1/1     Terminating   0          2m25s   10.0.6.68        virtual-kubelet-cn-beijing-j   <none>           <none>
      nginx-9cdf7bbf9-v****   1/1     Terminating   0          2m25s   10.0.6.67        virtual-kubelet-cn-beijing-j   <none>           <none>

      由预期输出得到,根据调度节点的逆序,优先缩容在ACS上的Pod。

    3. 执行以下命令,将4个副本缩容到2个。

      kubectl scale deployment nginx --replicas 2

      预期输出:

      deployment.apps/nginx scaled
    4. 执行以下命令,查看Pod状态。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS        RESTARTS   AGE     IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   0/1     Terminating   0          6m43s   172.29.113.155   cn-beijing.10.0.6.47    <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running       0          10m     172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-f****   0/1     Terminating   0          6m43s   172.29.113.88    cn-beijing.10.0.6.46    <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running       0          10m     172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      由预期输出得到,根据调度节点的逆序,优先缩容位于labelpaidtype=pay-as-you-go节点上的Pod。

    5. 等待一段时间,再次执行以下命令,查看Pod状态。

      kubectl get pods -o wide

      预期输出:

      NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-b****   1/1     Running   0          11m   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          11m   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      由预期输出得到,当前只存在labelpaidtype=subscription节点上的Pod。

相关文档

  • 在ACK集群中部署服务时,您可以使用容忍度和节点亲和性来声明只使用ECS或ACS算力资源,或者是在ECS资源不足时自动申请ACS算力资源。通过配置调度策略,您可以在不同工作负载场景下实现对弹性资源的不同需求。详细信息,请参见通过ACK集群Pro版使用ACS算力

  • 高可用以及高性能是分布式任务执行过程中的重要要求。在ACK集群Pro版中,您可以通过Kubernetes原生调度语义实现分布式任务的跨可用区打散,以达到高可用区部署的要求,或者通过Kubernetes原生调度语义实现分布式任务在指定可用区中的亲和性部署,以达到高性能部署的要求。详细信息,请参见节点亲和性调度