合阔智云核心生产系统切换到服务网格ASM的落地实践

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 合阔智云是专注于大中型的零售连锁行业,使用服务网格 ASM 进行应用架构的融合和升级后,把不同业务的技术语言做了统一开发,业务系统中所有基础架构部分的能力也都转由 K8s 来负责,包括网关、服务发现、负载均衡、指标与监控、健康检查、故障恢复等。真正做到为应用服务间的调用带来了安全、可靠、快速、应用无感知的流量路由、安全、可观测能力。 通过托管模式,解耦了 Istio 组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。

背景

合阔智云(www.hexcloud.cn) 是专注于为大中型零售连锁行业,提供全渠道业务中/前台产品和解决方案,并建立以消费者为中心的全渠道交易和敏捷供应链的新一代零售运营协同平台。

合阔智云提供了从全渠道交易管理到订单履约再到门店供应链完整的餐饮零售连锁解决方案,整个方案采取微服务设计,并深度使用了Kubernetes作为生产调度平台。

技术现状

整个业务系统采用微服务架构,但不同业务场景在不同阶段选择了不同的技术语言来开发,如PythonGolangJava,甚至有部分应用使用了Nodejs,因为技术栈的缘故,Spring Cloud或者Dubbo这样的全家桶并不适合我们,为了能够适应业务需要,我们选择了下面的策略

·不依赖于单一语言和单一技术框架,允许使用更加合适业务的开发语言,如快速业务迭代使用Python,基础服务和云原生部分使用Golang,核心的业务系统使用Java

·服务内部使用gRPC通信,服务接口定义依赖于Protobuf

·原则上跨服务通信不依赖于消息队列,消息队列只用于服务自身的调度与补偿,这样子降低了消息系统本身的复杂性

·所有系统不直接暴露HTTP,需要提供HTTP服务的,使用团队开发的grpc-proxy来实现 HTTP to gRPC的转码代理工作



原则上应用只处理业务本身的问题,所有基础架构部分的能力都转由K8s来负责,包括

· 网关

·服务发现

·负载均衡

·指标与监控

·健康检查

·故障恢复

当前挑战

早期所有技术人员只需要专注业务的编写,其他所有的工作全部交给K8s,在流量比较小业务相对简单的情况下,这个运行非常流畅。然而,随着应用数量的增加,业务变得越加复杂,外部流量也在不断增长,由此带来了应用链路调用更加复杂等新的运维难题

·内部调用用的是gRPC协议,应用端没有做特别处理,导致基于HTTP2的长连接协议无法实现负载均衡,尤其是单一客户端调用变大的情况下,服务端无法有效负载

·因为应用本身比较薄,应用调用链路无法透明化,每次新的发布部署容易出问题



2022年之前,我们使用Linkerd,初步解决了服务在负载均衡和调用链路上的治理难题,但我们大部分的基础架构都是依赖于阿里云,比如

·日志使用SLS

·应用监控使用ARMS

·链路追踪使用XTrace

·仪表盘使用Grafana

·容器监控使用 Prometheus



为了简化基础架构的复杂性,我们在基础服务上的基本原则是使用云厂商而非自建,而Linkerd在实际的使用过程中遇到了一些问题

·需要使用自建的基础设施,无法和阿里云提供的基础设施很好的融合

·应用可观测性比较简单

·Sidecar使用默认配置,控制能力相对较少,在应对一些复杂一点的场景,无法做到灵活配置

而可观测性是服务网格的基石,在一套自建的基础架构上,我们会偶发的出现链路被熔断、某个端口无法访问的场景,最终的解决方案就是取消注入或者重新注入来解决。


基于服务网格 ASM 的探索

集群现状

我们目前有两个生产集群,合计150ECS2500Pod,不同开发语言应用的特点如下

·Golang用于用户基础架构以及计算密集型性的应用系统,总体内存占用不会超过500M,部分服务会随着临时性的内存而增长,如文件的导入导出服务

·Python用于早期业务敏捷迭代构建的业务系统,都是单进程多线程工作模式,单一Pod内存占用不高,但一个Deploy需要更多的ReplicaSet数量

·Java用于全渠道在线交易业务构建的系统,单一Pod需要耗费的资源比较多,但同等情况下单一Pod的处理能力比较强


