文档首页 > > 用户指南> 网络管理> Service> 负载均衡(LoadBalancer)

负载均衡(LoadBalancer)

分享
更新时间:2020/11/18 GMT+08:00

负载均衡( LoadBalancer )可以通过弹性负载均衡公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障,一般用于系统中需要暴露到公网的服务。

负载均衡访问方式由公网弹性负载均衡ELB服务地址以及设置的访问端口组成,例如“10.117.117.117:80”

图1 负载均衡( LoadBalancer )

约束与限制

  • CCE中的负载均衡 ( LoadBalancer )访问类型使用弹性负载均衡 ELB提供网络访问,存在如下产品约束:
    • 自动创建的ELB实例建议不要被其他资源使用,否则会在删除时被占用,导致资源残留。
    • 正在使用的ELB实例请不要修改监听器名称,否则可能导致无法正常访问。
  • 创建service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建service后不要修改服务亲和属性,如需修改请重新创建servcie。
  • 容器内不支持访问externalTrafficPolicy为local的service。

工作负载创建时设置

可以在创建工作负载时通过CCE控制台设置Service访问方式,本节以nginx为例进行说明。

  1. 参考创建无状态负载(Deployment)创建有状态负载(StatefulSet)创建守护进程集(DaemonSet),在“工作负载访问设置”步骤,单击“添加服务”

    • 访问类型:选择“负载均衡 ( LoadBalancer )”
    • Service名称:自定义服务名称,可与工作负载名称保持一致。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。

    负载均衡配置:

    • 负载均衡:请根据业务需求选择“公网”“私网”,具体请参见公网和私网负载均衡器
      • 公网:支持自动创建和使用已有负载均衡实例两种方式。

        如果账号下无共享型负载均衡,请通过新建共享型弹性负载均衡创建,完成后单击刷新按钮。

      • 私网:支持自动创建和使用已有负载均衡实例两种方式。
      负载均衡实例需与当前集群处于相同VPC且为相同公网或私网类型。
      • 企业项目:请选择企业项目名称,选择后可以直接创建在具体的ELB企业项目下。
      • 规格配置:选择“公网 > 自动创建”时显示此配置项,单击“更改配置”可修改负载均衡实例的名称、规格、计费模式和带宽。
      • 分配策略类型:可选择加权轮询算法、加权最少连接或源IP算法。
        • 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
        • 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
        • 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
      • 会话保持:默认不启用,可选择“源IP地址”。负载均衡监听是基于IP地址的会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
      • 健康检查:默认开启。请根据界面提示进行配置,更多参数说明请参见配置健康检查
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口容器镜像中工作负载实际监听端口,需用户确定。nginx程序实际监听的端口为80。
      • 访问端口:容器端口最终映射到负载均衡服务地址的端口,用负载均衡服务地址访问工作负载时使用,端口范围为1-65535,可任意指定。

  2. 完成配置后,直接单击“确定”
  3. 单击“下一步:高级配置”进入高级设置页面,直接单击“创建”
  4. 创建成功后,单击“工作负载 > 无状态负载 Deployment”“工作负载 > 有状态负载 StatefulSet”,在工作负载列表页面,单击“工作负载名称”进入工作负载详情页,在“访问方式”页签下,即可获取方式地址,如图2

    图2 获取负载均衡访问地址

  5. 单击访问地址,即可跳转到访问页面。

工作负载创建完成后设置

