跳到主要内容

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平台结构如下图所示。

test

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

test

由于同一网格中的任何服务之间都是能够相互访问的,不管服务属于哪个集群。故生产集群和测试集群不能加入到同一个网格中。而且租户1、租户2、租户3划分的粒度不大,服务数量不多且相互之前有业务调用关系,建议部署两套全局维度的网格即可。如下图所示。



部署步骤:

  1. 系统管理员进入[管理工作台/服务网格配置/网格管理],点击<添加网格>,选择“系统租户”,namespace为istio-system的项目(此项目需提前创建好,并授权生产集群A/B),primary集群选择“生产集群A”,remote集群选择“生产集群B”,等其它相关配置,确定后,“生产环境网格”开始部署。
  2. 系统管理员进入[管理工作台/服务网格配置/网格管理],点击添加网格,选择“系统租户”,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。

test

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

test

网格部署完成后:

  • 仅生产租户&生产集群A,生产租户&生产集群B中部署的容器服务可接入<生产环境网格>中,进行网格服务发现和治理。
  • 仅测试租户&测试集群C,测试租户&测试集群D中部署的容器服务可接入<测试环境网格>中,进行网格服务发现和治理。
  • 仅研发租户&测试集群C,研发租户&测试集群D中部署的容器服务可接入<研发环境网格>中,进行网格服务发现和治理。

多集群应用统一流量治理

前提说明

同一网格的服务,相同namespace下的相同service名称,部署在不同的集群上,被认为是相同服务,在网格中流量分配或治理时,是面向其所有服务实例。

如下图:网格A,部署租户为租户1,primary集群是集群A,remote集群是集群B。

  1. 项目B& 集群A的服务svcname1、svcname2、svcname4已接入网格。
  2. 项目B& 集群B的服务svcname1、svcname2、svcname3已接入网格。
  3. 网格A中已部署两个入口网关。
  4. svcname4 创建了路由,关联入口网关2。
  5. 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上。

test