在阿里云 ACK 上实现低成本弹性伸缩
本教程将介绍如何在阿里云 ACK 上实现低成本弹性伸缩,此后假设您对 Kubernetes(俗称 K8s)有基本的认知如完成 K8s 官网上的 Learn Kubernetes Basics [1] 或 edX 上的 LFS158x: Introduction to Kubernetes [2] 课程,以及已经注册阿里云个人账号并开通相关服务。
阿里云容器服务介绍
ACK 托管 K8s 服务
阿里云 ACK [3] 是阿里云上的托管 K8s 服务,(托管)指的是所创建的 K8s 集群中,用户只需要为数据平面上的工作节点所占用的资源付费并管理这些工作节点,而控制平面则直接由阿里云管理;这无疑减轻了用户对集群实施有效运维管理所需的时间、精力与费用,让用户能把更多精力投放到业务系统与 APP 的维护上。
ACK 集群能实时根据资源需求实现弹性伸缩,主要分为两大类型:
- 资源弹性伸缩:ACK 集群可在现有工作节点资源压力增加时(如 CPU、内存使用率飙升)新增节点并自动把新增节点加到集群中,支持的节点类型包括 ECS 虚拟机、EBM [4] 裸金属云服务器、带有显卡的 ECS 实例、竞价型实例以及稍后详细介绍的虚拟节点
- APP 弹性伸缩:用户可透过上游 K8s 的 Pod 水平自动扩缩(HPA)对象或阿里云提供的容器定式伸缩(CronHPA) [5] 定制资源(CRD)[6] 对象根据一种或多种指标实时增加、缩减 APP 的实例(Pod)数量,指标大致上分为资源指标、定制指标、外部指标三大类型;该类型弹性伸缩并不会直接影响集群的工作节点数量,但需要底层资源的支撑,因此经常会与资源弹性伸缩一起使用
由于 ACK 托管 K8s 集群的管理与收费是以工作节点的数量与规格为标准的;因此,倘若用户的容量规划安排不妥善、弹性伸缩的指标不完善,导致工作节点的资源使用率长期低下,则会造成资源与用户资金的浪费,这种情况在业界中并非罕见。
ASK Serverless K8s 服务
阿里云 ASK [7] 是 ACK 集群的一种,属于无服务器架构(英文称之为 serverless)的 K8s 服务,与托管 K8s 服务最大的分别是,serverless 集群的用户不用维护集群里的任何节点,只管往集群里部署 APP 与业务系统就行了。
Serverless 集群相对于自管集群、托管集群有几大优势:
- 用户不用费时间、精力、金钱对主节点进行运维管理
- 用户不用费时间、精力、金钱对工作节点进行运维管理
- 用户只需要为运行中的 Pod 所使用的资源付费
- 用户不用进行容量规划及考虑资源弹性伸缩,只需考虑 APP 本身的弹性伸缩,而 APP 弹性伸缩一般比资源弹性伸缩反应更快
- 对于批处理任务如 AI 训练、大数据分析等间歇性工作负载,serverless 的收费模式更优秀,使得用户的成本降低
可是 serverless 集群也不适用于所有情况,例如它未必能满足高度定制化的需求,或者对于长期运行、资源使用率稳定的 APP,ACK 结合包年包月计费的 ECS 工作节点或许更为划算。
与 ACK 托管集群不同,ASK 集群的 Pod 后台并不依靠 ECS 虚拟机支持,而是透过虚拟节点中的 ECI [8] 服务实现。
以上图片取自 ASK overview [8]
运用 ACK + 虚拟节点结合 ACK、ASK 的优势
阿里云 ACK 集群支持各类型规格 ECS 工作节点与 ASK 的虚拟节点混合使用,这代表用户可把长期运行且对资源有稳定需求的 APP 部署到包年包月的 ECS 实例上,然后把批处理任务及 APP 突发的资源需求(如业务顶峰)分派到 ECI 上实现弹性伸缩,这种混合模式能充分运用两种模式各自的优点,确保业务系统与 APP 服务稳定的同时把成本降到最低。
以上图片取自 ack-virtual-node [9]
这种模式的具体实现可依靠虚拟节点、ElasticWorkload [10] 、HPA / CronHPA 实现,结合虚拟节点对竞价性计费模式的支持。
我们将于实战环节亲手体验这种实现方案,但由于时间关系并不包括 HPA / CronHPA 的部分;对 HPA / CronHPA 有兴趣的伙伴们可自行研究如何把 HPA / CronHPA 加进去。
实战环节
实战环节内容基于 aliyun-ack-ew-lab GitHub 仓库 [11] ,我们将创建一个单节点 ACK 集群,接着部署虚拟节点及 ElasticWorkload 控制器,并透过 ElasticWorkload 实现对 NGINX 工作负载从 ECS 节点到 ECI 的伸缩,同时在虚拟节点上透过标签与注解运用竞价型计费模式的 Pod 。
实验环境
实验环境采用 ACK 托管 K8s 集群,配置如下:
- 规格:标准
- K8s 版本:1.26.3-aliyun.1
- 容器运行时(CRI):containerd 1.6.20
- 容器网络(CNI):Terway、支持 NetworkPolicy
- VPC 网段:172.16.0.0/12
- 节点、Pod vSwitch 网段:172.28.224.0/20
- Service 网段:192.168.0.0/16
- 节点数量:1
- 节点规