本文将从敏捷研制团队的环境需求与痛点动身,共享怎么依据云构建可弹性弹性的主动化生成式多测验环境;更在经济效益层面,供给了多种本钱优化方案,以满意研制团队低本钱、高效益的多测验环境工作方针。

一、当时遇到的环境问题

初期,依据实践研制需求,LigaAI首要运用了以下四套环境:

技术分享 | 多测试环境的动态伸缩实践

  • Dev环境是开发环境,专供前/后端开发人员进行功用开发自测、联调等;
  • Sit环境为测验环境,供测验成员进行迭代功用验收;
  • Pre环境为预发布环境,首要承当全体测验、回归测验等;
  • 终究,Prod环境为生产环境。

跟着团队规划不断扩大、事务组区分走向明晰,以及微服务拆分愈发精密,环境资源开端逐渐缩紧,资源紧张带来的冲突频繁约束着团队发展。

  • 对迭代有危险的杂乱需求需求剥离迭代,进行单独测验;
  • 开发人员需求不同的Dev环境进行联调;
  • 迭代小组的迭代进展各异,需求分批提测;
  • 紧迫Hotfix急需测验,但环境已被占用;
  • 需求进行系统压测,却缺乏一套压测环境;

为缓解环境资源紧张问题,LigaAI对原有的Dev环境和Sit环境做了如下扩展。

技术分享 | 多测试环境的动态伸缩实践

如此虽一定程度上满意了不断添加的环境需求,但不可防止地导致了其他问题。因此,针对以下环境需求痛点,LigaAI着手建立了一套高弹性、可弹性的测验环境。

技术分享 | 多测试环境的动态伸缩实践

二、测验环境的改造方针

开端正式改造前,LigaAI结合研制流程和环境需求,对方针测验环境提出了几点要求:

  • 多环境:针对不同的测验场景,能够供给不同的测验环境。
  • 互相区隔:数据、装备信息和运用访问在不同环境之间要彼此阻隔。
  • 高效安稳:环境要保持安稳且高效地工作,不能影响正常迭代进展。
  • 低本钱:发生尽或许较低的额定本钱,任何时期都要将资源用在刀刃上。
  • 可复用:针对特殊需求可快速扩展新环境;简化测验环境保护,让团队聚集研制与测验。

榜首步:测验环境的标准化改造

Step 1:建立底层根底设施

围绕弹性、扩展和布置等要害词,LigaAI终究选用Amazon EKS作为环境弹性的底层根底设施。

Amazon EKS即Amazon Elastic Kubernetes Service,是一项完全保管的服务。无需装置、操作或保护集群也可轻松工作Kubernetes,而其内置的操控面板则为LigaAI的集群办理供给了便利。

Step 2:规范中间件资源

为便利运用接入,咱们梳理了系统中需求改造或命名规范化的根底资源和中间件,包括域名命名、数据库地址、音讯行列、Redis和Elasticsearch等。

命名规范化能够以环境称号为一致标识,选用「资源称号_环境称号」等方法完结。

Step 3:运用改造

下一步,依据梳理好的根底资源和中间件规范,重新收拾并一致测验环境装备信息,规范化运用装备和耐久化数据。

运用改造方针是,只需注入环境称号,即可替换一切与环境相关的装备信息,如回调地址、音讯行列、数据库信息等;而耐久化的数据不该保存与环境信息相关的数据。

该阶段或许涉及到一部分代码改造,需求开发团队参与配合。

Step 4:制造环境模板

想要主动生成环境,首要必须有一套含有耐久化数据、装备文件和运用包的环境模板;其间,运用包数据包括后端镜像和前端资源包。

在本次改造中,LigaAI指定Pre环境作为基准环境模板来历。

Step 5:一键建立环境

为最大程度提高产研团队效率,环境建立必须便利快捷,且满意可复用要求。

将环境建立流程的各个环节脚本化,并将这些脚本集成到流水线使命当中,完结环境建立的一键生成作用;其间,将部分流程并行处理,也会加速环境生成速度。

技术分享 | 多测试环境的动态伸缩实践

Step 6:环境挂号责任人

除一键生成环境外,制定标准化的环境办理流程也很重要。清晰环境负责人,将环境生成、重置与开释流程集成到运维渠道,让请求信息可视化;

同时,经过信息告诉集成IM,支撑环境生成/开释信息、环境到期提示等告诉的及时触达。

技术分享 | 多测试环境的动态伸缩实践

四、标准化改造效果:环境生成主动化

至此,测验环境的标准化改造告一段落,而LigaAI也成功打通了环境模板生成流程和环境请求流程的数据传递通道。

技术分享 | 多测试环境的动态伸缩实践

