通过复用已有负载均衡实现跨集群部署服务

为了提高容灾能力和可靠性,或实现更高级别的安全隔离,跨集群部署服务是一种有效的策略。这种情况下,如果每个后端Service都选择LoadBalancer类型,会因为创建多个负载均衡器实例导致浪费。通过使用CCM(cloud-controller-manager)组件,您可以在已有的负载均衡实例上同时挂载集群内与集群外的端点,使用单一负载均衡实例达成跨集群部署服务的目标,同时还可以为端点设置转发权重。

前提条件

场景一:将流量转发至集群的Service和集群外的端点

您可以在负载均衡实例上同时挂载集群内的Service和集群外的端点(例如ECS)。

image
  1. 传统型负载均衡CLB控制台网络型负载均衡NLB控制台查看已有负载均衡实例的ID。

  2. 创建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端口的监听。

  3. 登录传统型负载均衡CLB控制台网络型负载均衡NLB控制台。在自动创建的虚拟服务器组中添加集群外的端点。具体操作,请参见创建和管理CLB虚拟服务器组创建和管理服务器组

    配置完成后,您在虚拟服务器组中既可以看到集群内的Pod,又可以看到集群外的端点,也可以为它们设置转发权重。集群内应用进行扩缩容时,会自动将集群内的端点加入或移出服务器组,集群外的ECS节点不受影响。

场景二:将流量转发至多个ACK集群内的Service

您可以在负载均衡实例上同时挂载多个不同集群内的Service,为它们提供统一的入口。

为了在Service后端的Pod发生变化时能自动更新负载均衡实例的后端转发端点,多个Service复用同一个负载均衡实例时,需要共用相同的监听以及虚拟服务器组。您需要手动为负载均衡实例配置监听和虚拟服务器组,并在所有Service中复用此虚拟服务器组,监听使用的端口需要与Service相同。

image
重要
  • 不同集群中的Service需要使用统一的端口。

  • 集群的命名空间+Service的组合名称不能相同。

  1. 登录传统型负载均衡CLB控制台网络型负载均衡NLB控制台,为负载均衡实例创建监听与虚拟服务器组。具体操作,请参见CLB监听概述创建和管理CLB虚拟服务器组NLB监听概述创建和管理服务器组

  2. 创建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配置了转发权重,请勿在控制台再对转发权重进行调整,否则可能导致状态不同步。

相关文档