在混合云场景下,通过多级弹性调度,可以使您线上线下混合部署的业务能更好的发挥混合云的优势,实现业务高可用,并能根据波峰波谷进行弹性资源申请等。本文介绍如何通过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
:弹性资源的类型,目前支持eci
、ecs
和idc
三种类型。nodeSelector
:用node
的label
标识该调度单元下的节点,只对ecs
资源生效。max
:在该组资源最多部署多少个实例。
安装相关组件
使用多级弹性调度,您需要安装以下组件。
ack-virtual-node:可选组件,如需使用弹性ECI能力,才需在注册集群中安装ack-virtual-node组件。
ack-co-scheduler:通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。
通过onectl安装
在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群。
执行以下命令,安装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.
通过控制台安装
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面的搜索框中分别搜索ack-virtual-node和ack-co-scheduler组件,并在对应组件卡片的右下方单击安装。
在提示对话框中单击确定。
场景一:多级优先级调度
使用以下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
使用以下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
执行以下命令,创建应用Nginx。
kubectl apply -f nginx.yaml
执行以下命令,对Pod进行扩容。
kubectl scale deployment nginx --replicas 10
预期输出:
deployment.apps/nginx scaled
执行以下命令,查看Pod状态。
kubectl get pod -o wide
预期输出:
控制应用Nginx的副本数目后查看调度结果,可以看到其部署策略符合预期:资源调度顺序为优先IDC资源,其次为ECS资源,最后是ECI资源。
场景二:线上线下混合部署
使用以下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
使用以下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
执行以下命令,创建应用Nginx。
kubectl apply -f nginx.yaml
执行以下命令,扩容Pod。
kubectl scale deployment nginx --replicas 10
预期输出:
deployment.apps/nginx scaled
执行以下命令,查看Pod状态。
kubectl get pod -o wide
预期输出:
控制应用Nginx的副本数目查看调度结果,可以看到其部署策略符合预期:在资源足够情况下,IDC有2个Pod,ECS有4个Pod,其他副本在ECI上。