
# 1.0企业版多集群场景（使用原集群创建网格）
#### 前提
1. 确保[准备工作](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_1011.html#asm_bestpractice_1011__section8260108181414)已完成。
2. 梳理网格下各个集群的网关和跨集群svc。
   
   | 集群  |  网关  | 跨集群访问的服务 |
   |---|---|---|
   | A   | a-gw | 集群A 、集群B |
   | B   | b-gw | 集群B      |
   | ... | ...  | ...      |
      
   
3. 关闭mtls以及访问授权，使用如下命名查看是否存在对应资源。
   ```
   kubectl get PeerAuthentication -A
   kubectl get AuthorizationPolicy -A
   kubectl get RequestAuthentication -A
   ```
   ![](https://support.huaweicloud.com/bestpractice-asm/public_sys-resources/note_3.0-zh-cn.png)
   - 查看查询到的PeerAuthentication ，若spec.mtls.mode为STRICT，则需要将STRICT改为PERMISSIVE。
   
   - 查看查询到的AuthorizationPolicy， 若使用了该功能，则需要在迁移过程中暂时删除访问授权。
   
   - 查看查询到的RequestAuthentication， 若使用了该功能，则需要在迁移过程中暂时删除请求认证。
     
4. 允许迁移期间业务访问中断。
5. 解除业务上使用k8s域名进行跨集群访问。
 
#### 解除业务跨集群k8s服务访问（可选）
- 方案一：将有访问关系的服务迁移到同一个集群中。

- 方案二：通过创建网关进行服务间访问。
业务解除跨集群流量访问，如A集群a服务访问B集群b服务，此步骤需要在迁移集群后操作。
1. 在B集群移除出企业版网格之后新建的基础版网格上新建网关访问b服务，路由选择前缀匹配，URL选择 "/"。
2. (可选) 在A集群上创建b服务所在网格网关对应的ServiceEntry 和 WorkloadEntry代替b服务，在B网格新建的Gateway中添加'\*', VirtualService中的 hosts 改为 '\*' 。 
   
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001862433605.png)
   
   ```
   apiVersion: networking.istio.io/v1alpha3
   kind: ServiceEntry
   metadata:
     name: b-mesh-gateway
   spec:
     hosts:
     - b-mesh-gateway.default.svc.cluster.local
     location: MESH_EXTERNAL
     ports:
     - name: http
       number: 80      //创建的网关访问端口
       protocol: HTTP
       targetPort: 80  //创建的网关访问端口
     resolution: STATIC
     workloadSelector:
       labels:
         app: b-mesh-gateway
   ---
   apiVersion: networking.istio.io/v1alpha3
   kind: WorkloadEntry
   metadata:
     name: b-mesh-gateway
   spec:
     address: x.x.x.x  //新ELB的IP地址
     labels:
       app: b-mesh-gateway
   ```
   gateway和virtualSevice host添加'\*'
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001815673808.png)
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001815833592.png)
   
   
3. 开启istio DNS访问 
   在A业务集群上使用如下命令
   ```
   kubectl edit iop {iop名} -nistio-system
   ```
   在spec.meshConfig.defaultConfig.proxyMetadata下如下添加配置
   ```
   ISTIO_META_DNS_CAPTURE: "true"
   ISTIO_META_DNS_AUTO_ALLOCATE: "true"
   ```
   ![](https://support.huaweicloud.com/bestpractice-asm/public_sys-resources/caution_3.0-zh-cn.png)
   istio 1.18.7-r4以及以上的网格版本需要执行下面的操作，istio1.18.7-r4之前的网格版本无需执行。
   在通过kubectl edit iop编辑好您要修改的参数后，需要同时把install.istio.io/ignoreReconcile参数的值改为false，保存退出。
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000002241895141.png)
   然后再使用kubectl get iop -n istio-system命令查看iop状态，等待STATUS字段变为HEALTHY。
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000002242015001.png)
   最后还需要再把install.istio.io/ignoreReconcile参数的值改回true。
   
   
4. 修改访问地址，确保流量已经访问到新集群 
   1. 如使用springcloud，需要修改FeignClient访问地址，在注解中指定新url地址（producer.default:8089 -\> b-mesh-gateway.default:8089，若第二步未操作，则直接替换为网关地址）
   
   
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001862513397.png)
   2. 创建灰度任务，切部分流量到修改了配置的新版本
   
   3. 验证功能正常后将流量都切到新版本
   
   
   
   
 
#### 迁移集群
1. 删除该集群上部署的网关。在待迁移网格详情页，网关管理页面查看待迁移集群上有几个网关路由。即"所属集群"字段是待迁移集群的全部网关。
2. 将对应的集群移除出企业版网格。
3. 在ASM控制台 ，创建基础版本网格，选择移除出企业版网格的集群。 
   
   
   
4. 在新建的网格详情页，依次单击"网格配置-sidecar管理-sidecar管理"，选择需要开启自动注入的命名空间（[准备工作中步骤11](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_1011.html#asm_bestpractice_1011__li5411812381)中记录的命名空间），是否重启已有服务选择"是"，勾选"取消注入sidecar会重启关联的Pod，将会暂时中断您的业务"，单击"确定"。
   
   
   
   
5. 进行服务诊断，并处理异常。
6. 恢复istio资源，选择如下任意一个方案执行。 
   方案一：重新手动创建网关，并添加路由。
   方案二：将准备工作中备份的该集群资源上传到集群节点，执行如下命令恢复，其中xx为备份的文件名。
   ```
   kubectl create -f xx.yaml
   ```
   
   
7. （可选）执行解除业务跨集群访问方案二
8. 重复执行上述步骤1-7，直至所有集群迁移完毕。
 
#### 功能验证
验证业务功能。
