合阔智云核心生产系统切换到服务网格 ASM 的落地实践
背景
Aliware
技术现状
Aliware
-
不依赖于单一语言和单一技术框架,允许使用更加合适业务的开发语言,如快速业务迭代使用 Python,基础服务和云原生部分使用 Golang,核心的业务系统使用 Java -
服务内部使用 gRPC 通信,服务接口定义依赖于 Protobuf -
原则上跨服务通信不依赖于消息队列,消息队列只用于服务自身的调度与补偿,这样子降低了消息系统本身的复杂性 -
所有系统不直接暴露 HTTP,需要提供 HTTP 服务的,使用团队开发的 grpc-proxy 来实现 HTTP to gRPC 的转码代理工作
-
网关 -
服务发现 -
负载均衡 -
指标与监控 -
健康检查 -
故障恢复
当前挑战
Aliware
-
内部调用用的是 gRPC 协议,应用端没有做特别处理,导致基于 HTTP2 的长连接协议无法实现负载均衡,尤其是单一客户端调用变大的情况下,服务端无法有效负载; -
因为应用本身比较薄,应用调用链路无法透明化,每次新的发布部署容易出问题。
-
日志使用 SLS -
应用监控使用 ARMS -
链路追踪使用 XTrace -
仪表盘使用 Grafana -
容器监控使用 Prometheus
-
需要使用自建的基础设施,无法和阿里云提供的基础设施很好的融合 -
应用可观测性比较简单 -
Sidecar 使用默认配置,控制能力相对较少,在应对一些复杂一点的场景,无法做到灵活配置
基于服务网格 ASM 的探索
Aliware
集群现状
-
Golang 用于用户基础架构以及计算密集型性的应用系统,总体内存占用不会超过 500M,部分服务会随着临时性的内存而增长,如文件的导入导出服务; -
Python 用于早期业务敏捷迭代构建的业务系统,都是单进程多线程工作模式,单一 Pod 内存占用不高,但一个 Deploy 需要更多的 ReplicaSet 数量; -
Java 用于全渠道在线交易业务构建的系统,单一 Pod 需要耗费的资源比较多,但同等情况下单一 Pod 的处理能力比较强。
-
ACK-PROD:早期针对大型客户专有部署的应用集群,每个客户的规模体量比较大,应用资源的隔离通过namespace和调度绑定来隔离; -
ACK-SAAS:针对 SME/KA 全新开发的 SaaS 平台,所有客户都使用统一的计算资源。
调研阿里云服务网格 ASM
迁移到阿里云 ASM
Aliware
第一轮
-
第一次注入:ACK-PROD
我们首先将一个足够规模体量的单一客户生产环境(门店供应链)(每天 50 万笔订单,1500 万库存流水)注入 Istio,因为这个环境的使用场景不是全天候的,出现问题会有半个小时的缓冲时间来解决问题,并且应用系统做了完善的自动补偿,确保在出现问题我们取消 Istio 以 后业务也能够正常恢复,第一次注入非常成功。
-
第二次注入:ACK-PROD
-
第三次注入:ACK-SAAS
-
第四次注入:ACK-SAAS
-
Java 应用的启动对于资源的要求比较苛刻,我们没有提前配置好更加合理的启动参数,将会导致 Java 应用启动缓慢; -
检查机制不完善,将会导致流量打给还没有完全准备就绪的服务,此时 K8s 的健康检查机制会在多次没有响应时会再次重启服务; -
Istio Sidecar 默认的设置也会推慢整个 Pod 的启动时间,之前应用的假设是 15s 内完成启动,随着 Sidecar 代理的注入,有时候会遇到更长的时间; -
Java 应用提供 gPRC 服务的时候,istio-proxy 会出现某种特殊情况的 Crash,这也是导致生产服务不可用的直接原因。
-
针对 istio-proxyCRASH 问题,社区已经有了解决方案,在阿里云工程师的支持下,我们升级了 Sidecar ,并做了 A/B 测试,确定复现了这个 Crash 的场景; -
针对 Java 应用一开始分配更多的CPU资源来加快 Java 应用启动,在测试过程中,如果默认分配 0.2 调整到 1.5,启动时间最长的会从 6 分钟减少到 40 秒; -
调整 Sidecar 配置,根据应用优化 istio-proxy 的启动速度;
第二轮
-
第一次注入:ACK-SAAS
-
第二次注入:ACK-SAAS-QA
-
第三次注入:ACK-SAAS-QA
-
第四次注入:ACK-SAAS
-
第五次注入:ACK-SAAS
-
Sidecar 配置内将仅保留该 Sidecar 对应工作负载所依赖的服务信息。 -
当该 Sidecar 资源对应的工作负载无依赖关系的服务发生改变,或与该服务相关的资源发生改变(例如虚拟服务等),都不会引起控制平面向该 Sidecar 的配置推送。
方案优势及进展规划
Aliware
完备的可观测性以及应用监控
-
不合理的应用补偿策略 -
不合理的应用部署(比如把大数据查询和应用处理放在同一个服务) -
不合理的应用报错 -
...
流量与资源的均衡
更加强大的流量治理能力
-
东西流量:基于基于租户与门店的流量隔离,允许我们可以允许需要针对某一个租户某一个门店发布指定服务 -
南北流量: 针对业务场景进行灰度测试,比如某一个租户的美团订单处理使用新的接单服务 -
为某个租户提供自定义域名 -
...