您可以在工作负载创建完成后对Service进行配置,此配置对工作负载状态无影响,且实时生效。具体操作如下:

  1. 登录CCE控制台,在左侧导航栏中选择“工作负载 > 无状态负载 Deployment”或“工作负载 > 有状态负载 StatefulSet”,在工作负载列表页单击要设置Service的工作负载名称。
  2. “访问方式”页签,单击“添加Service”。
  3. “添加service”页面,访问类型选择“负载均衡 ( LoadBalancer )”。
  4. 设置负载均衡参数。

    • Service名称:自定义服务名称,可与工作负载名称保持一致。
    • 集群名称:工作负载所在集群的名称,此处不可修改。
    • 命名空间:工作负载所在命名空间,此处不可修改。
    • 关联工作负载:要添加Service的工作负载,此处不可修改。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。

    负载均衡配置:

    • 负载均衡:请根据业务需求选择“公网”“私网”,具体请参见公网和私网负载均衡器
      • 公网:支持自动创建和使用已有负载均衡实例两种方式。

        如果账号下无共享型负载均衡,请通过新建共享型弹性负载均衡创建,完成后单击刷新按钮。

      • 私网:支持自动创建和使用已有负载均衡实例两种方式。
      负载均衡实例需与当前集群处于相同VPC且为相同公网或私网类型。
      • 企业项目:请选择企业项目名称,选择后可以直接创建在具体的ELB企业项目下。
      • 规格配置:选择“公网 > 自动创建”时显示此配置项,单击可修改负载均衡实例的名称、规格、计费模式和带宽。
      • 分配策略类型:可选择加权轮询算法、加权最少连接或源IP算法。
        • 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
        • 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
        • 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
      • 会话保持:默认不启用,可选择“源IP地址”。负载均衡监听是基于IP地址的会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
      • 健康检查:默认开启。请根据界面提示进行配置,部分参数可参考设置容器健康检查
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口:容器镜像中工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
      • 访问端口:容器端口最终映射到负载均衡服务地址的端口,用负载均衡服务地址访问工作负载时使用,端口范围为1-65535,可任意指定。

  5. 单击“创建”。工作负载已添加“负载均衡 ( LoadBalancer )”的服务。

更新Service

您可以在添加完Service后,更新此Service的端口配置。操作如下:

  1. 登录CCE控制台,在左侧导航栏中选择“资源管理 > 网络管理”,在Service页签下,选择对应的集群和命名空间,单击需要更新端口配置的Service的“更新”。
  2. “更新Service”页面,访问类型选择“负载均衡 ( LoadBalancer )”
  3. 更新负载均衡参数:

    • Service名称:您创建的Service名称,此处不可修改。
    • 集群名称:工作负载所在集群的名称,更新时此处不可修改。
    • 命名空间:工作负载所在命名空间,更新时此处不可修改。
    • 关联工作负载:要添加Service的工作负载,更新时此处不可修改。
    • 服务亲和:
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。

    负载均衡配置:

    • 负载均衡:更新时公网/私网在此处不可修改,但可以选择集群所在VPC下的其他负载均衡实例。
      负载均衡实例需与当前集群处于相同VPC且为相同公网或私网类型。
      • 分配策略类型:可选择加权轮询算法、加权最少连接或源IP算法。
        • 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
        • 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
        • 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
      • 会话保持:默认不启用,可选择“源IP地址”。负载均衡监听是基于IP地址的会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
      • 健康检查:默认开启。请根据界面提示进行配置,部分参数请参考设置容器健康检查
    • 端口配置:
      • 协议:请根据业务的协议类型选择。
      • 容器端口:容器镜像中工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。
      • 访问端口:容器端口最终映射到负载均衡服务地址的端口,用负载均衡服务地址访问工作负载时使用,端口范围为1-65535,可任意指定。

  4. 单击“更新”。工作负载已更新Service。

通过kubectl命令行创建

您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现负载均衡 ( LoadBalancer )访问的方法。

前提条件

请参见通过kubectl或web-terminal插件连接CCE集群配置kubectl命令,使弹性云服务器连接集群。

