在线上环境中一般都是有多个 k8s 集群,每个k8s集群是不互通的,但是业务场景多多少少会出现跨集群的服务调用,在servicemesh出现之前,大家都会在业务中做逻辑,对于跨集群访问会将流量集中的特定的一个出口,然后转发到目标集群的rpc gateway来实现跨集群调用,这个方案比如 http://www.yidianzixun.com/article/0IX6DYAi
服务网格中比较重要的一个功能就是流量管控,想在业务不做修改的情况下,跨集群流量通过 ingress+egress 解决
比如 C1 集群中的 A 服务,想要调用 C2 集群中的 B 服务,我个人的想法如下
- A 服务能够拿到 B 服务的 k8s service name 以及 port(A 获取 B 的服务信息,可以通过自己的服务发现来做)
- C1 中有 egress 拦截所有到 C2 集群的流量(这个可以通过匹配 C2 集群中的服务名实现)
- C1 中定义 ServiceEntry,这里面的信息就是 C2 中的 ingress
- 在 C1 中 egress 的 VirtualService 中将 B 服务的 serviceName 和 port 写入 http header 中,比如(dst_host,dst_port)
- C2 中的 ingress 收到请求后,需要通过 header 来匹配将该流量转发到具体哪个服务,这个配置都是在 C2 ingress 的 VirtualService 配置中,但是要让流量能够转发正确需要 match dst_host 和 dst_port 这两个 header
- 要完成 5 的这个配置
- 要么将 C2 集群中所有服务都在 ingress 的 VirtualService 进行配置,这个配置也可以通过 webhook 来动态添加
- 要么就配置路由的时,支持变量,比如将 http 的 header 中的 dst_host 和 dst_port 作为 destination 的 host 和 port
以上是个人想法,诉求如下
- 希望大家评估下这个方案是否可行
- 是否有更好的方案
- 第 6 小点的第二个小点是否可行,个人目前还没有查到相关配置