该项目主要将注册在 Kubernetes 外部的服务接入集群中,并基于 Istio 和 MOSN 实现服务网格化。目前仅适用于注册在 Zookeeper 上的 Dubbo 服务,后续会支持如 Nacos 等其他注册中心。
项目包含 mesh-adapter
和 mesh-controller
两种组件。
mesh-adapter
主要负责适配不同的注册中心,如 Zookeeper
和 Nacos
,将其中的服务、实例和配置信息统一转化为预先定义的 CRD
,交由 mesh-controller
处理。
mesh-controller
负责处理预定义的 CRD
,如 ConfiguredService
、ServiceConfig
、ServiceAccessor
等。mesh-controller
通过一定的规则,将这些 CRD
统一转化为 Istio
可理解的配置,如 ServiceEntry
、VirtualService
、DestinationRule
和 WorkloadEntry
等,再交由 Pilot
将其转化为 xDS 协议 下发至数据面。
如图:
待补充。
我们预定义了六种 CRD,分别为 ConfiguredService
、ServiceConfig
、MeshConfig
、ServiceAccessor
、AppMeshConfig
和 IstioConfig
。
ConfiguredService
保存注册中心中服务及实例的信息,通过 ServiceEntry
将服务注册在 Pilot
中,服务实例通过 WorkloadEntry
映射。若服务实例 label
中包含蓝绿灰等分组信息,将创建默认的 VirtualService
和 DestinationRule
策略,Consumer
只能调用同组的 Provider
。
根据 zk 中的数据实时更新。
ServiceConfig
保存配置中心各服务及实例的配置,如重试、超时、权重、负载均衡策略等。包含动态路由,Controller 将根据此信息动态调整各个 Subset
的流量权重。仅更新 VirtualService
、DestinationRule
和 WorkloadEntry
三种配置。
ServiceAccessor
保存了同一个应用(通过标签 app
选择)下所有服务的调用关系,Controller
将根据这些调用关系生成 Sidecar 限定服务的作用域,通过配置 egress 限定代理可以访问的服务,当 xDS 更新时,仅下发配置到此作用域内的代理 MOSN 中,极大提高 xDS 下发的效率。
MeshConfig
包含整个网格的元信息,如各个 Subset
如何设置,全局的超时、重试策略,用来筛选实例的具体标签等等。MeshConfig
的修改将会触发全局所有 ConfiguredService
、ServiceConfig
和 ServiceAccessor
的调和过程。
AppMeshConfig
将同一应用所有服务的所有配置统一起来,主要用于统计和观测。未完善。
IstioConfig
主要用来在多个集群中可定制的、自动化的安装 Istio
,暂未实现。