为了提高容灾能力和可靠性,或实现更高级别的安全隔离,跨集群部署服务是一种有效的策略。这种情况下,如果每个后端Service都选择LoadBalancer类型,会因为创建多个负载均衡器实例导致浪费。通过使用CCM(cloud-controller-manager)组件,您可以在已有的负载均衡实例上同时挂载集群内与集群外的端点,使用单一负载均衡实例达成跨集群部署服务的目标,同时还可以为端点设置转发权重。
前提条件
已创建CLB或NLB实例,且该实例与ACK集群处于同一地域。具体操作,请参见创建和管理CLB实例、创建和管理NLB实例。
cloud-controller-manager组件为v2.0.1或更高版本。关于如何升级组件,请参见管理组件。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
场景一:将流量转发至集群的Service和集群外的端点
您可以在负载均衡实例上同时挂载集群内的Service和集群外的端点(例如ECS)。
在传统型负载均衡CLB控制台或网络型负载均衡NLB控制台查看已有负载均衡实例的ID。
创建Service时选择复用已有负载均衡实例。
使用控制台创建
通过容器服务管理控制台创建Service时,服务类型选择负载均衡选项,并选择使用已有SLB,然后在下方选择要使用的已有负载均衡实例,并选中强制覆盖已有监听。
通过kubectl创建
使用kubectl创建Service时,需要在Annotation中填入负载均衡实例的ID。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # ${LB_ID}替换为已有负载均衡实例的ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 设置为true,会自动创建监听与虚拟服务器组。 labels: #... name: #... spec: #...
重要创建Service后,CCM组件会在目标负载均衡实例中自动创建一个虚拟服务器组,以及一个后端为此虚拟服务器组、端口为Service端口的监听。
登录传统型负载均衡CLB控制台或网络型负载均衡NLB控制台。在自动创建的虚拟服务器组中添加集群外的端点。具体操作,请参见创建和管理CLB虚拟服务器组、创建和管理服务器组。
配置完成后,您在虚拟服务器组中既可以看到集群内的Pod,又可以看到集群外的端点,也可以为它们设置转发权重。集群内应用进行扩缩容时,会自动将集群内的端点加入或移出服务器组,集群外的ECS节点不受影响。
场景二:将流量转发至多个ACK集群内的Service
您可以在负载均衡实例上同时挂载多个不同集群内的Service,为它们提供统一的入口。
为了在Service后端的Pod发生变化时能自动更新负载均衡实例的后端转发端点,多个Service复用同一个负载均衡实例时,需要共用相同的监听以及虚拟服务器组。您需要手动为负载均衡实例配置监听和虚拟服务器组,并在所有Service中复用此虚拟服务器组,监听使用的端口需要与Service相同。
不同集群中的Service需要使用统一的端口。
集群的命名空间+Service的组合名称不能相同。
登录传统型负载均衡CLB控制台或网络型负载均衡NLB控制台,为负载均衡实例创建监听与虚拟服务器组。具体操作,请参见CLB监听概述、创建和管理CLB虚拟服务器组、NLB监听概述、创建和管理服务器组。
创建Service时复用已手动创建的虚拟服务器组。
在Service的Annotation中填入负载均衡实例的ID以及虚拟服务器组的ID,即可复用虚拟服务器组。同时可以为Service设置转发权重。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" # ${YOUR_LB_ID}替换为已有负载均衡实例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:{PORT}" # ${YOUR_VGROUP_ID}替换为虚拟服务器组ID,{PORT}替换为Service的端口。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100" # 选填参数。此Service所属的Pod在负载均衡实例后端的转发权重。取值范围1~1000,默认值100。 labels: #... name: #... spec: #...
说明如果
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port
有多个端口及虚拟服务器组的组合,可以通过英文半角逗号(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。配置完成后,登录负载均衡控制台,可以看到虚拟服务器组中有多个来自不同集群的Service的Pod。某个集群内的应用进行扩缩容时,会自动将其所属的Pod加入或移出服务器组,不会影响其他集群的Pod。
重要如果您在Service中使用Annotation配置了转发权重,请勿在控制台再对转发权重进行调整,否则可能导致状态不同步。
相关文档
更多Annotation的配置,请参见通过Annotation配置传统型负载均衡CLB及通过Annotation配置网络型负载均衡NLB。
CCM组件的变更记录,请参见Cloud Controller Manager。