
# 使用南北向MCS
#### 约束限制
- 当前MCS仅支持版本为1.21及以上的CCE Turbo集群、网络模型为underlay的其他Kubernetes集群创建。
- 请提前做好网络规划，保证成员集群间容器网络不冲突，确保ELB实例与容器Pod IP网络可达。若MCS的ELB实例与集群处于不同VPC内，请提前打通VPC间的网络。
 
#### 准备工作
- 如您没有可用的ELB实例，需要先创建ELB实例，具体请参考[创建独享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/elb_lb_000006.html)。该ELB实例需要满足以下条件：
  - ELB为独享型。
  
  - ELB必须支持网络型（TCP/UDP）。
  
  - ELB网络类型必须支持私网（有私有IP地址）。
  
  - 如果ELB与成员集群的网络不在同一VPC内，ELB需要支持开启跨VPC访问的开关。
   
- MCS为跨集群后端工作负载提供统一入口和四层网络访问，因此需要在联邦中提前部署可用的工作负载（Deployment）和服务（Service）。若您无可用工作负载和服务，请参考[无状态负载](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0255.html)和[集群内访问（ClusterIP）](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0271.html)创建。
- 设置集群为underlay网络，支持underlay网络的集群类型请参见[设置集群网络](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0377.html#ucs_01_0377__section191095498203)。
 
#### 创建类别为负载均衡的MCS对象
1. 使用kubectl连接集群联邦，详细操作请参见[使用kubectl连接集群联邦](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0320.html)。
2. 创建并编辑 mcs.yaml 文件，文件内容定义如下所示，参数定义请参见[表1]。
   
   示例YAML定义的MCS对象关联了名为nginx的Service，将nginx的Service注册到华为云ELB的监听器上。
   **vi mcs.yaml**
   ```
   apiVersion: networking.karmada.io/v1alpha1
   kind: MultiClusterService
   metadata:
     name: nginx
     namespace: default
     annotations:
       karmada.io/elb.id: 2050857a-45ff-4312-8fdb-4a4e2052e7dc
       karmada.io/elb.projectid: c6629a1623df4596a4e05bb6f0a2e166
       karmada.io/elb.port: "802"
       karmada.io/elb.health-check-flag: "on"
   spec:
     ports:
       - port: 80
     types:
       - LoadBalancer
   ```
    表1关键参数说明 
   | 参数                                 | 是否必填 | 参数类型                                                  | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|:---|:---|
   | metadata.name                      | 是    | String                                                | MCS对象的名称，应与关联Service保持一致。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | metadata.namespace                 | 否    | String                                                | MCS对象所在命名空间名称，应与关联Service所在命名空间名称保持一致。不填则默认为default。                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | spec.types                         | 是    | String 数组                                             | 流量方向。 实现集群间服务发现能力应配置为CrossCluster； 将服务通过ELB对外暴露应配置为LoadBalancer。                                                                                                                                                                                                                                                                                                                                                                                                        |
   | spec.ports.port                    | 否    | Integer                                               | 关联的Service需要注册到ELB监听器上的服务端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | spec.consumerClusters.name         | 否    | String                                                | Service的访问集群名称，应配置为期望通过MCS实现跨集群访问Service的集群名称。不填则默认设置为所有集群联邦内集群可访问该Service。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | karmada.io/elb.id                  | 是    | String                                                | MCS关联的elb的id，不允许为空。 取值范围：1-32个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | karmada.io/elb.projectid           | 是    | String                                                | MCS关联的elb所属的项目ID。获取方法请参见[获取项目ID](https://support.huaweicloud.com/api-ucs/ucs_api_0018.html)。 取值范围：1-32个字符。                                                                                                                                                                                                                                                                                                                                                                                          |
   | karmada.io/elb.port                | 否    | String                                                | MCS关联的elb的端口，不填时默认为80。 取值范围：1-65535。                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | karmada.io/elb.health-check-flag   | 否    | String                                                | 是否启用健康检查，可选值为： - on：开启  - off：不开启   不填写时默认为off。                                                                                                                                                                                                                                                                                          |
   | karmada.io/elb.health-check-option | 否    | [HealthCheck] Object | 健康检查参数，详情请参见[HealthCheck]。 说明： - 健康检查参数配置示例：   karmada.io/elb.health-check-option: '{"protocol":"TCP","delay":"5","connect_port":"80","timeout":"1","max_retries":"1","path":"/wd"}' - 在annotation开启健康检查配置的情况下，Service名称的长度不应超过39个字符。   |
   | karmada.io/elb.lb-algorithm        | 否    | String                                                | 转发算法： - ROUND_ROBIN：加权轮询算法。  - LEAST_CONNECTIONS：加权最少连接算法。  - SOURCE_IP：源IP算法。   不填写时默认为ROUND_ROBIN。                                                                                                                                                                          |
      
    表2HealthCheck参数说明 
   | 参数           | 是否必填 | 参数类型   | 描述                                                                                                                                                       |
   |:---|:---|:---|:---|
   | protocol     | 否    | String | 健康检查使用的协议。支持TCP/HTTP，默认值是TCP。                                                                                                                            |
   | connect_port | 否    | Int    | 健康检查使用的端口。取值范围\[1，65535\]，为可选参数。 说明： 默认使用后端服务器默认业务端口进行健康检查。指定特定端口后，使用指定的端口进行健康检查。                 |
   | delay        | 否    | Int    | 健康检查的延迟时间，以秒为单位，1-50，默认值是5秒。                                                                                                                             |
   | timeout      | 否    | Int    | 健康检查的超时时间，以秒为单位，1-50，默认值是10秒。                                                                                                                            |
   | path         | 否    | String | 健康检查的请求URL，当protocol为HTTP时生效。 以"/"开头，默认为"/"。支持使用字母、数字和短划线（-）、正斜线（/）、半角句号（.）、百分号（%）、半角问号（?）、井号（#）和and（\&）以及扩展字符集。长度为1-80个字符。 |
   | max_retries  | 否    | Int    | 最大重试次数，取值范围1-10，默认值是3次。                                                                                                                                  |
      
   
   
3. 执行如下命令创建MCS对象。 
   **kubectl apply -f mcs.yaml**
   
   
4. 创建完成后，可以执行如下命令操作MCS对象。其中nginx为MCS对象的名称。 
   - 获取MCS对象：**kubectl get mcs nginx**
   
   - 更新MCS对象：**kubectl edit mcs nginx**
   
   - 删除MCS对象：**kubectl delete mcs nginx**
   
   
   
   
 
#### 通过MCS访问服务
MCS对象创建成功后，绑定的ELB侧将自动创建对应的监听器和健康检查策略，您可以通过 **http://IP:port** 访问后端工作负载，其中IP:port为MCS关联ELB的IP和端口。
如果访问存在问题，请执行 **kubectl describe mcs nginx**查询事件来检查MCS的工作是否正常。
