istio多集群多租户部署
TDSF v5.4及之前版本,网格(istiod)的部署都是平台维度,默认部署到<系统租户>的指定项目中。平台上多集群、多租户均使用一套服务网格组件。随着公司业务的不断扩展,越来越多的服务接入网格,导致istiod服务自身占用的资源不断增加、网格中治理规则下发速度降低等问题。例如在某个客户项目中遇到如下情况:
- 当接入8个左右系统时,istiod资源已配置到12c16g,很耗资源。当服务数扩大,会导致无法满足性能需求等问题。
- 部署模式上,由于生产集群、测试集群的服务、权限都需要隔离,所以生产集群、测试集群需要分别部署portal、service-mesh-api、istiod等,部署架构复杂,运维成本较大。
基于以上两点,亟需调整网格部署架构,支持网格多集群多租户部署。
网格部署模式
同一网格中的任何服务之间都是能够相互访问的,不管服务属于哪个集群。所以实际应用场景中,生产环境、测试环境不能共用同一套网格。针对客户公司、业务规模,支持以下部署模式:
1、全局维度部署生产服务网格、UAT服务网格、DAT服务网格等。
具体部署方法:在<系统租户/istio-system>下,部署多套网格。例生产集群A\B\C部署为生产网格;UAT集群D\E部署为UAT网格
此种部署方式,网格内集群不允许再加入到其它网格中
2、租户内按生产、UAT、DAT分别部署网格:部署项目可选,加入到此网格的集群,可再次加入其他租户(除系统租户外)的网格内。
- 租户&集群维度仅支持部署一套网格。
- TDSF v5.6是单控制面多集群多网格部署,后续版本会考虑支持多控制面多集群多网格部署。
下面我们根据两种实际业务场景来简述下上面两种部署模式:
1、某公司PaaS平台结构如下图所示。

租户1、租户2、租户3分别授权生产集群A、生产集群B、测试集群C、测试集群D

由于同一网格中的任何服务之间都是能够相互访问的,不管服务属于哪个集群。故生产集群和测试集群不能加入到同一个网格中。而且租户1、租户2、租户3划分的粒度不大,服务数量不多且相互之前有业务调用关系,建议部署两套全局维度的网格即可。如下图所示。
部署步骤:
- 系统管理员进入[管理工作台/服务网格配置/网格管理],点击<添加网格>,选择“系统租户”,namespace为istio-system的项目(此项目需提前创建好,并授权生产集群A/B),primary集群选择“生产集群A”,remote集群选择“生产集群B”,等其它相关配置,确定后,“生产环境网格”开始部署。
- 系统管理员进入[管理工作台/服务网格配置/网格管理],点击添加网格,选择“系统租户”,namespace为istio-system的项目(此项目需提前创建好,并授权生产集群A/B),primary集群选择“测试集群C”,remote集群选择“测试集群D”,等其它相关配置,确定后,“测试环境网格”开始部署。
网格部署完成后:
租户1&生产集群A,租户1&生产集群B,租户2&生产集群A,租户2&生产集群B,租户3&生产集群A,租户3&生产集群B中部署的容器服务均可接入<生产环境网格>中,进行网格服务发现和治理。
租户1&测试集群C,租户1 &测试集群D,租户2 &测试集群C,租户2 &测试集群D,租户3&测试集群C,租户3 &测试集群D中部署的容器服务均可接入<测试环境网格>中,进行网格服务发现和治理。
2、例如某公司PaaS平台结构如下:生产租户授权生产集群A、生产集群B;测试租户、研发租户分别授权测试集群C、测试集群D。

此结构中,生产租户和测试租户明显的分隔开,可以租户维度部署服务网格,如下图所示。

网格部署完成后:
- 仅生产租户&生产集群A,生产租户&生产集群B中部署的容器服务可接入<生产环境网格>中,进行网格服务发现和治理。
- 仅测试租户&测试集群C,测试租户&测试集群D中部署的容器服务可接入<测试环境网格>中,进行网格服务发现和治理。
- 仅研发租户&测试集群C,研发租户&测试集群D中部署的容器服务可接入<研发环境网格>中,进行网格服务发现和治理。
多集群应用统一流量治理
同一网格的服务,相同namespace下的相同service名称,部署在不同的集群上,被认为是相同服务,在网格中流量分配或治理时,是面向其所有服务实例。
如下图:网格A,部署租户为租户1,primary集群是集群A,remote集群是集群B。
- 项目B& 集群A的服务svcname1、svcname2、svcname4已接入网格。
- 项目B& 集群B的服务svcname1、svcname2、svcname3已接入网格。
- 网格A中已部署两个入口网关。
- svcname4 创建了路由,关联入口网关2。
- svcname2 创建了路由,关联入口网关1。
流量治理:
- 只要跨集群调用,就需要流量流经eastwest gateway,并且被调服务需要开启mTLS,否则调用不成功。
- 服务接入网格后,默认是关闭mTLS的。
下面介绍下图三种不同的调用:
1、外部请求通过入口网关1访问svcname2
(1) 如果svcname2未开启mTLS,流量只分发到项目B &集群A 的svcname2上。
(2) 如果svcname2开启mTLS,流量负载均衡分发到项目B&集群A的svcname2和项目B&集群B的svcname2上。
2、外部请求通过入口网关2访问svcname4
(1) 如果svcname4未开启mTLS,流量分发失败。
(2) 如果svcname4开启mTLS,流量负载均衡分发到项目B&集群A的svcname4上。
3、网格内部,svcname2调用svcname1
(1) 如果svcname1未开启mTLS,流量只分发到项目B &集群A的svcname1上。
(2) 如果svcname1开启mTLS,流量负载均衡分发到项目B&集群A的svcname1和项目B&集群B的svcname1上。
