本篇作者丨箫竹
前言
在云计算越来越普及的今天,企业对云的讨论焦点已经从几年前的「是否上云」转换为「如何快速上云」和上云之后「如何低成本用云」等问题。新的焦点问题对云提出了新的要求:容器化、自动部署、自动发布、弹性扩缩容、监控告警等云上业务生命周期的方方面面。除此之外,随着业务架构的不断复杂,高可用、多备份、异地多活等方案趋于常态化,由此对多账号、多 Region 部署的需求越来越强烈。
企业应用上云,通常都会根据自身的业务架构,首先选择相关云产品并完成授权,接着搭建网络基础环境、搭建业务架构、配置负载和弹性伸缩策略,最后实现应用上云。
整个过程即复杂又繁琐,但当想要借助编排服务(Terraform,ROS)来简化流程、实现自动化的时候,又遇到了阻碍自动化流程的各种障碍:
- 云产品没有提前开通,导致 OpenAPI 调用失败,编排服务无法工作;
- RAM 权限策略的编写过于复杂,编排模板涉及到哪些策略,无处可查,想要做到精细化的授权难度太大;
- Kubernetes 集群的搭建依赖多种云资源优先创建,但云资源之间存在的复杂的关联和依赖关系却无处可查;
- 每个云账号对大部分资源的使用都存在配额的限制,弹性伸缩的时候往往因为配额不足而失败,进而影响应用的快速扩容;
- ......
一、端到端解决方案
「如何做到自动化上云」成了应用上云路上的一道坎,基于这个现状,阿里云开放平台在通过过去一年的努力,提供了一系列的「端到端解决方案」,旨在消除客户在基于 OpenAPI 上云过程中影响“自动化”的主要障碍。
本文从一个实际场景出发,基于开源资源编排工具 Terraform、 Kubernetes 作业管理的开源项目 Argo 和阿里云的多种服务搭建一个自动化弹性样板间,并利用该样板间完成了 Kubernetes 应用的自动化部署和伸缩,在云上实践“自动化”和“弹性”的同时,切身感受下「端到端解决方案」所带来的重大成果和客户价值。
围绕自动化弹性样板间的具体内容,本文将介绍三种已经落地的方案:
- 云产品自动化开通
什么是自动化开通?为什么要自动化开通?如何做到自动化开通?
- 左手弹性,右手成本
弹性遇到的问题是什么?如何通过配额服务解决?弹性伸缩过程中如何控制成本?
- RAM 权限策略的自动化导出
如何对一个 Terraform 模板中涉及到的资源实现准确、完备和精细化的权限控制?
二、云产品自动化开通
所谓「云产品开通」,是指在注册了一个新的阿里云账号后,首次使用某个云产品服务时,需要阅读该云产品的服务等级协议,并通过点击“开通”按钮来完成该云产品的激活。激活之后才能正常地使用该云产品的控制台、OpenAPI以及资源编排(Terraform,ROS)等服务。
自动化弹性样板间总共涉及到 9 款服务,其中有 3 款服务需要手动开通,当需要支持多账号部署时,需要 3*N 次手动开通操作,费时又费力。同时,对于资源编排服务 Terraform 和 ROS 而言,无疑是致命的,直接阻碍了 Terraform 和 ROS 的成功运行。目前与 Terraform 和 ROS 集成的所有60多款云产品中,分别有 22 和 25 款云产品需要在首次使用前进行手动开通,体验非常差。
为了解决该问题,开放平台提供了自动化开通的方案。所谓「自动化开通」,是指对外提供开通动作的 OpenAPI,通过调用 OpenAPI 或者基于 API 的编排工具实现云服务的自动开通,省去手动开通的麻烦。目前,已经有超过 30 款云产品实现了自动化开通,Terraform 和 ROS 也实现了 100% 全自动化开通的目标,彻底解决了阻碍 Terraform 和 ROS 自动化之路的第一个障碍,也为自动化弹性样板间的成功提供了支持:
data "alicloud_ack_service" "open" { enable = var.enable_service type = "propayasgo" } data "alicloud_log_service" "open" { enable = var.enable_service } data "alicloud_cms_service" "open" { enable = var.enable_service }
如何使用 Terraform 实现自动化开通,详见文章Terraform 支持自动化开通阿里云产品。
三、左手弹性,右手成本
在云上根据业务发展,按需建出资源是云上资源弹性的重要特征,相较于传统IDC机房的机器采购、上架、供应等漫长的周期和运维成本,云上资源的快速供应是客户对云的弹性的最大认可。
为了充分利用和发挥云平台的弹性和分布式特性,必须做到从基础设施到应用都是弹性可伸缩和运维全自动化,以云原生的最佳姿势使用云。自动化弹性样板间正是充分利用和发挥阿里云的弹性优势,实现了云资源和云应用的弹性:
- 基础设施层弹性管理
借助 Terraform 自动创建托管版Kubernetes集群,并基于弹性伸缩服务 ESS 为其自动创建弹性伸缩节点池,当节点池中节点负载达到阈值时实现自动伸缩,从而达到基础设施层弹性管理。
- 业务弹性管理
借助 Terraform 和 Argo 将业务应用自动部署到容器集群的 Pod,并通过配置由 Kubernetes 的 HPA 策略控制业务层的弹性管理。
图片来自:https://help.aliyun.com/document_detail/86554.html
resource "alicloud_cs_managed_kubernetes" "this" { name = local.k8s_name pod_cidr = var.k8s_pod_cidr cluster_spec = "ack.pro.small" worker_number = var.worker_number ... } resource "alicloud_cs_kubernetes_node_pool" "autoscaling" { name = "autoscaling" cluster_id = alicloud_cs_managed_kubernetes.this.id # automatic scaling node pool configuration. scaling_config { min_size = var.autoscaling_node_min_number max_size = var.autoscaling_node_max_number ... } ... }
在如此全自动化架构下,弹性样板间所要面临的挑战是:
- 要求基础资源完全按需使用
包年包月计费类型将无法适用,机器不能随时释放,容易造成资源浪费;
- 资源供应需有保障
按量计费的类型,需要确保资源充足和 100% 创建成功;云资源配额可动态调整;
- 资源成本不能太高,要接近包年包月成本
既要满足按需使用,又要能享受到类似包年包月的折扣;
- 弹性资源的监控
自动弹出的资源可被监控系统自动发现并处于监控之下。
面对如上挑战,得益于「端到端解决方案」的成果,自动化弹性样板间采用了如下解决方案:
3.1 配额中心解决资源使用限制问题
「配额中心」是阿里云开放平台2020年推出的一款新的云产品,提供了实时查询配额、在线发起配额申请、资源配额级联申请、API 流控申请、配额告警等能力,有效地帮助客户根据业务的需要在线调整多种资源配额,解决资源不足带来的问题。
自动化弹性样板间涉及到 9 款云产品,涉及到可调整的配额包括如实例规格的需求量、可保有的EIP 数量、可保有的 SLB 数量、集群节点的数量等有 6 项之多,并且不同配额项之间还可能存在相互依赖、级联和地域之分,每一项配额都需要配置告警规则和配额申请,以便当配额不足而发起告警后可以自动发起配额申请。面对这些复杂的关系,弹性样板间借助配额中心和 Terraform 集成的能力,完成了对不同配额项申请和告警的自动编排,通过查询规则(如:特定 Region 特定 Zone 下的特定实例规格)动态获取当前配额值并配置自动告警规则(如:所剩配额不足一半时发起告警)和自动申请规则(如:所剩配额不足一半时发起当前总配额2倍的申请),以实现配额不足时发起自动申请。
3.2 预留实例券解决资源供应和成本问题
预留实例券(Reserved Instance,简称 RI)是弹性计算团队推出的一种具有特定属性的优惠券,可以自动匹配您账户下的按量付费实例(不含抢占式实例)。相比包年包月实例,预留实例券与按量付费实例这种组合模式可以兼顾灵活性和成本。
在阿里云不支持 RI 之前,客户通过包年包月、抢占式实例和按量付费的组合来实现成本节约,即通常会购买一定量的包年包月,然后在业务尖峰的时候购买按量付费资源进行弹性扩展。当 RI 诞生后,本质上在提供了包年包月的能力的同时还提供了基于弹性伸缩获得比包年包月成本更低的能力。
- 包年包月+按量付费
按照平时业务购买包年包月,业务尖峰时购买按量付费资源进行弹性扩展;业务稳步上升后,需要新购包年包月资源进行扩展(不是弹性伸缩)。因此企业付出的成本等于包年包月的支出加上按量付费的支出。
- 预留实例券
最理想的情况下,全部负载都可以使用RI覆盖,且没有超买,企业付出的成本等同于阴影部分的面积。
两种模式对比,阴影面积越小成本越低,显然RI更能将云计算的弹性发挥到极致,更省钱。自动化弹性样板间通过 Terraform 支持对 RI 按可用区和不同规格购买。结合实例规格配额的消耗情况,不断调整 RI 的购买数量,确保 RI 不过量采购或者 RI 不够用,最大化降低使用成本。
3.3 安装云监控插件解决弹性资源可监控问题
资源监控是 Kubernetes 中最常见的监控方式,通过资源监控可以快速查看负载的CPU、内存、网络等指标的使用率。在阿里云容器服务中,资源监控已经与云监控互通,弹性伸缩的节点池也已支持自动扩展出的 ECS 节点上自动安装云监控插件,借助该插件可实现容器节点的自发现,保障弹性资源纳入监控。当然,这一配置也可以通过 Terraform 来实现自动化:
name = "autoscaling" cluster_id = alicloud_cs_managed_kubernetes.this.id # 自动安装云监控插件 install_cloud_monitor = true # automatic scaling node pool configuration. scaling_config { min_size = var.autoscaling_node_min_number max_size = var.autoscaling_node_max_number ... } ... }
四、RAM 权限策略的自动化导出
前两部分内容重点介绍了如何借助「端到端解决方案」的成果和 Terraform 编写一个全自动化的弹性样板间模板,接下来就是如何正确地运行这个模板来实现样板间的快速搭建。但是,样板间成功运行的前提是用户必须拥有模板中所有资源的操作权限。
对任何一个 Terraform 模板而言,实现对模板精细化权限策略管理的挑战主要包含以下几个方面:
- 无法自动地获取模版中所包含的所有资源
虽然可以通过人工 Review 模板代码或者解析 Terraform 的预览结果来间接地获取模板中所包含的资源,但人工成本将随着资源模板复杂度的增加而增加;
- 无法根据资源准确地推断资源所使用的 OpenAPI 有哪些
Terraform 是声明式的工具,每个资源所调用的 OpenAPI 对资源模板而言完全是黑盒,即使有资源也无法获取到准确的 OpenAPI 信息;
- 无法根据 OpenAPI 写出完整的、细粒度的权限策略
每个 OpenAPI 的鉴权还需要考虑不同的级别,如产品级、资源级以及 API 级;同时最终生成的每一条权限策略中还包含 Region 信息、账号信息和父子资源关系等信息。
面对RAM 权限策略的生成问题和挑战,开放平台在2020年推出了一款新的服务「IaC Service」,这款服务可以识别任一 Terraform 模板中定义的资源,解析每个资源在 CURD 阶段使用到的 OpenAPI,最后根据解析后的结果自动导出 RAM Policy 的内容,提供给最终客户使用。
有了 RAM 权限策略自动化导出的能力,针对 Terrafrom 模板的鉴权,将会大大减少手动编写 RAM Policy 的工作,只需要将 Terraform 模板上传到 IaC Service 上,即可快速得到一个精准的、模板相关的 RAM Policy,也为整个弹性样板间的顺利执行提供了支持。
五、结果展示
借助自动化开通、配额中心的告警和 Quota 申请、预留实例券与 Terraform 的集成、容器服务与 Terraform 的集成和弹性伸缩的支持、RAM Policy 的自动化导出等多种能力,目前自动化弹性样板间已经全面落地,并且已经开源到 Terraform Registry: terraform-alicloud-modules/automation-elastic-landing.
自动化弹性样板间的运行方式有两种:
- Terraform 命令行
可以按照样板间仓库中的 README 的指引,依次执行 terraform apply
, source .bash_profile
和terraform apply
即可。
- IaC Service 在线运行
IaC Service 目前已经提供了可以在线运行 Terraform 的工作流,首先将弹性样板间 GitHub 仓库 Fork 一份到自己的账号下,然后登录 IaC Service 控制台,创建一个新的工作空间,选择 Fork 后的仓库,然后点击“发起新计划”即可执行样板间。
相比与 Terraform 命令行的方式,IaC Service 可以省去本地安装和运行 Terraform 的麻烦,同时借助 GitOps 的能力,可以实现修改应用文件后自动触发新的工作流、持续部署的能力。
自动化弹性样板间在运行成功之后,登录容器服务控制台,选择新建的集群,进入节点池,选择 autoscaling
节点池,即可看到当前集群下所有的伸缩活动:
登录 Agro UI 也可以如期地看到扩展出的应用正在部署和同步中:
应用的自动弹性扩展将会带动资源层面的弹性伸缩,当应用数的增加并且 Pod 负载超过阈值时,将自动扩展新节点;当应用下线后,随着 Pod 负载的降低将收回弹出的节点,完全做到的全自动化伸缩。
六、总结
总结一下,阿里云开放平台的「端到端解决方案」的价值和成果:
- 与编排工具 Terraform 和 ROS 集成的云产品实现了 100% 自动化开通或者免开通,全面解决了客户在使用编排工具时的一大障碍;
- 配额中心支持对 30+云产品配额项的管理,同时具备了配额告警、配额自动申请的能力;
- 与 Terraform 集成的云产品从原来的 43 款提升到了 61 款,并且还在持续集成中;
- IaC Service 不但提供了在线执行 Terraform 的能力,还支持对 Terraform 模板的自动解析和对应的 RAM Policy 的自动化导出,大大降低了客户使用 Terraform 的成本。
自动化弹性样板间的成功落地是对「端到端解决方案」价值和成果的直接体现,但并不是唯一受益方,解决客户在自动化和弹性流程中的痛点问题,解决云产品在对接横向产品中的痛点问题,做到真正的“降本提效”才是对该方案最大的反馈。后续我们也将继续在自动化、弹性等领域释放更多能量。