两个集群包括了不同的应用场景

·ACK-PROD: 早期针对大型客户专有部署的应用集群,每个客户的规模体量比较大,应用资源的隔离通过namespace和调度绑定来隔离

·ACK-SAAS:针对SME/KA全新开发的SaaS平台,所有客户都使用统一的计算资源


调研阿里云服务网格ASM

我们知道, 服务网格作为一种用来管理应用服务通信的基础核心技术,  为应用服务间的调用带来了安全、可靠、快速、应用无感知的流量路由、安全、可观测能力。我们针对开源社区Istio和阿里云服务网格ASM产品分别进行了调研, 通过试用了解到作为云厂商的产品, ASM具备了若干生产使用的功能和实战经验,具体来说, ASM增强了多协议支持以及动态扩展能力,提供精细化服务治理,完善零信任安全体系,并持续提升性能及大规模集群支持能力,降低在生产环境落地服务网格的门槛。商业版适用于有多语言互通,服务精细治理需求,在生产环境大规模使用服务网格的场景。详细的介绍可以参见:https://help.aliyun.com/document_detail/176082.html


通过调研, 我们了解到作为业内首个全托管Istio兼容的服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区开源的Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。

image.png

托管式服务网格ASM在成为多种异构类型计算服务统一管理的基础设施中, 提供了统一的流量管理能力、统一的服务安全能力、统一的服务可观测性能力、以及实现统一的代理可扩展能力, 以此构筑企业级能力。可以通过https://www.aliyun.com/product/servicemesh  查看具体的内容介绍。

基于上述的调研, 我们决定开始使用阿里云服务网格ASM产品进行迁移。


迁移到阿里云ASM

1. ACK-PROD】我们首先将一个足够规模体量的单一客户生产环境(门店供应链)(每天50万笔订单,1500万库存流水)注入Istio,因为这个环境的使用场景不是全天候的,出现问题会有半个小时的缓冲时间来解决问题,并且应用系统做了完善的自动补偿,确保在出现问题我们取消Istio以后业务也能够正常恢复,第一次注入非常成功

2.ACK-PROD】然后我们将另外一个门店供应链的生产环境也做了Istio注入,相对于第一个环境,规模体量小一点,但业务环境更加复杂,有更多的应用服务在运行,第二次注入非常成功

3.ACK-SAAS】随着前面两次的成功实践,我们在一个更加重要的实时生产系统(门店全渠道交易)的基础服务部分引入了Istio,因为这些服务只使用Golang编写,都是一些实时处理要求比较高,但业务相对简单的,第三次注入成功

4.ACK-SAAS】我们在生产环境开始注入部分交易链路,注入以后系统生产可用,在第二天高峰期发现了会有部分服务出现istio-proxy crash导致应用不可用,从而影响了部分应用的正常运行。


鉴于对生产环境的谨慎,我们重新复盘了出现问题的场景,最终得到的结论是

·Java应用的启动对于资源的要求比较苛刻,我们没有提前配置好更加合理的启动参数,将会导致Java应用启动缓慢

·检查机制不完善,将会导致流量打给还没有完全准备就绪的服务,此时K8s的健康检查机制会在多次没有响应时会再次重启服务

·Istio Sidecar默认的设置也会推慢整个Pod的启动时间,之前应用的假设是15s内完成启动,随着Sidecar代理的注入,有时候会遇到更长的时间

·Java应用提供gPRC服务的时候,istio-proxy会出现某种特殊情况的 Crash,这也是导致生产服务不可用的直接原因


简单而言,在istio-proxy存在部分bug的情况下,我们的应用的快速启动策略和健康检查机制的不合理,直接导致了注入Sidecar代理的部分服务生产不可用。

针对这个问题,我们在阿里云工程师的支持之下,在另外一个环境复现并做了改进,主要的改进如下