操作步骤

  1. 登录已配置好kubectl命令弹性云服务器。登录方法请参见登录Linux弹性云服务器
  2. 创建并编辑nginx-deployment.yaml以及nginx-elb-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-elb-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            imagePullPolicy: Always
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi nginx-elb-svc.yaml

    若需要开启会话保持,需要满足如下条件:

    • 工作负载协议为TCP。
    • 工作负载的各实例已设置反亲和部署,即所有的实例都部署在不同节点上。具体请参见工作负载和节点的反亲和性
    • 自动创建ELB:
      apiVersion: v1 
      kind: Service 
      metadata: 
        annotations:   
          kubernetes.io/elb.class: union
          kubernetes.io/session-affinity-mode: SOURCE_IP
          kubernetes.io/elb.subnet-id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0
          kubernetes.io/elb.enterpriseID: debb7ae2-6d2f-4e6c-a0aa-1ccafd92b8eb
          kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'
        labels: 
          app: nginx 
        name: nginx 
      spec: 
        externalTrafficPolicy: Local
        ports: 
        - name: service0 
          port: 80
          protocol: TCP 
          targetPort: 80
        selector: 
          app: nginx 
        type: LoadBalancer
    • 使用已有ELB:
      apiVersion: v1 
      kind: Service 
      metadata: 
        annotations:   
          kubernetes.io/elb.class: union
          kubernetes.io/session-affinity-mode: SOURCE_IP
          kubernetes.io/elb.id: 3c7caa5a-a641-4bff-801a-feace27424b6
          kubernetes.io/elb.subnet-id: 5083f225-9bf8-48fa-9c8b-67bd9693c4c0
        labels: 
          app: nginx 
        name: nginx 
      spec: 
        loadBalancerIP: 10.78.42.242
        externalTrafficPolicy: Local
        ports: 
        - name: service0 
          port: 80
          protocol: TCP 
          targetPort: 80
        selector: 
          app: nginx 
        type: LoadBalancer
    表1 关键参数说明

    参数

    参数类型

    描述

    kubernetes.io/elb.class

    String

    可选,请根据不同的应用场景和功能需求选择合适的负载均衡器类型。

    取值如下:

    kubernetes.io/session-affinity-mode

    String

    可选,负载均衡监听是基于IP地址的会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。

    • 不启用:不填写该参数。
    • 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。

    kubernetes.io/elb.session-affinity-option

    表3 Object

    可选,ELB会话保持配置选项,可设置会话保持的超时时间。

    kubernetes.io/elb.id

    String

    为共享型负载均衡实例的ID,取值范围:1-100字符。

    • 在自动创建时:可选。
    • 在关联已有ELB时:必填。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。

    kubernetes.io/elb.subnet-id

    String

    为子网的ID,取值范围:1-100字符。

    • Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填,
    • Kubernetes v1.11.7-r0以上版本的集群:可不填。

    获取方法请参见:VPC子网接口与OpenStack Neutron子网接口的区别是什么?

    kubernetes.io/elb.eip-id

    String

    为弹性公网IP地址的ID,取值范围:1-100字符。

    • 非自动创建elb时:可选。
    • 自动创建elb时:不填。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > 弹性公网IP EIP”,单击EIP的名称,在EIP详情页的“基本信息”中找到“ID”字段复制即可。

    kubernetes.io/elb.enterpriseID

    String

    v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。

    可选,为ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。

    取值范围:1-100字符。

    获取方法:

    在CCE控制台中,单击“资源管理 > 集群管理”,单击集群名称进入集群详情页,在左侧的基本信息中单击企业项目的名称,进入企业项目详情页,找到“ID”字段复制即可。

    kubernetes.io/elb.lb-algorithm

    String

    可选,默认值:“ROUND_ROBIN”,为后端云服务器组的负载均衡算法。

    取值范围:

    • ROUND_ROBIN:加权轮询算法。
    • LEAST_CONNECTIONS:加权最少连接算法。
    • SOURCE_IP:源IP算法。

    当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的weight字段无效。

    kubernetes.io/elb.health-check-flag

    String

    可选,默认开启,为是否开启ELB健康检查功能。

    • 开启:“”(空值)或“on”
    • 关闭:“off”

    kubernetes.io/elb.health-check-option

    表4 Object

    可选,ELB健康检查配置选项。

    kubernetes.io/hws-hostNetwork

    String

    可选,为标记工作负载服务是否使用主机网络模式。

    默认是未使用主机网络,取值范围:“true”或者“false”

    kubernetes.io/elb.autocreate

    elb.autocreate object

    可选,但公网自动创建时必填,将自动创建ELB所绑定的EIP。私网自动创建时必填,将自动创建ELB。

    示例:

    • 公网自动创建:

      值为 '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 私网自动创建:

      值为 '{"type":"inner", "name": "A-location-d-test"}'

    loadBalancerIP

    String

    配置为ELB的IP地址,私网ELB配置私有IP,公网ELB配置为公网IP。

    externalTrafficPolicy

    String

    可选,若需要开启会话保持,需增加该参数,表示请求转到固定节点;若某个服务发布成ELB服务且为Local模式,客户端如果在集群内,那么必须与服务端在同一个节点上才能正常访问。

    port

    Integer

    集群虚拟IP的访问端口,也是注册到负载均衡上的端口。

    targetPort

    String

    对应界面上的容器端口。

    表2 elb.autocreate字段数据结构说明

    参数

    参数类型

    描述

    name

    String

    自动创建的负载均衡的名称。

    取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。

    type

    String

    负载均衡实例网络类型,公网或者私网。

    • public:公网型负载均衡
    • inner:私网型负载均衡

    bandwidth_name

    String

    带宽的名称,默认值为:cce-bandwidth-******。

    取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。

    bandwidth_chargemode

    String

    带宽付费模式。

    • bandwidth:按带宽计费
    • traffic:按流量计费

    bandwidth_size

    Integer

    带宽大小,请根据Region带宽支持范围设置,具体请参见申请弹性公网IP表4 bandwidth字段说明中size字段

    bandwidth_sharetype

    String

    带宽共享方式。

    • PER:独享带宽
    • WHOLE:共享带宽

    eip_type

    String

    弹性公网IP类型,请参考ELB支持的弹性公网IP类型,具体请参见申请弹性公网IP表3 publicip字段说明type字段

    表3 elb.session-affinity-option字段数据结构说明

    参数

    参数类型

    描述

    persistence_timeout

    String

    当elb.session-affinity-mode是“SOURCE_IP”时生效,设置会话保持的超时时间(秒)。

    默认值为:60,取值范围:1-60。

    表4 elb.health-check-option字段数据结构说明

    参数

    参数类型

    描述

    delay

    String

    开始健康检查的初始等待时间(秒),可选

    默认值:5,取值范围:1-50

    timeout

    String

    健康检查的超时时间(秒),可选

    默认值:10,取值范围1-50

    max_retries

    String

    健康检查的最大重试次数,可选

    默认值:3,取值范围1-10

    protocol

    String

    健康检查的协议,可选

    默认值:取关联服务的协议

    取值范围:“TCP”、“UDP_CONNECT”或者“HTTP”

    path

    String

    健康检查的URL,协议是“HTTP”时配置,可选

    默认值:“/”

    取值范围:1-10000字符

  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已开始创建。

    deployment "nginx" created

    kubectl get po

    回显如下,工作负载状态为Running状态,表示工作负载已运行中。

    NAME                     READY     STATUS             RESTARTS   AGE
    etcd-0                   0/1       ImagePullBackOff   0          1h
    icagent-m9dkt            0/0       Running            0          3d
    nginx-2601814895-c1xhw   1/1       Running            0          6s

  4. 创建服务。

    kubectl create -f nginx-elb-svc.yaml

    回显如下,表示服务已创建。

    service "nginx" created

    kubectl get svc

    回显如下,表示工作负载访问方式已设置成功,工作负载可访问。

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    etcd-svc     ClusterIP      None             <none>        3120/TCP       1h
    kubernetes   ClusterIP      10.247.0.1       <none>        443/TCP        3d
    nginx        LoadBalancer   10.247.130.196   10.78.42.242   80:31540/TCP   51s

  5. 在浏览器中输入访问地址,例如输入10.78.42.242:80。10.78.42.242为负载均衡实例IP地址,80为对应界面上的访问端口。

    可成功访问nginx。

    图3 通过负载均衡访问nginx

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问