左面:环境模板生成流程

发布生产后,触发模板构建使命;

经过提取Pre环境的数据,找出当时的镜像信息,打上Tag并标记为模板镜像;

再将环境模板所需求的数据库、装备文件和前端资源等数据上传到Amazon S3进行保存。

右边:环境请求流程

环境请求人先在运营渠道挂号请求,填写运用时间和运用范围;

提交请求后,触发使命:从Amazon S3拉取装备数据,初始化中间件资源,从镜像库房拉取模板镜像布置运用,一键生成环境;

环境到期后会主动开释,如需持续运用,提交延长挂号信息即可。

环境生成的标准化改造经过流水线使命主动建立、环境主动开释和请求人挂号,处理了环境需求的三大痛点。想要进一步处理环境资源紧缺或浪费的问题,需求持续完结测验环境的弹性弹性改造。

技术分享 | 多测试环境的动态伸缩实践

第二步:测验环境的弹性弹性改造

容器资源首要分为Pod等级和Node等级。每个Pod包括一个或多个运用容器,并以全体的方法在Node之上工作。

技术分享 | 多测试环境的动态伸缩实践

与资源分类对应,资源弹性也有两种模式:

  • Pod等级的资源弹性为HPA,是Kubernetes的内置服务,首要用于副本数量的调整;
  • Node等级的资源弹性为Cluster Autoscaler,非Kubernetes内置服务,需求手动布置Deployment装置;

想要让服务器资源满意变化频繁的研制环境需求,则需求对Node等级进行弹性弹性改造。

Amazon EC2 Auto Scaling groups(以下简称主动弹性组)供给了弹性扩展服务器实例的功用,支撑设置服务器的初始生成数量、最小数量以及最大数量约束。

当扩展策略生效时,主动弹性组会在指定的最小和最大容量值之间调整组的所需容量,并依据需求发动或停止实例。

技术分享 | 多测试环境的动态伸缩实践

痛点4:服务器资源不足时,怎么扩容?

环境请求成功后,Pod数量添加,但因节点资源饱满/不足,此刻新的Pod会处于Pending状况。

Cluster Autoscaler定时(默许距离 10 秒)检测节点资源的运用状况。一旦监测到Pending状况的Pod,便会触发节点扩容,调用Cloud Provider,创立新的Node以满意添加的环境需求。

技术分享 | 多测试环境的动态伸缩实践

痛点5:服务器资源过剩时,怎么缩容?

测验完结后,环境资源开释,Pod被删去。此刻,Node资源呈搁置状况。

当检测到一个Node已超过 10 分钟没有履行任何扩展操作,或资源利用率均低于 50% 时,Cluster Autoscaler会操控主动弹性组进行收回节点,主动将其删去;原来的Pod也会主动调度到其他Node上。

技术分享 | 多测试环境的动态伸缩实践

以上,Cluster Autoscaler经过Cloud Provider插件,操作主动弹性组完结服务器资源的扩展与收回,达到测验环境的弹性弹性改造。

六、怎么完结低本钱,高效工作环境?

1. 中间件资源复用

云环境下,对数据库、Redis、Elasticsearch、装备中心和注册中心等中间件资源进行复用,可大幅节省运用本钱和资源,下降环境扩展难度。

比如,在一个数据库实例上,以环境称号为索引标识,创立不同环境的数据库,以节省资源。

技术分享 | 多测试环境的动态伸缩实践

2. 合理分配资源

此外,还能够经过以下几个方面,操控云服务器上的本钱开支。

榜首,合理分配CPU和内存的Pod资源预留与资源约束。 资源预留(Requests)表明Pod需求占用的最小资源,即节点上必须有大于Request值的资源,才能调度这个节点;而资源约束(Limits)则表明Pod可运用资源的最大值,当容器占用资源超过Limit值时,就会被停止或重启。

CPU是弹性资源,而大部分IO密集型运用在测验时对CPU的运用率和耗费都比较低,因此主张将CPU的Requests设置小一些,将Limits调大一点。

Java运用分配内存则能够经过剖析GC日志、运用监控信息、JVM监控信息等,依据GC频率和GC耗时的体现,找到一个可接受的内存设置平衡点,用较小的内存满意当时的服务需求。

技术分享 | 多测试环境的动态伸缩实践

第二,重视节点的装备份额和巨细选取。CPU和内存的节点装备份额需求依据实践事务系统的需求确定。份额设置准则是防止CPU或内存成为明显的短板,常见的运用份额是 1:4 或者 1:8。

节点的挑选上,一方面要防止挑选装备低的小节点。由于节点上需求布置Kubernetes的根底组件,这会耗费固定的资源,且节点越多,全体开支和本钱越大;此外,过小的节点还或许呈现资源碎片的问题,所以主张恰当挑选大一些的节点。

