PolarisMesh 月报:发布 v1.3.0 ,完美支持 proxyless 和 proxy 两种服务网格模式

来源: 投稿
2021-12-02

北极星(PolarisMesh )是腾讯开源的百万级服务发现和治理中心,积累了腾讯从虚拟机到容器时代的分布式服务治理经验。作为分布式和微服务架构中的核心组件,PolarisMesh 提供服务寻址、流量调度、故障容错和访问控制等一系列能力,在K8s 和虚拟机环境中可以无差别使用,支持主流的开发模式,兼容grpc、spring cloud和servicemesh等开源生态,帮助用户快速构建扩展性强、可用性高的业务架构,实现从传统架构到云原生架构的转型。

Github地址:https://github.com/polarismesh/polaris

背景

1. Proxy 网格

对于proxy网格,这种模式能有效得将应用与治理组件解耦,便于应用以极低侵入的代价接入微服务体系。但是它却有一个难以规避的问题——性能以及资源消耗,proxy网格为了将应用与治理组件解耦,采取运行独立的proxy容器来接管业务容器的东西流量;为了达到治理能力,proxy需要能够解析业务之间的通信协议并根据其内容作出不同的治理动作,因此proxy实际上大部分的工作都是在频繁的消耗CPU进行序列化相关操作以及网络请求转发,降低整体业务的响应时长以及QPS。

2.proxyless 网格

因为proxy网格难以规避的性能以及资源消耗问题,proxyless网格被重新提了起来,即proxy做的事情,再次回到了业务容器中——即通过引入一个轻量的SDK来负责原先proxy的任务。由于整个网格架构中没有了proxy这一环,性能降低以及资源消耗的问题得到了较好的解决。由于北极星诞生之初,就一并开发了多语言的轻量级的SDK作为北极星在proxyless的方案,并且也是腾讯内部分布式服务长期使用的开发方式。

在之前的版本中,北极星提供了多语言的轻量级高性能SDK,实现注册发现、流量调度、熔断降级和访问控制等服务治理功能。从v1.3.0 版本开始,北极星在通信协议层完成了对xDS协议的支持,可以直接作为envoy或者gRPC的proxyless形式的控制面,北极星对于两种网格模式的互联互通和统一治理能力的正式开放。

实现方案

为了实现proxyless服务与proxy服务的互联互通和统一治理,必须解决以下2个关键点:

  • 服务数据之间可互通

  • 治理规则的互通

由于通过istio默认使用了kubernetes crd作为服务注册中心,因此为了实现服务数据之间的互通,必须打通polaris与kubernetes crd这2个注册中心。polaris扩展kubernetes的controller的方式,开发了polaris-controller组件,通过监听service和endpoint事件,实现kubernetes的服务数据与polaris进行实时同步。从而解决服务数据互通问题。

为了解决治理规则互通的问题,可以通过2个方式来打通:

  1. polaris规则数据转换成istio的规则数据格式,并且与kubernetes的crd进行打通

  2. polaris规则数据转换成XDS数据,直接下发给envoy,不经过istio

为解决全量加载性能问题有两种方案:

  1. 修改Istio,让它支持按需加载服务数据

  2. 直接支持envoy的VHDS协议,envoy直接对接polaris按需加载服务数据

因为Istio社区已经全面转向MCP-OVER-XDS,将原来MCP改成MCP-OVER-XDS存在较大的协议调整工作量。

结合以上问题的可选解决方案,权衡各方面的考虑,我们最终决定采用envoy直接对接polaris的方案来解决一开始提出的3个问题,系统架构如下图:

 

北极星网格优势

这个方案有三大优势

  • 多种微服务体系完美打通

  • K8s和虚拟机环境无差别使用

  • 支持多K8s集群之间的服务发现

1. 多种微服务体系完美打通

在分布式和微服务架构的演进过程中,从部署环境以及应用+治理的结合模式,分别经历了不同的发展阶段。

对于部署环境

而对于应用和治理结合模式


可以看到,无论是部署环境,还是应用+治理结合模式,其发展都不是一蹴而就的,大部分情况下都存在过度阶段,因此这里就引入了不同的微服务体系:

  1. sdk+discovery(无kubernetes)

  2. sdk+discovery 以及 proxy网格(vm + kubernetes 混合部署)

  3. proxy网格 (kubernetes)

  4. proxyless网格(kubernetes)

对于上述不同的微服务技术体系,如何做到统一的治理

北极星不仅仅通过xDS协议的支持以及多语言客户端来解决1、3、4情况,同时还提供了polaris-controller组件,用于同步kubernetes中的service到polaris,使得polaris既有通过kubernetes注册服务,也有通过polaris注册的服务,解决了vm + kubernetes 混合部署模式下的应用之间互通互联的问题。

2. Kubernetes 和虚拟机环境无差别使用

对于polaris来说,无论是在Kubernetes上的运行的服务还是运行在VM上的运行服务,统一转换为polaris的数据模型,由polaris充当控制面的角色,提供统一的服务操作入口以及服务治理规则定义,用户无需在关心自己的服务运行在何种环境下,也无需关心该如何统一管理多种运行环境下的服务实例。

无论在kubernetes环境还是在VM环境,通过提供polaris-agent组件,直接代理业务的DNS请求,通过对DNS的解析,返回被调服务的一个实例给主调方用于完成业务请求,让业务在代码无侵入前提下使得业务能够享受polaris的服务发现功能。

3. 支持多 Kubernetes 集群之间的服务发现

随着业务规模的增加,可能出现不同业务不同kubernetes集群,如果出现不同业务之间需要相互服务调用,那么就需要解决跨kubernetes集群间服务发现的问题,当前istio要支持跨kubernetes集群的服务发现的话,两两kubernetes集群间都需要进行配置,那么随着kubernetes集群数变多,那么就需要不断的执行istio配置操作,相比之下,polaris支持多kubernetes集群服务发现,只需要用户在每个kubernetes集群部署一个polaris-controller,每个controller都指向同一个polaris-server集群即可。

1.3.0 Release Notes

Feature:

  • 【polaris】接入层支持可观测性指标暴露给prometheus
  • 【polaris】优化部署脚本使用体验问题

Bugfix:

  • 【polaris】优化心跳处理方案,解决polaris重启可能导致实例健康状态不正确的问题
  • 【polaris】修复部分单元测试用例

后续规划

  • 【polaris-console】支持命名空间管理
  • 【polaris-php】支持最好的语言PHP(7.x)接入
  • 【spring-cloud-tencent】支持spring cloud 2020接入
  • 【spring-boot-polaris】支持spring boot

更多详细的生态规划任务可以查看 issue:https://github.com/polarismesh/polaris/issues/163

展开阅读全文
8 收藏
分享
加载中
最新评论 (2)
可以
2021-12-03 18:51
0
回复
举报
学习
2021-12-03 13:52
0
回复
举报
更多评论
2 评论
8 收藏
分享
返回顶部
顶部