为负载均衡类型的Service配置跨集群的后端
LoadBalancer Service支持为ELB监听器配置跨集群的后端,适用多个场景:
- 配置不同集群内的容器实例作为同一个ELB监听器后端:在不同集群上创建Service绑定同一个ELB实例,同时指定同一个对外端口,各自Service的后端能够被添加到同一个ELB监听器上。通过同一个ELB实例将流量转发到不同集群上的Pod,且支持配置权重。参见为ELB配置同VPC内不同集群的后端和为ELB配置不同VPC间的跨集群后端。
- 集群的容器实例和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。步骤如下:
- 在集群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。
- 在集群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间跨集群访问,步骤如下:
- 在集群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。
- 在集群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。步骤如下:
- 在ELB服务创建好监听器(如80端口监听器)及后端服务器组,手动添加ECS后端服务器,并总权重设置为20。操作详情请参见配置同VPC的服务器作为后端服务器。
- 在集群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。
- 观察ELB后端服务器组中集群容器实例已经添加,且总权重为80。