CCM(Cloud Controller Manager)是ACK的一个系统核心组件,支持在同一个CLB后端挂载集群内节点和集群外ECS,可以解决迁移过程中流量中断的难题。同时CCM还支持将业务流量转发至多个Kubernetes集群内,支撑备份、容灾等需求,保障业务高可用。本文通过三个典型场景介绍如何通过CCM跨集群部署服务。
前提条件
已通过传统型负载均衡CLB控制台创建CLB实例,且该实例与Kubernetes集群处于同一地域。具体操作,请参见创建和管理CLB实例。
- CCM需要v2.0.1及以上版本。
背景信息
CCM提供Kubernetes与阿里云基础产品的对接能力,例如CLB、VPC等。目前CCM的功能包括管理负载均衡、跨节点通信等。
- 当Service的类型设置为
Type=LoadBalancer
时,CCM会为该Service创建或配置阿里云负载均衡CLB,包括CLB、监听、后端服务器组等资源。 - 当Service对应的后端Endpoint或者集群节点发生变化时,CCM会自动更新CLB的后端虚拟服务器组。
更多信息,请参见Cloud Controller Manager。
场景一:将流量转发至集群内节点和集群外ECS
CCM支持在同一个CLB后端挂载集群内节点和集群外ECS,将流量分别转发至集群内部和外部。

- 使用以下示例服务的YAML内容,创建名为my-nginx-svc.yaml的文件。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} //${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false" //设置为false,CCM不会为CLB管理任何监听配置。 labels: app: nginx name: my-nginx-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: //将selector修改为my-nginx.yaml示例应用文件中matchLabels的值(即:app: nginx),从而将该服务关联至后端应用。 app: nginx type: LoadBalancer
说明- CCM会使用该CLB作为Service的负载均衡,并根据其他注解配置CLB,自动为CLB创建多个虚拟服务器组。
- CCM还提供了许多阿里云注解,支持丰富的负载均衡能力。更多信息,请参见通过Annotation配置负载均衡。
- 执行以下命令创建名为my-nginx-svc服务。
kubectl apply -f my-nginx-svc.yaml
- 登录传统型负载均衡CLB控制台,为CLB实例创建监听并关联CCM自动创建的虚拟服务器组。具体操作,请参见监听概述。重要 CLB的监听端口需要与Service Port一致。
- 登录传统型负载均衡CLB控制台,在CCM自动创建的虚拟服务器组中添加集群外ECS并设置权重。具体操作,请参见创建和管理虚拟服务器组。
配置完成后,在传统型负载均衡CLB控制台的编辑虚拟服务器组页面,既可以看到集群内的节点(图示中①),也可以看到集群外的ECS(图示中②)。集群内应用进行扩缩容时,集群外的ECS节点不受影响。
场景二:支持为集群内部及外部ECS设置权重

注意事项
- 不能跨CLB复用虚拟服务器组。
- 一个虚拟服务器组只能与一个端口关联。
- 集群内节点权重由CCM组件设置,集群外ECS权重需要用户手动设置。
操作步骤
- 登录传统型负载均衡CLB控制台,创建服务器为空的虚拟服务器组,记录虚拟服务器组的分组ID。具体操作,请参见创建和管理虚拟服务器组。
- 为CLB实例创建监听并关联上一步创建的虚拟服务器组,记录实例的ID。具体操作,请参见监听概述。重要 CLB的监听端口需要与Service Port一致。
- 在创建的虚拟服务器组中添加集群外ECS并设置权重。具体操作,请参见创建和管理虚拟服务器组。
- 使用以下示例应用的YAML内容,创建名为service.yaml的文件。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx" //lb-xxxxx替换为您通过负载均衡管理控制台创建的CLB实例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80" //${YOUR_VGROUP_ID}替换为虚拟服务器组ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60" //设置Service流量权重,该参数可选。 name: nginx-svc namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer
- 执行以下命令创建名为service服务。
kubectl apply -f service.yaml
配置完成后,在传统型负载均衡CLB控制台的编辑虚拟服务器组页面,既可以看到集群内的节点(图示中①),也可以看到集群外的ECS(图示中②)。集群内应用进行扩缩容时,集群外的ECS节点不受影响。
场景三:将流量转发至多个Kubernetes集群内
通常企业会采取多种措施以保障应用的高可用性,例如创建多个集群进行备份容灾。这要求业务流量可以通过一个CLB接入多个Kubernetes集群,并且为Kubernetes集群设置不同的权重,示意图如下。

- 不能跨CLB复用虚拟服务器组。
- 一个虚拟服务器组只能与一个端口关联。
- 集群的命名空间+Service的组合名称不能相同。
- 登录传统型负载均衡CLB控制台,创建服务器为空的虚拟服务器组。具体操作,请参见创建和管理虚拟服务器组。
- 登录传统型负载均衡CLB控制台,为CLB实例创建监听并关联上一步创建的虚拟服务器组。具体操作,请参见监听概述。重要 CLB的监听端口需要与Service Port一致。
- 使用以下示例应用的YAML内容,在集群A中创建名为service-a.yaml的文件。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" //${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80" //${YOUR_VGROUP_ID}替换为虚拟服务器组ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "20" //设置Service流量权重,该参数可选。 name: service-a //service-a文件。 namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer
说明 如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port
有多个端口及虚拟服务器组的组合,可以通过英文半角逗号(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。 - 执行以下命令创建名为service-a服务。
kubectl apply -f service-a.yaml
- 使用以下示例应用的YAML内容,在集群B中创建名为service-b.yaml的文件。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" //${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80" //${YOUR_VGROUP_ID}替换为虚拟服务器组ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "80" //设置Service流量权重,该参数可选。 name: service-b //service-b文件。 namespace: default spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer
说明 如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port
有多个端口及虚拟服务器组的组合,可以通过半角逗号(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。 - 执行以下命令创建名为service-b服务。
kubectl apply -f service-b.yaml
配置完成后,在传统型负载均衡CLB控制台的编辑虚拟服务器组页面,既可以看到集群A的节点,也可以看到集群B的节点。集群节点的权重按照注解
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight
自动设置。集群内应用进行扩缩容时,CLB后端虚拟服务器组会自动更新。