通过ack-co-scheduler实现多级弹性调度

在混合云场景下,通过多级弹性调度,可以使您线上线下混合部署的业务能更好的发挥混合云的优势,实现业务高可用,并能根据波峰波谷进行弹性资源申请等。本文介绍如何通过ack-co-scheduler进行多级弹性调度。

前提条件

  • 已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创建注册集群

  • 系统组件版本要求具体如下表所示。

    组件

    版本要求

    Kubernetes

    1.18.8及以上版本

    Helm

    3.0及以上版本

    Docker

    19.03.5

    操作系统

    CentOS 7.6、CentOS 7.7、Ubuntu 16.04和Ubuntu 18.04、Alibaba Cloud Linux

背景信息

混合云场景下的多级弹性调度是自定义弹性资源优先级调度的扩展,新增了IDC弹性资源类型。自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您可以在应用发布或扩容过程中,自定义资源策略(ResourcePolicy),设置应用实例Pod被调度到不同类型节点资源的顺序。同时在缩容过程中按照原调度顺序逆序缩容。更多信息,请参见自定义弹性资源优先级调度

使用限制

  • 本功能与pod-deletion-cost冲突,不能同时使用。关于pod-deletion-cost的更多信息,请参见pod-deletion-cost

  • 本功能暂不支持与使用ECI弹性调度混合使用。关于ECI弹性调度的更多信息,请参见使用ECI弹性调度

  • 修改ResourcePolicy的策略时,已调度的Pod将按照原ResourcePolicy的顺序进行缩容,新建的Pod将按照更新后ResourcePolicy的顺序进行缩容。

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

  • 与ResourcePolicy关联的Pod未完全删除时,请不要对ResourcePolicy进行修改。

使用方式

使用以下内容,创建ResourcePolicy定义弹性资源优先级。

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
  name: xxx
  namespace: xxx
spec:
  selector:
    key1: value1
  strategy: prefer
  units:
  - resource: idc
    max: 3
  - resource: ecs
    nodeSelector:
      key2: value2
  - resource: ecs
    nodeSelector:
      key3: value3
  - resource: eci
  • selector:声明ResourcePolicy作用于同一命名空间下label上打了key1=value1的Pod。

  • strategy:调度策略选择,目前只支持prefer

  • units:用户自定义的调度单元。扩容时,将按照units下资源的顺序进行扩容;缩容时,将按照逆序进行缩容。

    • resource:弹性资源的类型,目前支持eciecsidc三种类型。

    • nodeSelector:用nodelabel标识该调度单元下的节点,只对ecs资源生效。

    • max:在该组资源最多部署多少个实例。

安装相关组件

使用多级弹性调度,您需要安装以下组件。

  • ack-virtual-node:可选组件,如需使用弹性ECI能力,才需在注册集群中安装ack-virtual-node组件。

  • ack-co-scheduler:通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。

    通过onectl安装

    1. 在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群

    2. 执行以下命令,安装ack-virtual-node和ack-co-scheduler组件。

      onectl addon install ack-virtual-node
      onectl addon install ack-co-scheduler

      预期输出:

      Addon ack-virtual-node, version **** installed.
      Addon ack-co-scheduler, version **** installed.

    通过控制台安装

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

    3. 组件管理页面的搜索框中分别搜索ack-virtual-node和ack-co-scheduler组件,并在对应组件卡片的右下方单击安装

    4. 在提示对话框中单击确定

场景一:多级优先级调度

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

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: cost-balance-policy
    spec:
      selector:
        app: nginx
      strategy: prefer
      units:
      - resource: idc
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id=np7b30b52e99194275a3940936c19ea42b
      - resource: eci
  2. 使用以下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
          annotations:
            addannotion: "true"
          labels:
            app: nginx      # 此处要与上一步创建的ResourcePolicy的selector相关联。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: nginx
            resources:
              requests:
                cpu: 200m
              limits:
                cpu: 1
  3. 执行以下命令,创建应用Nginx。

    kubectl apply -f nginx.yaml
  4. 执行以下命令,对Pod进行扩容。

    kubectl scale deployment nginx --replicas 10

    预期输出:

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

    kubectl get pod -o wide

    预期输出:

    展开查看预期输出

    NAME                          READY   STATUS   RESTARTS        AGE    IP             NODE                           NOMINATED NODE   READINESS GATES
    nginx-load-85b845cffd-58bhb   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-7bv5h   1/1     Running   0              32s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-9bsz2   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-bh7bs   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-crqhv   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-crrnz   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-h8swv   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-hfdkv   1/1     Running   0              32s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-ttrhg   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-vf8lg   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>

    控制应用Nginx的副本数目后查看调度结果,可以看到其部署策略符合预期:资源调度顺序为优先IDC资源,其次为ECS资源,最后是ECI资源。

场景二:线上线下混合部署

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

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: load-balance-policy
    spec:
      selector:
        app: nginx
      strategy: prefer
      units:
      - resource: idc
        max: 2
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id=np7b30b52e99194275a3940936c19ea42b
        max: 4
      - resource: eci
  2. 使用以下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
          annotations:
            addannotion: "true"
          labels:
            app: nginx    # 此处要与上一步创建的ResourcePolicy的selector相关联。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: nginx
            resources:
              requests:
                cpu: 200m
              limits:
                cpu: 1                      
  3. 执行以下命令,创建应用Nginx。

    kubectl apply -f nginx.yaml
  4. 执行以下命令,扩容Pod。

    kubectl scale deployment nginx --replicas 10

    预期输出:

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

    kubectl get pod -o wide

    预期输出:

    展开查看预期输出

    NAME                          READY   STATUS   RESTARTS        AGE    IP             NODE                           NOMINATED NODE   READINESS GATES
    nginx-load-85b845cffd-6r7lv   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-dk6nr   1/1     Running   0              33s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-lkgxk   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-r8ngs   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-rftlj   1/1     Running   0              33s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-rrht6   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-skrqm   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-tnrqf   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-tv7rt   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-vprqr   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>

    控制应用Nginx的副本数目查看调度结果,可以看到其部署策略符合预期:在资源足够情况下,IDC有2个Pod,ECS有4个Pod,其他副本在ECI上。