
# 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. 解除业务上使用k8s域名进行跨集群访问。
 
#### 新建集群和网格
1. 登录CCE 控制台，选择在当前企业版集群所在的同VPC下[创建集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)。
2. 重新部署业务。
3. 在ASM控制台，创建基础版本网格，选择[步骤1]新建的集群。
   
   
   
   
   
4. 在新建的网格详情页，依次单击"网格配置-sidecar管理-sidecar管理"，选择需要开启自动注入的命名空间（[准备工作中步骤11](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_1011.html#asm_bestpractice_1011__li5411812381)中记录的命名空间），是否重启已有服务选择"是"，勾选"取消注入sidecar会重启关联的Pod，将会暂时中断您的业务"，单击"确定"。
   
   
   
   
   
5. 查看网格使用了几个ELB，新建同等数量和规格的ELB，重新创建网关和路由。 
   - 方案一：
     1. 在待迁移网格详情页，网关管理页面查看待迁移集群上有几个网关路由。即"所属集群"字段是待迁移集群的全部网关。 
        
     
     2. 在新基础版网格上选用新建的ELB，重新创建网关和路由。
      
   
   
   
   - 方案二：
     1. 将准备工作中备份的该集群资源上传到集群节点，执行如下命令恢复，其中xx为备份的文件名。
        ```
        #查看老资源
        grep -i "老ELB IP" *.yaml
        grep -i "老ELB ID" *.yaml
        grep -i "老clusterID" *.yaml
        grep -i "老ClusterName" *.yaml
        #ELB IP 替换
        sed -i 's/老ELB IP/新ELB IP/g' *.yaml
        #ELB ID 替换
        sed -i 's/老ELB ID/新ELB ID/g' *.yaml
        #替换clusterID
        sed -i 's/老clusterID/新clusterID/g' *.yaml
        #替换CluseterName
        sed -i 's/老ClusterName/新ClusterName/g' *.yaml
        #替换完成后查看 
        grep -i "新ELB IP" *.yaml
        grep -i "新ELB ID" *.yaml
        grep -i "新clusterID" *.yaml
        grep -i "新ClusterName" *.yaml
        kubectl create -f xx.yaml
        ```
        
      
   
   
   
   
 
#### 【可选】解除业务跨集群k8s服务访问
- 方案一：将有访问关系的服务迁移到同一个集群中。

- 方案二：通过创建网关进行服务间访问。
业务解除跨集群流量访问，如A集群a服务访问B集群b服务，以此为例需进行如下操作
1. 在新基础版网格上创建网关访问b服务，路由选择前缀匹配，URL选择 "/"。
2. (可选) 在A集群所在的网格上创建b服务所在网格网关对应的ServiceEntry 和 WorkloadEntry代替b服务，在B网格新建的Gateway中添加'\*', VirtualService中的 hosts 改为 '\*' 。 
   
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001863079009.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_0000001816319224.png)
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001816478980.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_0000001815846536.png)
   2. 创建灰度任务，切部分流量到修改了配置的新版本。
   
   3. 验证功能正常后将在CCE界面将镜像替换成新版本，然后取消灰度任务。
   
   
   
   
 
#### 移除企业版集群
1. 从DNS上将待移除的网关的地址改为新基础版集群的网关。
2. 删除该集群上部署的网关，可以在网关管理页面查看网关所属集群。
3. 将对应的集群移除出企业版网格。
4. 重复1-3步骤，直到所有集群都移除出网格
 
#### 功能验证
验证业务功能正常可用。
#### 异常回退
1. 将集群添加回企业版网格。
2. 使用控制面kubectl 执行如下命令： 
   ```
   kubectl create -f all-gw.yaml
   ```
   使用数据面kubectl 执行如下命令：
   ```
   kubectl create -f user-all-svc.yaml
   ```
   
   
3. 功能验证。
4. 将新建网格集群删除。
 
