
# 创建MCS
#### 约束限制
- 当前MCS仅支持v1.21及更高版本的集群创建。
- 当为同一Service同时配置MCS与MCI时，该Service将会下发至MCS中配置的下发集群、访问集群以及对应工作负载的部署集群。
 
 #### 准备工作
- 部署工作负载与服务 MCS提供跨集群服务发现与访问能力，因此需要在集群联邦中提前部署可用的工作负载（Deployment）和服务（Service）。若您无可用工作负载和服务，请参考[无状态负载](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0255.html)和[集群内访问（ClusterIP）](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0271.html)创建。
  
- 设置集群网络 请参照[设置集群网络](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0377.html)对集群间网络互通进行检查与设置。
  
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
若创建MCS实例时，出现报错"policy doesn't allow 'get loadbalancer' to be performed."或"because no identity-based policy allows the xxx action."，表示当前委托权限还未生效，请等待片刻后重试即可，错误出现在事件中则无需关心。
#### 通过控制台YAML创建多集群服务(MCS)
1. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，在左侧导航栏中选择"容器舰队"。
2. 在"容器舰队"页签下找到已开通集群联邦的舰队，单击名称进入详情页。
3. 在左侧导航栏中选择"服务与路由"，选择"多集群服务"页签。
4. 在多集群服务页签，单击右上角"YAML创建"，弹出多集群服务(MCS)YAML创建界面。
5. 当前数据选择YAML，在编辑栏进行编辑（根据实际需求调整配置参数）： 
   ```
   apiVersion: networking.karmada.io/v1alpha1
   kind: MultiClusterService
   metadata:
     name: mcs-24132      # MCS对象名称
     namespace: default      # MCS对象所在命名空间名称
   spec:
     types:
       - CrossCluster     # 类型为集群间服务发现
     providerClusters:
       - name: cluster-25043    # Service的下发集群
     consumerClusters:
       - name: cluster-29544    # Service的访问集群
   ```
   
   
6. 编辑完成后，单击右下角"确定"，完成多集群服务（MCS）创建。
 
 #### 通过Kubectl命令创建MCS对象
1. 使用kubectl连接集群联邦，详细操作请参见[使用kubectl连接集群联邦](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0320.html)。
2. 创建并编辑 mcs.yaml 文件，文件内容定义如下所示，参数定义请参见[表1]。
   
   **vi mcs.yaml**
   示例YAML定义的MCS对象关联了名为foo的Service，支持在cluster A中访问到部署在cluster B中的该Service。
   ```
   apiVersion: networking.karmada.io/v1alpha1 
   kind: MultiClusterService 
   metadata: 
      name: foo                          # MCS对象名称
      namespace: default                  # MCS对象所在命名空间名称
   spec: 
      types: 
        - CrossCluster                   # 类型为集群间服务发现 
      providerClusters:                  # Service的下发集群
        - name: clusterB
      consumerClusters:                  # Service的访问集群
        - name: clusterA
   ```
    表1关键参数说明 
   | 参数                         | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                |
   |:---|:---|:---|:---|
   | metadata.name              | 是    | String | MCS对象的名称，应与关联Service保持一致。                                                                                                                                                                                                         |
   | metadata.namespace         | 否    | String | MCS对象所在命名空间名称，应与关联Service所在命名空间名称保持一致。不填则默认为default。                                                                                                                                                                              |
   | spec.types                 | 是    | String | 流量方向，实现集群间服务发现能力应配置为CrossCluster。                                                                                                                                                                                                 |
   | spec.providerClusters.name | 否    | String | Service的下发集群名称，应配置为Service的部署集群。不填则默认将Service下发至集群联邦内所有集群。 注意： 若Service部署在cluster B，但在下发集群中配置了cluster A与cluster B，则该Service会同时下发至cluster A与cluster B，覆盖A中的原同名Service。 |
   | spec.consumerClusters.name | 否    | String | Service的访问集群名称，应配置为期望通过MCS实现跨集群访问Service的集群名称。不填则默认设置为所有集群联邦内集群可访问该Service。                                                                                                                                                       |
      
   
   
3. 执行如下命令创建MCS对象。 
   **kubectl apply -f mcs.yaml**
   
   
4. 执行如下命令查看MCS对象的状态。其中foo为MCS对象的名称。 
   **kubectl describe mcs foo**
   YAML文件中的status字段记录了MCS的状态，当status字段中出现如下内容时，表明Endpoint Slices下发并同步成功，集群间服务发现能力可用。
   ```
   status: 
     conditions: 
     - lastTransitionTime: "2023-11-20T02:30:49Z"  
     message: EndpointSlices are propagated to target clusters. 
       reason: EndpointSliceAppliedSuccess 
       status: "True"  
     type: EndpointSliceApplied
   ```
   创建完成后，可以执行如下命令操作MCS对象。其中foo为MCS对象的名称。
   - 获取MCS对象：**kubectl get mcs foo**
   
   - 更新MCS对象：**kubectl edit mcs foo**
   
   - 删除MCS对象：**kubectl delete mcs foo**
    
   ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
   若MCS实例删除状态异常，一直显示"删除中"，则异常实例需要强制删除并清理资源。具体操作请参见[MCS/MCI实例删除异常如何排查?](https://support.huaweicloud.com/ucs_faq/ucs_faq_0006.html)
   
   
 
 #### 跨集群访问服务
MCS对象创建成功后，您可以在consumerClusters.name中配置的访问集群中，访问到部署在下发集群中的Service。
创建一个Pod并进入到容器内，使用**curl *http://服务名称*** ***:端口号***命令访问Service，如下所示。
回显出现如下信息表明访问成功。
```
/ # curl http://服务名称:端口号
... 
<h1>Welcome to foo!</h1> 
...
```
