本文介绍当ACK集群中真实节点(即ECS节点)计算资源不足时,如何通过virtual-kubelet-autoscaler插件将Pod调度到虚拟节点(VK),为您的业务提高海量弹性能力。
背景信息
virtual-kubelet-autoscaler是阿里云提供的Kubernetes Autoscaler插件,在Pod调度时,如果没有匹配的node节点,会由virtual-kubelet-autoscaler进行接管,把调度失败的Pod重新调度到ECI上。

前提条件
已创建ACK集群,且已在集群中部署虚拟节点(VK)。更多信息,请参见ACK使用ECI。
步骤一:安装virtual-kubelet-autoscaler
登录容器服务管理控制台。
在左侧导航栏,选择市场>应用市场。
在应用市场页面,找到ack-virtual-kubelet-autoscaler应用,然后单击该应用。
在应用详情页面,单击右上角的一键部署。
在创建面板,完成基本信息和参数配置。
选择目标集群、命名空间和发布名称,然后单击下一步。
根据需要配置参数,然后单击确定。
安装后,在集群管理页的左侧导航栏,选择应用>Helm,可以查看ack-virtual-kubelet-autoscaler的状态,当状态为已部署时,表示安装完成。
步骤二:确认节点资源使用情况
当真实节点计算资源不足时,virtual-kubelet-autoscaler插件才会将创建失败的Pod自动调度到虚拟节点(VK)上。验证virtual-kubelet-autoscaler的效果前,您可以集群管理页的节点页面查看节点资源使用情况。
在容器服务管理控制台,单击目标集群ID,进入集群管理页面。
在左侧导航栏选择节点管理>节点。
查看节点资源使用情况。
本文采用的示例环境如下,您可以根据自身集群情况进行模拟。
真实节点:1台ECS,规格为ecs.c6e.xlarge(4 vCPU 8 GiB内存),已部署1个deployment,CPU请求接近100%。
虚拟节点:1个,名称为virtual-kubelet-cn-beijing-k,未部署工作负载。
步骤三:部署deployment
下文以命令行的形式部署deployment,您也可以在容器服务管理控制台的集群管理页,选择工作负载>无状态来部署deployment。
连接集群。具体操作,请参见在CloudShell上通过kubectl管理Kubernetes集群。
准备YAML文件。
vim deployment-autoscaler.yaml
deployment-autoscaler.yaml的内容示例如下,配置副本数(replicas)为4,每个副本的容器声明了2 vCPU 4 GiB的计算资源。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-autoscaler labels: app: nginx spec: replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 resources: requests: cpu: 2 memory: 4Gi
创建deployment。
kubectl create -f deployment-autoscaler.yaml
步骤四:确认Pod调度情况
查看Pod运行情况。
kubectl get pods -o wide
返回示例如下,可以看到步骤三创建的Pod均运行在虚拟节点上。
查看Pod的事件信息,确认调度情况。
示例查看名为nginx-deployment-autoscaler-54bbf8898-7fdrl的Pod的信息,命令如下:
kubectl describe pod nginx-deployment-autoscaler-54bbf8898-7fdrl
返回示例如下,在Events中可以看到由于真实节点计算资源不足,kube-scheduler通过virtual-kubelet-autoscaler把Pod调度到了虚拟节点上。