https://weibo.com/ttarticle/p/show?id=2309404427042262220936
作者丨田晓旭
嘉宾丨黄俊
在过去的两年中,Service Mesh 迅速在业界走红,从概念期进入到了应用期。为了帮助大家解决 Service Mesh 在落地过程中可能遇到的问题,我们采访了多家互联网企业的应用实践,例如美团点评、同程艺龙以及瓜子二手车等,本文我们采访了腾讯高级专项测试工程师黄俊,请他和大家分享腾讯的 Service Mesh 实践。今年 10 月,他将在 QCon 全球软件开发大会(上海站)2019 分享题为《腾讯云上基于 Service Mesh 的后台环境管理实践》的演讲。
想要回答“为什么需要 Service Mesh”这个问题,首先得弄明白 Service Mesh 是什么。关于 Service Mesh 的定义,业界似乎已经达成了共识:Service Mesh 是云原生服务通信的基础设施。在黄俊看来,Service Mesh 最关键的部分是将服务通信管理能力从业务应用中剥离下沉至基础设施的思想与实现。
其次,Service Mesh 主要是解决什么问题?“透明无侵入是 Service Mesh 的最大特性。”黄俊表示,“Service Mesh 可以提供服务间一致可见性和网络流量控制,无需修改业务程序代码,即可获得管控服务通信流量与层级观测的能力。”
Service Mesh 主要解决的是传统意义上的“服务治理”,覆盖服务间流量、容错、安全控制和全面遥测。传统的主流解决方法是使用 SDK 类库的方式显式地对业务应用程序进行改造,但是这种方式在提供能力的同时,也带来了相应的维护和使用成本,从而间接影响业务开发迭代的效率,例如,开发团队需要感知并掌握治理框架、需要持续改造应用程序、对开发语言、对主被调服务接入 SDK 版本有依赖等等。而 Service Mesh 的出现,从网络层面自下而上地提出了更好的解决方案与实现,基于服务通信基础设施的定位和无侵入的特性,Service Mesh 可对业务开发透明地提供“服务治理”能力。
在企业技术部门中,黄俊认为开发与基础运维团队应该要格外关注 Service Mesh,并且关注的侧重点还有所不同:
早期,腾讯自研业务在内部做服务化拆分与部署时就已经在尝试应用 Service Mesh 相关技术来解决服务通信间的路由、容错、限流与监控。当时,腾讯内部多个业务线都有同类工具类落地,不过,都还停留在业务框架层面。近年,随着容器化技术的广泛应用,腾讯自研业务中也逐渐落地了 K8s,Service Mesh 才在腾讯的部分业务中有了真正意义上的落地,例如游戏、社交、工具平台等业务。
为了更清楚的阐述腾讯 Service Mesh 实践,我们将重点介绍一下其是如何利用 Service Mesh 进行后台环境管理。
技术选型:Istio+K8s
腾讯后台环境具有多租户、多分支、多环境的业务特点,需要高精度自定义通信流量管控,可实现动态配置不同租户(用户)请求依赖任意指定环境中的指定分支版本,同时支持在流量层面隔离租户依赖环境。
在技术选型方面,腾讯采用了 Istio+K8s 来实现后台环境的管理。Service Mesh 也有很多实现方式,为什么会选定 Istio + K8s 呢?黄俊解释主要是出于两方面考虑:
后台环境管理的实践过程
据黄俊介绍,腾讯基于 Service Mesh 的后台环境管理实践可以分成 3 个阶段:
第一阶段:解决研发过程中开发调试与测试的冲突,开发测试环境与测试环境分离。这一阶段只要一次性把几套固定的环境搭建出来即可,但是一套环境中经常会出现相互冲突,例如测试同学之间的环境冲突。
第二阶段:一键自动化建立全新的测试环境,保证每个人在需要时,都有自己的开发测试环境。这一阶段,主要做了两部分工作:一是把环境进行容器化以便更好地做服务编排,K8s 能够让每个后台服务的搭建变得容易简单;二是对后台请求做精细化的路由管理,我们对 Istio Envoy 中的源码做了很多改造工作来支持更多的私有 RPC 协议。
第三阶段:结合 DevOps、CI/CD 以及自动化测试,在这一阶段,后台环境的持续部署能力将提升整体研发效能。
利用 Istio+ K8s 实现的后台环境管理,不仅降低了多种后台异构带来的环境成本,而且提升了研发测试过程的效率,根据黄俊的介绍整个实践过程的难点主要集中在以下三点:
支持私有 RPC 协议:Istio 不支持私有 RPC 协议的流量管理,而测试开发环境管理的核心就是需要 Istio 支持私有 RPC 协议流量的管理,同时,我们希望复用 Istio 原生的能力,而不是重复造轮子。
解决方案:利用 Istio 支持的 HTTP/gRPC 作为私有协议数据的传输隧道,同时将需要作为流量管理的信息暴露到 HTTP/gRPC header(例如:染色信息)。
支持私有名字服务:私有协议改造后,下发的 HTTP/gRPC 路由规则不生效,host 匹配失败,即私有名字服务解析到的 POD IP 无法匹配 ServiceName、ServiceIP 以及域名。
解决方案:在 Istio-proxy 的服务发现逻辑中记录 Service 和 POD IP 的映射关系,具体流量解析时,再通过 POD IP 反查该 POD 所属的 ServiceName,将反查值作为 host 字段。
支持流量转发给本地 POD IP:Istio-proxy 流量拦截后,透传给相同 POD 下的业务服务时,目标地址为 127.0.0.1,而业务监听的 socket 基本为 POD IP,链路不通。
解决方案:将下发的终点 socket_address 由 127.0.0.1 改为当前 POD 的 ip 地址,不过代价是舍弃 Istio 对 POD 调用自己流量的管控能力。
目前,国内的 Service Mesh 应用和开发基本都源自 Istio,无论是直接优化应用还是重构部分模块,主要投入者还是公有云云计算服务商,作为容器平台能力的补充。另外,传统的微服务框架开始集成 Service Mesh 的一部分能力作为服务接入的拓展方式,主要面向私有云与传统行业转型。
在落地方面,整个市场还处于早期阶段,但比较乐观的是,随着 K8s 的推广和普及,相比于之前的迟疑,大家对于 Service Mesh 的认可度提高了,各个行业已经逐步有客户在主动尝试并生产应用 Service Mesh。
黄俊表示:“作为技术,Service Mesh 还处于发展期,即使是最火的 Istio 项目也才推出了 1.2 版本,尚未达到 K8s 那样的成熟度。”他认为 Service Mesh 目前存在的问题主要集中在以下两点:
嘉宾介绍
黄俊,腾讯高级专项测试工程师,现负责腾讯文档、手 Q 增值服务等质量团队。2014 年加入腾讯,经历了移动 APP/AI 测试的发展历程,目前主要聚焦在如何结合 DevOps 理念来助力团队研发效能提升。