头:潘俊峰
前言
微服务架构的呈现,拆分了巨大的单体使用,让事务之间的开发与协作变得愈加灵敏。当面对事务流量添加的场景时,往往需求对一些使用组件进行扩容。K8s 在使用层面供给了 HPA,环绕 HPA 开源社区延伸出了 KEDA 这样的弹性组件,为微服务使用以事务目标履行弹性战略供给了完成的或许性。但 HPA 正常作业的一个大前提是需求保证集群资源足够,为此用户必须提早对集群扩容或时常坚持集群资源冗余。
关于集群资源弹性这一命题,K8s 社区给出了Cluster Autoscaler(CA)和Virtual Kubelet(VK)两种解决计划。本文环绕着微服务使用的形状与特色,剖析了 CA 与 VK 各自适用的场景,并总结了微服务架构下使用该如何挑选集群资源弹性。
微服务使用形状与特色
在微服务使用架构,微服务架构将一个巨大的使用体系拆分成了一个个离散的使用组件,这些组件经过 RPC 串在一同,对外供给完整的服务。每个组件是离散的,大部分组件可以经过水平扩缩然后调整服务容量。非中心链路上的组件,是答应推迟扩容或许不扩容,乃至是缩容让出资源。
微服务架构下在弹性场景存在五大特征点:
-
水平弹性可以调整体系容量: 在外部资源足够的情况下,微服务使用组件水平扩容可以提高事务体系的容量。
-
使用间存在依靠联系: 单个微服务使用并不能供给完整的服务,扩容单个微服务组件,对体系容量的提高十分有限,往往需求和依靠的服务一同扩容才干有用提高体系容量。
-
使用自身是无状况的: 若微服务使用自身有状况,关于水平扩容是不利的,例如对磁盘有强依靠,在扩容场景下需求留意调度亲和性以打散 Pod,防止同类型使用在同一节点对磁盘 IO 抢占,一起缩容时还需求考虑关于状况数据的处理。因而需求尽量改造成无状况使用。
-
启动速度快且服务上下线流量无损: 服务上下线流量无损关于主动扩缩容场景至关重要,尤其是在大流量高并发场景下扩容,冷启动的新 Pod 很容易被大流量击溃,并且在健康探针的效果下,扩容出的新 Pod 不断被 K8s 重启,终究完成的是无效扩容。
-
流量具有周期性: 绝大多数微服务架构使用面向的是在线服务,因而可以用二八定律来描述它,即 20% 的时刻处理了 80% 的流量。关于事务流量而言,最显著的特征是存在周期性的改变,且往往这个改变是快速的,所以微服务使用容量扩缩的响应速度关于事务体系的稳定起重要效果。
在微服务使用架构中装备使用弹性时,咱们所需求考虑的是挑选合适的目标来衡量体系容量。在装备集群资源弹性时,咱们所需求考虑的是扩容出的核算资源是否可以满意使用所需。
K8s集群资源弹性技能计划
如前言中所提及,K8s 社区给出了两份“标准答案”的框架,具体的资源弹性完成还依靠云厂商的技能形状与产品才能。
虚拟节点:VK
Virtual Kubelet 是依据 Kubelet 界说提出的一个“虚拟节点”的概念,答应云厂商将云服务包装成一个“虚拟节点”,加入到 Kubernetes 集群中。虚拟节点的背后往往是云厂商的大资源池,因而理论上咱们可以认为虚拟节点的资源是无限的,当然实际情况还要以云厂商的规模和产品才能来做判断。

节点弹性:CA
Cluster Autoscaler 是 K8s 社区给出的集群节点弹性计划。CA 监听集群中所有 Pod 事件,当有 Pod 由于资源缺乏而无法调度时,CA 会依据弹性组信息进行模拟扩容并调度核算,最终按照预设的节点扩张战略进行实在节点扩容。一起 CA 监听集群整体资源利用率,当利用率低于预设的缩容阈值时,CA 进行模拟缩容调度核算,扫除各种影响要素后,CA 对可缩容节点履行打污点、排水、删除这一系列操作。

各计划特色比对
以 CA 技能形状为主的实在节点弹性与以 VK 技能形状为主的虚拟节点,这两种干流技能手段有着各自特色,其中最首要的区别如下:

