云原生(CloudNative)是一个组合词,“云”表示应用程序运行于分布式云环境中,“原生”表示应用程序在设计之初就充分考虑到了云平台的弹性,就是为云设计的。可见,云原生并不是简单地使用云平台运行现有的应用程序,而是一种能充分利用云计算优势对应用程序进行设计、实现、部署、交付和操作的应用架构方法。
上云不等于云原生,阿里亚马逊都推崇:Re-host->Re-platform->Re-architect。将迁移之路分为 3 类: Re-host:叫新托管,将线下物理机替换成为云上虚拟机或者裸金属实例,不改变原有的运维方式。 Re-platform:叫新平台,指利用托管的云服务替换线下自建应用基础设施,比如通过北极星服务替代TAF主控;通过腾讯云TKEx容器替代MIG的sumera。 Re-architect:叫新架构,包括单体应用的微服务架构改造,应用容器化,利用云上组件完成环境路由和治理,提升开发的效率和自动化率,同时增加业务系统的弹性,可观测性和韧性,最终能按业务需求,支持所需类型下的交付(公有云,私有云,混合云)。
腾讯云也制定了自己的云原生成熟度模型:
腾讯云的成熟度模型,主要从研发效能和资源效能2个方面引导内部云原生建设。云小微在进行云原生建设和实践前,项目的研发效能和资源效能也确实存在诸多问题,例如:
1. 环境缺乏治理。测试、开发环境紊乱、不稳定:多个版本同时进行提测时存在版本互相覆盖,错误路由与指向的问题,极大地影响了开发和测试的效率。生产环境未隔离: 所有租户都使用一套环境,缺少压测环境、灰度环境、KA客户的环境。有时因为一个异常版本,影响到了所有客户,影响了云小微的SLA数据和客户印象。
2. 可观测性差。用户反馈的问题,开发常常需要拉个大群,自上而下卷入很多人进行排查和定位,降低了定位、解决问题的效率。
3. 弹性能力差。云小微的大数据模型服务,启动时需要加载10-70G的大模型数据到内存,因此启动速度、扩容速度较慢。业务高峰期仅依赖HPA来扩容,有时因为扩容太慢导致客户请求失败,影响了云小微的SLA数据和客户印象。
4. 韧性能力差。对服务的韧性没有把握,缺乏系统容灾、服务降级等策略,部分故障无法自愈,手动应对时手忙脚乱。
5. 自动化能力不够。发版没有通用的流水线,需要大量的人工测试、人工确认、人工发布。大量的人工操作,导致发版的流程不规范、效率低,版本迭代慢,无法快速响应线上的问题和客户的需求。
为了改善上述问题,更好地服务TOB客户。云小微团队结合云小微现状以及公司云原生成熟度标准1.0和2.0的导向,横向对比业界做法,重点在云原生5大核心能力上进行了建设:服务化、可观测性、韧性、弹性、自动化能力,并逐步提升可调度能力。
随着业务的不断发展,单体应用能够承载的容量将逐渐到达上限,即使通过应用改造来突破垂直扩展(Scale Up)的瓶颈,并将其转化为支撑水平扩展(Scale Out)的能力,在全局并发访问的情况下,也依然会面临数据计算复杂度和存储容量的问题。因此,需要将单体应用进一步拆分,按业务边界重新划分成分布式应用,使应用与应用之间不再直接共享数据,而是通过约定好的契约进行通信,以提高扩展性。而服务数量的增加必然导致运维的成本增加,因此微服务化、容器化和环境治理成为了服务化能力建设的三个重点。
由于历史原因,云小微的后台服务大部分都是TAF框架的服务,TAF框架对于拥抱云原生存在诸多障碍:
1. TAF框架在2022年已经官方下线不再维护,其对应的周边配套组件仍在继续运行,但不再更新。
2. 可观测性差,无法低代码地接入主流的观测组件(天机阁、TAPM)。有些服务因为TAF CPP接入可观测性组件困难,服务上线2年都无法接入全链路观测。
3. 跟主流的服务发现组件(tracing)结合差,无法低代码实现多环境路由、动态路由。
4. 老服务无法新增监控项,导致监控、告警不完善。
面对这种风险,云小微开始了TAF转TRPC的历程:
1. 新增的服务使用脚手架工具生成,统一使用trpc 框架。
2. 存量的服务,梳理出核心链路,核心链路全部重构成trpc框架。
3. 非核心链路,但是频繁改动的服务也都尽量改造成trpc框架。
目前整体trpc服务整体占比32%,核心链路trpc服务占比80%,继续改造中。
环境治理可以分为生产环境的治理和测试环境的治理。
在环境使用过程中,存在诸多问题:
为了解决上述问题,治理方案如下:
生产环境规划包含:普通客户环境(formal)、灰度环境(gray)、压测环境(prod-stress-env)、KA客户环境(formal-ka-env,暂时没有部署)
应用client端:外部请求发起端。
接入层(公司级):IAS平台对域名请求按规则转发,将请求转发到对应ENV的接入层。
接入层(系统级):自研的接入层模块,根据请求信息获取请求的客户ID和应用Client,将该客户的请求转发到下游对应的环境。
逻辑层: 后台的主体业务逻辑,按照ENV划分逻辑环境。每个环境都部署全量的服务,且流量一旦进入环境后,就会在该环境的服务内流转,不会串流到其他环境。流量不会串流的原理是,使用了北极星的规则路由,按照ENV进行路由,北极星的规则如下:
存储层:每个环境使用相同的存储组件和实例。后续优化项:对存储组件也按照环境进行隔离。
治理后达到的效果如下:
业务上云后,测试环境(原预发布环境)仍采用SET化部署,部署了近60个Set(环境),其中3个固定的CI Set专用于流水线日常构建和接口测试使用,1个固定的Common Set用于提测/集成测试。
在测试环境使用过程中,存在诸多问题:
业界环境治理的方案对比:
为了解决上述问题,整理些业界在环境治理方面的方案。
原理 | 插件依赖 | 协议兼容 | 资源消耗 | 改造工作量 | |
---|---|---|---|---|---|
动态环境 | 基于北极星的规则路由 | 北极星 | 需额外兼容taf协议 | 低,部署1套完整环境+N套特性环境 | 中 |
servicemesh | 基于istio进行流量劫持 | istio | 需兼容trpc协议,taf协议 | 低,部署1套完整环境+N套特效环境 | 大 |
泳道隔离 | 多环境不串流,按环境路由。可以自行实现路由,也可以使用北极星、consul、etcd等 | 北极星、consul、etcd等 | 无 | 高,部署N套完整环境 | 小 |
自定义路由 | 将路由信息和资源都自定义存储,按照自定义路由表路由 | 无 | 自定义协议 | / | / |
测试环境治理方案的选择:
由于云小微的微服务数量600+,所以测试环境的治理不适合使用泳道式部署多套完整环境的方案。该方案资源冗余严重,且维护成本太高。
service mesh是个好方案,适合测试环境的治理。但是我们开始环境治理时,service mesh还不支持taf、trpc协议,且service mesh方案整体的改造工作量比较大。
自定义路由的方式,需要业务方自定义每个节点的上下游,维护整个路由表,对业务侵入性较大,维护成本高。
所以最终选择了基于CODING+北极星规则路由的动态环境方案。
方案原理简介:
部署一套完整的服务作为基线环境。其他需要修改测试环境的场景,都新建立一个特性环境,特性环境只增量部署有变更的服务。整体路由时,特性环境增量部署的服务优先路由,特性环境不存在的服务,复用基线环境的服务。效果如下:
治理后达到的效果如下:
我们将大体量的单体服务微服务化为互相解耦的微服务,完成所有服务的容器化部署,并且实现核心服务的trpc改造。
在解决了生产环境和测试环境的使用难点和痛点的基础上,跟CODING共建,沉淀了“CODING云小微服务”,并把灰度环境、压测环境、KA用户环境、动态环境,以及快速创建一套隔离环境的流水线沉淀为基础设施,部门内可以直接复用,部门外可以参考使用。
其中测试环境的动态化改造,是公司中为数不多的采用动态路由解决环境冲突,提高研效的产品。
随着云计算的全面发展,企业的应用架构发生了显著变化,正逐步从传统的单体应用向微服务过渡。在微服务架构中,各服务之间松耦合的设计方式使得版本迭代更快、周期更短;在微服务架构中,系统的故障点可能出现在任何地方,因此我们需要针对可观测性进行体系化设计,以降低MTTR(故障平均修复时间)。
指标(Metric)、链路跟踪(Tracing)、日志(Logging)是构建可观性系统的“三大支柱”。在此基础上,让各数据之间产生更多的关联,有效的关联分析可以实现对故障的快速定界与定位,从而提升故障处理效率,减少不必要的损失。
因此Tracing、Metric、Loging数据的采集和关联成为可观测性建设的重点。
因为微服务模块多,链路深,缺乏一个完备的可观测系统,导致我们在日常经营过程中存在诸多问题:
基于以上的问题,云小微自研了语音助手事件系统:
典型案例:合作伙伴反馈在10月27日下午15:30分,他的设备ID(f014e3fxxxxxxxxx)请求云小微后台的响应不符合预期。
排查步骤:
1. 根据时间和设备ID,查询这段时间唤醒设备的所有事件
2. 根据事件和时间判断是哪条记录。例如客户当时是希望设备“空调温度调高一度”时返回异常,结合时间和事件可以快速定位到请求的业务reqid是xxxxxxxd416668558183172750
3. 根据业务reqid下钻,查看这个业务reqid关联的所有事件。
4. 查看事件列表,获取异常事件。发现终端上报了一个“不支持调节空调温度”的异常事件。从而在2分钟内就判断出是客户的终端类型设置错误,快速帮助客户和合作伙伴定位问题。与之前定位问题时,需要拉个20人的大群,定位1-2个小时相比,这个小白系统解放了95%的人力。
达到的效果:
BG内外tracing方案的对比:
注:差计0分,中计1分,优计2分。
天机阁和TAPM都基于当前业界主流的OpenTelemetry规范,所以他们的接入方式大同小异。同时他们各方面的表现没有差异太大,所以我们决定自研trpc插件,同时支持天机阁和TAPM,通过trpc框架配置来控制数据上报地址。
Open Telemetry Oteam 是公司级的可观测系统的Oteam, 荣获2021年腾讯荣誉激励体系“腾讯开源协同奖”优秀奖。目前是公司内在可观测方面比较领先的团队。天机阁2.0是基于Open Telemetry规范,Open Telemetry Oteam 的落地产品,目前在公司内已经有了广泛的应用。
使用天机阁tracing的主流场景 :用户反馈Bug,并提供对应业务请求的reqid。
排查步骤:
1. 根据业务reqid查找tracing 日志
2. 根据找到的tracing 日志下钻找到tracing-detail
3. 分析调用链路、查看耗时、下钻错误链路找到错误日志
TAPM是腾讯云上的Tracing和应用性能监控的主流产品,我们也具备了接入TAPM能力。
我们自研了事件上报系统,打通了端到端的链路事件,70%问题可以通过该系统,1个人半小时内定位。同时客户、合作伙伴、测试同学也能自主地使用该系统,不需要什么问题都上报到开发团队排查,大大节约了双发的时间,提高问题定位的效率。
同时我们也接入了天机阁和TAPM,开发同学借助他们进行更深的问题的定位和系统瓶颈的定位。
通过上述的建设,我们沉淀了自研的事件上报系统平台和trpc cpp流式接口接入天机阁、TAPM的能力。实现了logging、tracing、metric的多维数据监控和数据联动,完善了对整个云小微平台的可观测性。其中自研的事件上报系统在部门内可以复用,只需业务端主动写日志到本地即可完成接入;trpc cpp流式接口接入TAPM已经提交代码到Trpc框架,所有trpc cpp的业务都可以复用。
韧性是指当软件所依赖的软硬件组件出现异常时,软件所表现出来的抵御能力。这些异常通常包括硬件故障、硬件资源瓶颈(如CPU或网卡带宽耗尽)、业务流量超出软件设计承受能力、影响机房正常工作的故障或灾难、所依赖软件发生故障等可能造成业务不可用的潜在影响因素。业务上线之后,在运行期的大部分时间里,可能还会遇到各种不确定性输入和不稳定依赖的情况。当这些非正常场景出现时,业务需要尽可能地保证服务质量,满足当前以互联网服务为代表的“永远在线”的要求。因此,韧性能力的核心设计理念是面向失败设计,即考虑如何在各种依赖不正常的情况下,减小异常对系统及服务质量的影响并尽快恢复正常。韧性原则的实践与常见架构主要包括服务异步化能力、重试/限流/降级/熔断/反压、主从模式、集群模式、多AZ(Availability Zone,可用区)的高可用、单元化、跨区域(Region)容灾、异地多活容灾等。
因此韧性能力的建设,主要是主动发现韧性问题的能力,以及服务和架构中处理故障场景的能力。
混沌工程是指通过主动在后台微服务系统上注入各种异常来模拟云上多变环境。
在公司自研上云及微服务的进一步解耦的大背景下,后台微服务系统复杂度极大增加,在面临云上天然多变的运行环境,如何增强系统的可用性,成为摆在开发、测试、运维同学面前的难题。而混沌工程可以通过模拟注入故障,提前找到系统的脆弱点,以检验微服务系统及相关人员、应对机制是否具备让系统自愈的能力,以增强系统的韧性。
故障注入:通过星云提供的tkex-container资源挤占场景,模拟CPU资源飙高,持续触发HPA扩缩容策略,验证环境弹性可用性。
韧性原则的实践与常见架构主要包括服务异步化能力、重试/限流/降级/熔断/反压、主从模式、集群模式、多AZ(Availability Zone,可用区)的高可用、单元化、跨区域(Region)容灾、异地多活容灾等。
目前云小微的微服务数有600+个,其中TAF服务400+个,TRPC服务200+个。TAF框架支持主调服务以同步、异步(单向实际上也是异步的)的两种模式访问被调服务,其中同步方式因为在调用过程中会阻塞当前线程,业务处理逻辑不能并行化,吞吐量一般较低,因而云小微的taf微服务间调用都使用异步模式。对于TRPC服务,也通过协程的方式实现服务异步化。
业务示例:云小微的语音助手的DM(对话管理)服务,需要调用下游较多,如NLU(语义理解)、Chat(闲聊)和TSKM(技能分发)服务。NLU和Chat是并行异步调用的,得到落域结果后再异步调用TSKM。通过并行异步和串行异步,提升对话流程的性能。
由于出现过部分地区网络异常的问题,所以云小微提供了iplist的方式,供端使用。后台服务会对客户端请求的域名, 返回云小微对应域名全量的VIP 列表。当某一个VIP 访问异常时,由客户端决策使用哪个VIP,并可以进行重试,大大提高弱网环境下,客户端接入后台的成功率。
为了保证后台服务的可用性,需要对一些非法流量、异常流量进行流量限制。云小微的业务统一网关TVSGatewayServer支持Appkey(标识一个接入方)、Guid(标识一台设备)等维度的流量控制。
统一网关的基本处理流程如下:
对于一些核心服务,会有降级处理。如音乐服务,下游依赖比较多,如账号接口、QQ音乐接口、全局控制接口等。为降低下游服务异常对用户体验的影响,音乐服务对异常情况设计了降级方案。
例如: 当QQ音乐接口异常时,对收藏歌曲和收藏歌单做了不同的处理:
播放收藏歌曲,降级使用用户缓存的收藏列表返回;
播放收藏歌单,降级使用随便听听的免费电台歌曲。
云小微服务上云后,将服务进行了三地部署,包括广州、上海和天津。实现了国内终端的就近接入和后台服务的异地容灾。
通过上述的建设,我们在代码和部署层面增加众多增强服务韧性的手段,确保了在可预测的故障范围内,我们在服务能够自愈故障。
同时我们通过常态化地进行混沌工程,人工模拟注入故障,来演练和发现系统的韧性薄弱点。最后通过调整代码或者部署架构来修复系统的韧性弱点。云小微也是公司内极少数具备常态化混沌工程能力的产品。
这里的建设使我们沉淀了一套比较健硕的服务代码,同时也沉淀了进行混沌工程的理论和实践经验,以及处理线上故障的应急方案。同时这整套方案和实际方法论,在公司内都是可以低代码复用。
弹性原则是指系统部署规模可以随着业务量变化自动调整大小,而无须根据事先的容量规划准备固定的硬件和软件资源。优秀的弹性能力不仅能够改变企业的IT成本模式,使得企业不用再考虑额外的软硬件资源成本支出(闲置成本),也能更好地支持业务规模的爆发式扩张,不再因为软硬件资源储备不足而留下遗憾。
生产环境的所有服务,都基于tkex的能力,配置了HPA,在CPU、内存层面进行了弹性扩容。
AI大模型数据服务的特点: 启动时需要读取大量的模型数据,数据大小一般在10G-70G。
老的方案:
痛点:
新的方案:
spec:
template:
metadata:
annotations:
eks.tke.cloud.tencent.com/image-cache-disk-retain-minute: '1440'
eks.tke.cloud.tencent.com/use-image-cache: imc-450yp7sy
新方案效果:
AI大数据模型服务启动速度慢是个行业通性问题。通过上述的建设,云小微的AI大数据模型服务,扩容速度从10分钟左右,优化到5分钟以内,命中缓存时可以达到1分钟左右。优秀的扩容速度,让我们无需进行过多的冗余部署,从而提高了大数据模型服务的CPU利用率。
这个过程云小微沉淀了一套大数据模型服务启动速度优化的方案和配套的流水线。因为是直接使用了EKS的镜像缓存能力,所以只需要进行流水线的低代码改造,就能快速复用到其他产品。
技术是把“双刃剑”,容器、微服务、DevOps以及大量第三方组件的使用,在降低分布式复杂性和提升迭代速度的同时,也提高了软件技术栈的复杂度,加大了组件规模,从而不可避免地导致了软件交付的复杂性。如果控制不当,应用就会无法体会到云原生技术的优势。通过IaC、工蜂、CodeAnalysis和大量自动化交付工具在CI/CD(持续集成/持续交付)流水线中的实践,企业可以标准化企业内部的软件交付过程,也可以在标准化的基础上实现整个软件交付和运维的自动化。
在进行云原生改造前,云小微的CI/CD存在许多问题:
1. 使用物理机编译,不同的机器编译环境不同,可能导致制品存在质量风险。
2. 每个服务一条流水线,流水线维护成本高。流水线之间可能存在流程不一致的情况。
3. 没有环境分级、制品分级,流程紊乱,质量未达标的制品可能会被直接发到生产环境,存在发布风险。
于是我们做了以下标准化动作:
因为每种语言的依赖不同,所以按照开发语言来区分了流水线模板。每个服务实例化时,根据开发语言选择正确的模版即可。从维护N个服务流水线,到维护6套流水线模版,大大降低了流水线的维护工作量,提高了流水线修改的效率。
环境按照用途分为开发环境、测试环境、预发布环境、灰度环境、压测环境、普通客户环境、KA客户环境。
制品按照质量等级分为 CI通过、测试通过、可灰度、可发布、已上架(发布)、已下架(回滚)。
在不同的环境上升级对制品有不同的要求。例如升级测试环境要求制品等级>=CI通过,升级普通客户环境要求制品等级>=可发布。通过这种措施,杜绝了研发人员通过不正规的手段,将不符合标准的镜像发布到目标环境,确保发布流程的正确性。
发布时按照开发环境->测试环境->预发布环境->灰度环境->普通客户环境->KA客户环境的顺序进行发布。
发布普通客户环境和KA客户环境时,还需要对发布的负载进行分批次发布,尽量减少异常的版本对客户的影响。
免测服务指服务的发布上线无需通过人工介入测试和验证,而是通过自动化的指标测试和验证,一旦达到了免测标准,就可以直接发送到灰度环境和生产环境。
服务通过免测标准后,CI/CD流水线将会走到免测流程,流水线的代码安全、质量检查、CI等通过后,跳过人工测试等待流程,直接部署到灰度环境。大大节约了测试的人力成本,提升版本迭代的速度。修复bug的速度得到了明显提升,也得到客户的一致好评。如下图所示,免测服务整体上4个小时内可以完成上线,非免测服务整体上需要2天时间。
通过上述的自动化建设,最终体现在了发布的效率和质量上。
比亚迪因为出海需要,10月13日周四晚上22:00左右,给老板提了个需求,希望我们对出海的服务做些定制化,下周一进行POC。需求紧急,给的时间也很短。在未进行自动化建设前,肯定是要让开发、测试同学周末加班推进版本。但是在自动化建设后基础上,我们周五一天就完成了版本的开发、自动化测试和发布。
因为开发的服务是免测服务,完全依赖服务的接口测试用例、单元测试用例、代码覆盖率来保障服务的质量,无需走人工测试和校验,这里节约了大量的时间。
10月13日22时收到需求,10月14日早上对齐需求后,17点左右完成了代码改造、自测和用例完善,晚上21点就已经跑完整个CI/CD流程,实现24小时内版本迭代的效果。
通过上述的建设,我们标准化了服务CI、CD的流程,同时通过自动化测试和免测服务,提高了CI、CD的速度和版本的质量。最终使得我们的版本迭代速度,响应速度和产品质量都有了极大的提升。
这期间我们沉淀了部门的流水线通用模板,数量可观的用例集,以及与CODING共建的“CODING云小微服务”,这些都是我们产品质量和效率的基础设施和基础保障。
在智平各中心同学和CSIG质量部/智能产品质量中心同学的共同努力下,云小微重点在云原生的5大领域(服务化、可观测性、韧性、弹性、自动化能力)上进行了建设,完成了Re-host、Re-platform、Re-architect的转变。
当然随着对云原生的实践越来越多,我们也发现云小微在云原生的资源利用率、可调度性等方面建设和实践相对比较薄弱。接下来我们也将继续云原生的实践,不断完善自身的薄弱点,更好地服务客户和合作伙伴。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。