另一方面,切忌盲目追求大节点。大节点允许的Pod数量较多,一旦节点呈现问题,影响范围也会更大。同时,大节点的主动弹性本钱更高,容易呈现「杀鸡用牛刀」的状况。

技术分享 | 多测试环境的动态伸缩实践

第三,奉行勤俭节省准则。 一次性工作的使命或履行频率较低的周期使命,能够经过K8S Job和CronJob履行。另外,资源节省意识也体现在环境不用时及时收回、没有特别状况不随意请求环境、防止非常规环境空置等习气之中。

3. 操控云上的本钱

LigaAI的测验环境改造选用了多项亚马逊云科技服务,因此咱们也经过削减云服务商的本钱费用,进一步完结低本钱的高效工作。

首要,挑选适宜的区域很重要。就亚马逊云服务而言,不同区域的费用标准也会有所差异。能够多多对比中国区和外国区,或宁夏区域和北京区域的相关费用标准,挑选最适宜的区域服务。

其次,还能够重视云服务器的不同定价方案。以Amazon EC2云服务为例,咱们首要考虑按需实例、预留实例和竞价实例三种定价方案。

  • 按需实例/On-Demand Instances:按小时或秒(最少 60 秒)收费。
  • 预留实例/Reserved Instances:类似按年付费;比较按需实例,最高可供给 72% 扣头。
  • 竞价实例/Spot Instances:在服务器需求不高时,可出售闲暇服务器资源;比较按需实例,最多可享 90% 扣头。

选用「预留实例+竞价实例」的组合方法,也能进一步完结经济效益最大化。

对于固定的环境,提早计算好需求的服务器数量,请求预留实例,并将其设置为主动弹性组中的最小实例数量;再将额定的扩展环境设置为最大数量,以此完结弹性扩容。

对安稳性要求不高的环境或运用(如开发环境),能够经过Spot主动弹性组进行环境扩容。

技术分享 | 多测试环境的动态伸缩实践

01 装备节点亲和性和污点

设置节点亲和性或污点,让对的Pod被调度到正确的节点上。节点亲和性使得Pod被吸引到一类具有特定标签的节点上,而节点污点(Taint)则相反,它使得Pod防止被调度到这些节点上。

经过将需求安稳工作的Pod固定在按需实例或预留实例的节点组上,将可容忍中止的Pod约束在Spot节点组上,也可满意本钱操控的需求。

为了便利环境收回时的节点开释,按环境称号设置Pod亲和性,将同一环境的Pod尽量放置到相同的节点,削减节点中的Pod搬运,提高节点收回率。

02 怎么下降Spot节点中止的影响?

榜首,挑选多个可用区和多种实例类型。 留意,同一个节点组的实例类型的CPU核心数量跟内存巨细必须一致,这样会有更足够的资源。

第二,设置Pod优先级。 对非要害Pod设置低优先级,能够在节点收回时,率先将重要的Pod搬运到其它闲暇资源中去;

第三,还能够在节点封闭前,先将Pod调度搬运。具体完结路径如下:

技术分享 | 多测试环境的动态伸缩实践

首要,敞开主动弹性组的「容量再平衡设置」。敞开后,假如Spot节点有中止危险,主动弹性组就会提早宣布容量再平衡告诉,并重新分配一个新的Spot节点。

旧节点封闭前两分钟,主动弹性组会宣布停止实例的告诉(需手动敞开相应的告诉装备)。

而在Kubernetes中,咱们需求布置AWS Node Termination Handler服务,并经过它来接纳事情,驱逐旧节点里的Pod;Pod驱逐完结后,再封闭旧的节点。

以上过程能够基本确保Spot节点的相对安稳性。

4. 账单费用监控告警

终究,做好费用的监控预警也很重要。以下服务可用于监控费用明细,供给资源优化支撑,也能够对账单费用突增、预留实例覆盖率进行告警告诉。

  • Amazon Cost Explorer
  • Amazon Budgets
  • AWS Tweaker

本文内容收拾自Apps Everywhere系列活动 – 深圳站(线上直播)的主题共享。该活动由亚马逊云科技User Group举办,聚集云原生开发技术,探究云原生技术下的测验、交付、安全等话题的全新思想碰撞。

未来,LigaAI将持续为开发者社区供给高质量技术共享,与更多开发者和团队一同探究高效益的研制办理之道。

想要了解更多程序人生、敏捷开发、项目办理、行业动态等音讯,欢迎重视Liga@juejin了解更多概况,或点击咱们的官方网站LigaAI-智能研制协作渠道线上请求体验。