简而言之,CA 弹性实在节点以供给完整 K8s才能,但响应速度较慢;VK 由云厂商资源池驱动,供给了秒级、无限资源的弹性才能,但不存在实在节点,然后失去了部分 K8s 特性。
云厂商解决计划
在 VK 和 CA 这两种首要资源弹性技能方向上,各个云厂商也纷纷推出了对应产品以供给相应的解决计划。

Serverless 方向首要是 Serverless Instance 与 Serverless Cluster。Serverless Instance 产品有 ECI、Fargate、ACI 这类,以快速、无限资源为显著特色。Serverless Cluster 产品有阿里云的 ASK、谷歌的 GKE Autopilot,由云厂商保护所有集群资源,对用户而言开箱即用免运维。
节点弹性方向 AWS 还推出了开源组件 Karpenter,它绕过了 CA 中弹性组的概念,然后让扩缩容时关于资源的挑选愈加灵敏。
资源弹性战略挑选与考量要素
关于资源弹性问题,咱们首要考虑的是才能。即新的核算资源是否可以满意事务使用需求。以 VK 技能形状为主的弹性计划,受限于架构规划、安全、功能等要素,天然地缺失了节点特性、容器特权等才能。关于有这部分诉求的事务使用应尽或许地进行改造,以移除相关依靠。
其次咱们考虑的是本钱与功率。关于企业使用而言,本钱预算是不行防止的话题,定价规则以及计费形式不同,终究带来的资源本钱不同,势必会影响咱们关于某项技能的偏好。在当时的 Serverless 场景下,核算资源大体上选用的还是按量计费形式,关于一些长时运转的使用上,选用预付费形式的核算资源是否能到达更节约本钱,还需求咱们进一步去调研与测验。本钱这一层面不只包括资源本钱,还包括运维本钱、团队技能学习本钱以及依靠具体云厂商所隐含的搬迁本钱等等,这些本钱在当下或许对企业的收益影响有限,但从企业久远开展角度来看,这一部分不行忽视。一起关于技能团队而言,挑选相应技能计划在节约运维本钱和降低团队学习本钱的一起,需求理性看待这部分本钱节约与团队生长所带来的收益之间的联系。
功率是影响事务收益本钱的重要要素之一,从流量来袭,到 HPA 依据目标做出响应,再到资源弹性做出动作,最终到使用启动服务上线。这之中每一个环节都存在时刻本钱,通常情况下这个时刻本钱越小越好,但也存在一些事务关于时刻本钱不敏感。关于扩容的每个环节,都延伸出了相应的技能解决计划。如 HPA 被动式响应,阿里云推出了 AHPA 带目标预测的提早扩容才能。如 JAVA 使用启动慢,GraalVM、Alibaba Dragonwell 都在冷启动上做出了一些尽力。关于明确事务周期的使用,设置好定时弹性提早扩容,这些问题天然引刃而解。
最终还有一些场景问题需求考虑,对当时使用架构进行升级、搬迁、重建时,咱们需求把高弹性要素纳入考虑规模,进行合适的技能选型。
综上所述,咱们总结了一张资源弹性挑选战略图,列举了通用场景下对集群弹性选型时需求考虑的要素点。

总结
在微服务架构中,咱们需求从事务视角整理与划分使用组件。关于中心链路组件,要尽或许的保证这些组件的健壮性,并调整成一个高可用、高弹性的架构,然后让中心事务持久运转。关于外围链路组件,需求权衡本钱与高可用、高弹性带来的效益。
在 K8s 资源弹性问题上,现有技能手段中,咱们需求考量兼容性、功率与本钱,然后挑选合适于自身事务的集群弹性战略。
阿里云的微服务使用保管平台 EDAS 在资源弹性场景下,不只针对性的关于独享资源型事务虚拟机 ECS 集群,池化资源型事务 K8s 集群,以及全保管免运维的阿里云 Serverless 集群均做了很好的支撑;一起基于结合阿里云容器服务和 ECI ,一起供给了针对池化资源 + Serverless Instance 的形状场景支撑,让咱们微服务的事务在可以充分利用云技能所带来的技能红利。