文档首页/ 云容器引擎 CCE/ 用户指南/ 网络/ 服务(Service)/ 负载均衡(LoadBalancer)/ 为负载均衡类型的Service配置跨集群的后端
更新时间:2024-11-01 GMT+08:00
分享

为负载均衡类型的Service配置跨集群的后端

LoadBalancer Service支持为ELB监听器配置跨集群的后端,适用多个场景:

  • 配置不同集群内的容器实例作为同一个ELB监听器后端:在不同集群上创建Service绑定同一个ELB实例,同时指定同一个对外端口,各自Service的后端能够被添加到同一个ELB监听器上。通过同一个ELB实例将流量转发到不同集群上的Pod,且支持配置权重。参见为ELB配置同VPC内不同集群的后端为ELB配置不同VPC间的跨集群后端
    图1 配置不同集群后端示意图
  • 集群的容器实例和ECS虚拟机作为同一个ELB监听器后端:集群创建的Service绑定已有的ELB监听器,将集群的容器实例和ECS虚拟机添加到同一个ELB监听器的后端服务器组,可实现将流量转发到集群容器实例或ECS虚拟机。参见为ELB监听器配置同VPC内的ECS后端
    图2 配置ECS和集群后端示意图

同一个集群中可能存在多个后端服务器,ELB流量根据比例分配到某个集群时,同一个集群中的后端服务器权重值将会均分,请参见图1

同个集群的后端服务器权重设置规则如下:

  • ELB直通Pod场景(即CCE Turbo集群中使用独享型ELB实例的场景):ELB后端服务器是Service关联的目标Pod,此时每个目标Pod权重为集群流量权重/目标Pod总数并向上取整。
  • 非ELB直通Pod场景(CCE Standard集群或CCE Turbo集群使用共享型ELB实例的场景):ELB后端服务器是Service关联的目标Pod所在节点,此时每个节点的权重为 (集群流量权重/目标Pod总数)*该节点上的目标Pod数并向上取整。

约束与限制

  • 仅支持使用已有ELB实例,不支持随Service新建ELB实例。
  • 该功能只支持使用YAML创建,暂不支持在控制台操作。
  • 不同集群的Service对接的是一个监听器,后端服务器组,使用的是先创建Service的配置,因此不同集群部署的监听器,后端服务器组配置跟随第一次创建ELB资源的Service,如健康检查等。
  • 不同集群的Service对接一个监听器时,所有的Service都需要配置跨集群能力。

注意事项

  • 删除跨集群Service时,默认只会删除ELB下本集群的后端云服务器,也可以配置级联删除策略回收ELB所有资源。请注意,配置级联删除策略时,删除Service或删除集群会强制回收监听器及后端服务器组。
  • 创建Service时,请勿使用已被其他协议占用的端口,否则Service无法创建成功。
  • 通过ELB实现跨集群访问时,和ELB对接的所有Service均需要开启跨集群能力,否则可能出现后端服务器组被覆盖清除的问题。
  • 跨集群Service创建完成后,系统会添加kubernetes.io/elb.listener-port注解,请勿自行指定该注解,且不建议自行修改或删除,否则会导致ELB下资源回收失败。

为ELB配置同VPC内不同集群的后端

集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0 、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。

假设集群A和集群B位于同一VPC内,且该VPC内已存在一个ELB。配置同VPC内跨集群访问,集群A的Service接收流量权重设置为80,集群B的Service接收流量权重设置为20。步骤如下:

  1. 在集群A中创建Service。

    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:
        kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance  # ELB类型
        kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
        kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
        kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略,member-only只会清理ELB的后端云服务器,为缺省值;cascade策略则会强制回收ELB下所有资源
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80   # ELB监听器端口
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer
    表1 annotation关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.id

    String

    ELB的ID,仅支持使用已有ELB实例。

    kubernetes.io/elb.class

    String

    ELB类型。取值为union或performance。

    kubernetes.io/elb.multicluster

    String

    取值为true,表示开启Service跨集群访问。

    kubernetes.io/elb.multicluster-loadbalancer-weight

    String

    集群Service接收流量的权重,权重可填0-100,数值越大被分发的流量越多。

    说明:

    删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。

    kubernetes.io/elb.multicluster-resource-recycle-policy

    String

    ELB资源的删除策略,默认为member-only。

    • member-only:只清理ELB的后端云服务器。
    • cascade:强制回收ELB下所有资源。如需强制回收,推荐只在首个Service上配置cascade。

  2. 在集群B中创建Service。

    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:
        kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance  # ELB类型
        kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
        kubernetes.io/elb.multicluster-loadbalancer-weight: '20'  # 集群Service接收流量的权重
        kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略,member-only只会清理ELB的后端云服务器,为缺省值;cascade策略则会强制回收ELB下所有资源
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80   # ELB监听器端口
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer

为ELB配置不同VPC间的跨集群后端

  • 集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0 、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
  • 仅支持已有的独享型ELB实例。
  • 需要在ELB操作界面打开“IP类型后端”开关。详情请参见配置不同VPC的服务器作为后端服务器(IP类型后端)
  • 两个VPC网段不能冲突,需要给两个VPC创建对等连接,配置方法请参见对等连接
  • 与ELB不同VPC的集群,集群node安全组(云原生2.0网络时为eni安全组)入方向需要放通源地址为ELB所在VPC网段。
  • ELB添加跨VPC后端,集群对应的安全组需要放通负载均衡器的后端子网网段、且不支持UDP类型监听器,详情请参见ELB约束限制

假设集群A和集群B位于不同的VPC中,且ELB位于其中一个集群所在的VPC中。配置不同VPC间跨集群访问,步骤如下:

  1. 在集群A中创建Service。

    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:
        kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance  # ELB类型
        kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
        kubernetes.io/elb.multivpc: 'true'
        kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
        kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略,member-only只会清理ELB的后端云服务器,为缺省值;cascade策略则会强制回收ELB下所有资源
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80   # ELB监听器端口
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer
    表2 annotation关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.id

    String

    ELB的ID,仅支持使用已有ELB实例。

    kubernetes.io/elb.class

    String

    ELB类型。只能使用独享型ELB,即取值必须为performance。

    kubernetes.io/elb.multicluster

    String

    取值为true,表示开启Service跨集群访问。

    kubernetes.io/elb.multivpc

    String

    取值为true,表示开启不同VPC间跨集群访问,需要在kubernetes.io/elb.multicluster开关为true的情况下启用。

    kubernetes.io/elb.multicluster-loadbalancer-weight

    String

    集群Service接收流量的权重,权重可填0-100,数值越大被分发的流量越多。

    说明:

    删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。

    kubernetes.io/elb.multicluster-resource-recycle-policy

    String

    ELB资源的删除策略,默认为member-only。

    • member-only:只清理ELB的后端云服务器。
    • cascade:强制回收ELB下所有资源。如需强制回收,推荐只在首个Service上配置cascade。

  2. 在集群B中创建Service。

    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:
        kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance  # ELB类型
        kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
        kubernetes.io/elb.multivpc: 'true'
        kubernetes.io/elb.multicluster-loadbalancer-weight: '20'  # 集群Service接收流量的权重
        kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略,member-only只会清理ELB的后端云服务器,为缺省值;cascade策略则会强制回收ELB下所有资源
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80   # ELB监听器端口
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer

为ELB监听器配置同VPC内的ECS后端

集群版本需满足v1.23.18-r0、v1.25.13-r0、v1.27.10-r0 、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。

集群A和ECS位于同一VPC内,且该VPC内已存在一个ELB。配置同VPC内跨集群的后端,集群A的Service接收流量权重设置为80,并添加2台ECS后端,设置接收流量权重为20。步骤如下:

  1. 在ELB服务创建好监听器(如80端口监听器)及后端服务器组,手动添加ECS后端服务器,并总权重设置为20。操作详情请参见配置同VPC的服务器作为后端服务器

  2. 在集群A中创建Service,对接到已经创建好的80端口监听器,Service权重设置为80。

    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:
        kubernetes.io/elb.id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0   # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance  # ELB类型
        kubernetes.io/elb.multicluster: 'true'  # Service开启跨集群访问
        kubernetes.io/elb.multicluster-loadbalancer-weight: '80'  # 集群Service接收流量的权重
        kubernetes.io/elb.multicluster-resource-recycle-policy: member-only  # ELB资源的删除策略,member-only只会清理ELB的后端云服务器,为缺省值;cascade策略则会强制回收ELB下所有资源
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80   # 对接ELB的80监听器端口
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer
    表3 annotation关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.id

    String

    ELB的ID,仅支持使用已有ELB实例。

    kubernetes.io/elb.class

    String

    ELB类型。取值为union或performance。

    kubernetes.io/elb.multicluster

    String

    取值为true,表示开启Service跨集群访问。

    kubernetes.io/elb.multicluster-loadbalancer-weight

    String

    集群Service接收流量的权重。

    说明:

    删除kubernetes.io/elb.multicluster-loadbalancer-weight不会对已配置的权重进行调整。

    kubernetes.io/elb.multicluster-resource-recycle-policy

    String

    ELB资源的删除策略,默认为member-only。

    • member-only:只清理ELB的后端云服务器。
    • cascade:强制回收ELB下所有资源。如需强制回收,推荐只在首个Service上配置cascade。

  3. 观察ELB后端服务器组中集群容器实例已经添加,且总权重为80。

相关文档