·针对istio-proxyCRASH问题,社区已经有了解决方案,在(https://github.com/istio/proxy/pull/3658) ,在阿里云工程师的支持下,我们升级了sidecar,并做了A/B测试,确定复现了这个Crash的场景

·针对Java 应用一开始分配更多的CPU资源来加快Java应用启动,在测试过程中,如果默认分配0.2调整到1.5,启动时间最长的会从6分钟减少到40

·调整sidecar配置,根据应用优化istio-proxy的启动速度


在方案得到确认以后,我们开始了第二轮的Istio升级

1.ACK-SAAS】我们将SaaS的供应链业务注入Istio,除了升级过程中遇到部分服务资源不足的问题,其他都非常顺利

2.ACK-SAAS-QA】我们在测试环境复现了启动速度慢的问题,并通过更加合理的启动参数配置验证了在CPU初始化申请对于Java应用的影响

3.【ACK-SAAS-QA】A/B 测试Istio crash场景,确认新的sidecar已经修复这个问题

4.【ACK-SAAS】正式完成全渠道交易的Istio生产注入

5.【ACK-SAAS】将剩余的应用全部完成注入

 

此外,服务网格ASM相比社区Istio能够实现更加丰富的能力,如流量标签、配置推送优化等能力。在实际的应用场景中,我们充分利用配置推送优化能力。 在默认情况下,由于无法确定数据平面内所有工作负载与服务之间的关系,服务网格数据平面内的所有Sidecar都必须保存数据平面集群内所有服务信息的全量配置。同时,一次针对控制平面或数据平面的修改(例如在控制平面新建一条虚拟服务规则),都会导致控制平面向数据平面的所有Sidecar推送新的配置。

而在我们的数据平面Kubernetes集群中的工作负载数量比较多, 默认情况下会增加Sidecar对数据平面集群的资源消耗,同时控制平面会面临较大的配置推送负担,降低控制平面的效率与可用性。ASM提供了选择性服务发现和Sidecar资源推荐功能,帮助优化配置推送效率。

 

服务网格ASM可以通过分析数据平面Sidecar产生的访问日志获取数据平面服务之间的调用依赖关系,为数据平面中的每个工作负载自动推荐Sidecar资源。为工作负载推荐Sidecar资源后:

- Sidecar配置内将仅保留该Sidecar对应工作负载所依赖的服务信息。

- 当该Sidecar资源对应的工作负载无依赖关系的服务发生改变,或与该服务相关的资源发生改变(例如虚拟服务等),都不会引起控制平面向该Sidecar的配置推送。

image.png

图:服务网格ASM通过访问日志分析自动推荐Sidecar CR

 

经过优化后, Sidecar配置大小从原来的40M减少为5M, 控制面配置推送时间也随之大大减少。  

 

总之, 经过一个多月的反复测试和确认,我们终于完成了基于服务网格ASM的核心生产系统切换,相对于之前的服务网格方案,给我们带来了很多益处。

方案优势及进展规划

  1. 完备的可观测性以及应用监控

通过服务网格对应的控制面盘,我们发现了很多之前应用本身的问题,比如

o  不合理的应用补偿策略

o   不合理的应用部署(比如把大数据查询和应用处理放在同一个服务)

o  不合理的应用报错

o  ...

而这些问题随着服务网格的上线,我们变得一清二楚,进而非常方便的推动应用架构的改造


  1. 流量与资源的均衡

这是我们上线服务网格的初衷,随着我们将所有应用放到服务网格,我们真正做到了在CPU、内存、网络利用率的均衡,通过通过应用调用的监控来看,所有请求数量和错误也非常均衡的分配在不同的Pod上,不用再去担心随着流量的增长因为负载不均衡而导致横向扩展失效


  1. 更加强大的流量治理能力

在没有Istio之前,我们基于自身业务需要做了一些手工的流量治理工作,比如

o   东西流量:基于基于租户与门店的流量隔离,允许我们可以允许需要针对某一个租户某一个门店发布指定服务

o   南北流量:针对业务场景进行灰度测试,比如某一个租户的美团订单处理使用新的接单服务

o   为某个租户提供自定义域名

o  ...


这些工作都是基于K8s CRD构建的,随着服务网格的上线,我们发现Istio可以帮助我们实现更多,比如灰度发布熔断限流流量标签等。这些能力将在未来持续不断提升我们线上业务的稳定性。

相关文章
|
3月前
|
运维 负载均衡 监控
探索微服务架构下的服务网格(Service Mesh)实践之路
【8月更文挑战第30天】 在当今日益复杂的分布式系统中,微服务架构已成为众多企业解决系统扩展与维护难题的利器。然而,随着服务的不断增多和网络交互的复杂性提升,传统的微服务管理方式开始显得力不从心。服务网格(Service Mesh)作为一种新兴的解决方案,旨在通过提供应用层的网络基础设施来简化服务间通讯,并增强系统的可观察性和安全性。本文将分享我在采用服务网格技术过程中的经验与思考,探讨如何在现代云原生环境中有效地实施服务网格,以及它给开发和运维带来的变革。
|
5月前
|
负载均衡 测试技术 网络安全
阿里云服务网格ASM多集群实践(一)多集群管理概述
服务网格多集群管理网络打通和部署模式的多种最佳实践
|
4月前
|
Cloud Native 测试技术 开发者
阿里云服务网格ASM多集群实践(二):高效按需的应用多环境部署与全链路灰度发布
介绍服务网格ASM提出的一种多集群部署下的多环境部署与全链路灰度发布解决方案。
|
6月前
|
监控 负载均衡 数据安全/隐私保护
探索微服务架构下的服务网格(Service Mesh)实践
【5月更文挑战第6天】 在现代软件工程的复杂多变的开发环境中,微服务架构已成为构建、部署和扩展应用的一种流行方式。随着微服务架构的普及,服务网格(Service Mesh)作为一种新兴技术范式,旨在提供一种透明且高效的方式来管理微服务间的通讯。本文将深入探讨服务网格的核心概念、它在微服务架构中的作用以及如何在实际项目中落地实施服务网格。通过剖析服务网格的关键组件及其与现有系统的协同工作方式,我们揭示了服务网格提高系统可观察性、安全性和可操作性的内在机制。此外,文章还将分享一些实践中的挑战和应对策略,为开发者和企业决策者提供实用的参考。
|
6月前
|
运维 监控 负载均衡
探索微服务架构下的服务网格(Service Mesh)实践之路
【4月更文挑战第30天】 在现代云计算的大背景下,微服务架构以其灵活性和可扩展性成为众多企业转型的首选。然而,随着服务的激增和网络交互的复杂化,传统的服务通信模式已无法满足需求,服务网格(Service Mesh)应运而生。本文通过分析服务网格的核心组件、运作机制以及在企业中的实际应用案例,探讨了服务网格在微服务架构中的关键作用及其带来的变革,同时提出了实施过程中面临的挑战和解决策略。
|
6月前
|
运维 监控 Cloud Native
云原生架构下的服务网格演进与实践
【5月更文挑战第23天】 随着云计算技术的不断成熟,云原生架构已成为推动企业数字化转型的关键动力。本文将深入探讨服务网格在云原生环境中的重要性,分析其在微服务管理、流量控制和安全性方面的创新应用。通过对服务网格的技术和实践案例的剖析,揭示其如何优化云原生应用的部署、运行和管理,为企业构建更加动态、可靠和高效的分布式系统提供策略指导。
|
6月前
|
运维 监控 负载均衡
探索微服务架构下的服务网格(Service Mesh)实践
【4月更文挑战第28天】 在现代云原生应用的后端开发领域,微服务架构已成为一种广泛采用的设计模式。随着分布式系统的复杂性增加,服务之间的通信变得愈加关键。本文将深入探讨服务网格这一创新技术,它旨在提供一种透明且高效的方式来管理、监控和保护微服务间的交互。我们将从服务网格的基本概念出发,分析其在实际应用中的优势与挑战,并通过一个案例研究来展示如何在现有的后端系统中集成服务网格。
|
6月前
|
Kubernetes Cloud Native 测试技术
使用ASM流量泳道的全链路灰度发布实践
服务网格ASM实现全链路灰度发布:通过流量泳道隔离不同版本环境,配置虚拟服务实现灰度比例控制。从创建泳道、打标签、部署新版本到灰度切流、最终上线及下线旧版。
|
运维 Kubernetes Cloud Native
服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践
通过本文介绍丽迅物流关于基于阿里云服务网格 ASM 如何加速企业业务云原生化进程的实践经验。
|
运维 自然语言处理 Kubernetes
《云原生架构容器&微服务优秀案例集》——01 互联网——合阔智云 通过 ASM 轻松实现微服务治理
《云原生架构容器&微服务优秀案例集》——01 互联网——合阔智云 通过 ASM 轻松实现微服务治理
213 0

相关产品

  • 服务网格