配置负载均衡器

负载均衡器是一种将流量分配到容器实例的服务。通过利用负载均衡功能,它可以自动分配计算组件的访问流量,并将其转发到这些组件的容器实例。负载均衡能够提高计算组件的容错能力,扩展这些组件的外部服务能力,并增强应用程序的可用性。

平台管理员可以为平台上的任何集群创建单点或高可用性负载均衡器,并统一管理和分配负载均衡器资源。例如,负载均衡可以分配给项目,确保只有拥有适当项目权限的用户才能使用负载均衡。

请参考下表以获取本节相关概念的解释。

参数描述
负载均衡器一种将网络请求分配到集群中可用节点的软件或硬件设备。平台使用的负载均衡器是一个第七层软件负载均衡器。
VIP虚拟IP地址(Virtual IP Address)是一个不对应于特定计算机或特定网络接口卡的IP地址。当负载均衡器为高可用性类型时,访问地址应为VIP。

目录

前提条件

负载均衡器的高可用性需要一个VIP。请参阅配置VIP

示例 ALB2 自定义资源 (CR)

# test-alb.yaml
apiVersion: crd.alauda.io/v2beta1
kind: ALB2
metadata:
  name: alb-demo
  namespace: cpaas-system
  annotations:
    cpaas.io/display-name: ""
spec:
  address: 192.168.66.215
  config:
    vip:
      enableLbSvc: false
      lbSvcAnnotations: {}
    networkMode: host
    enablePortProject: false
    nodeSelector:
      cpu-model.node.kubevirt.io/Nehalem: "true"
    projects:
      - ALL_ALL
    replicas: 1
    resources:
      limits:
        cpu: 200m
        memory: 256Mi
      requests:
        cpu: 200m
        memory: 256Mi
  type: nginx
  1. enableLbSvc 为 true 时,将为负载均衡器的访问地址创建一种内部 LoadBalancer 类型服务。 lbSvcAnnotations 配置参考 LoadBalancer 类型服务注解。
  2. 请查看下面的网络模式配置。
  3. 请查看下面的资源分配方法。
  4. 请查看下面的分配项目。
  5. 请查看下面的规格。

通过 Web 控制台创建负载均衡器

  1. 导航到 平台管理

  2. 在左侧边栏中,单击 网络管理 > 负载均衡器

  3. 单击 创建负载均衡器

  4. 按照下列说明完成网络配置。

    参数描述
    网络模式
    • 主机网络模式:仅允许在单个节点上部署一个负载均衡器副本,多个服务共享一个 ALB,从而实现更优越的网络性能。
    • 容器网络模式:可以在单个节点上部署多个负载均衡器副本,以满足每个服务使用独立 ALB 的需求,网络性能稍低。
    服务和注解(Alpha)
    • 服务:启用时,将为负载均衡器的访问地址创建一种内部 LoadBalancer 类型服务。在使用之前,请确保当前集群支持 LoadBalancer 类型服务。您可以实现平台内置的 LoadBalancer 类型服务;当禁用时,您需要为负载均衡器配置一个外部地址池
    • 注解:用于声明内部 LoadBalancer 类型路由的配置或功能;有关具体内容,请参见内部 LoadBalancer 类型路由的注解
    访问地址负载均衡的访问地址,即负载均衡器实例的服务地址。负载均衡器创建成功后,可以通过此地址访问。
    • 在主机网络模式下,请根据实际情况填写;可以是域名或 IP 地址(内部 IP、外部 IP、VIP)。
    • 在容器网络模式下,将自动获取。
  5. 按照下列说明完成资源配置。

    参数描述
    规格请根据业务需求合理设置规格。您也可以参考如何合理分配 CPU 和内存资源进行参考。
    部署类型
    • 单点:负载均衡器的容器组部署在单个节点上,如果机器发生故障,可能面临负载均衡器不可用的风险。
    • 高可用性:负载均衡器的多个容器组分布在相应数量的节点上,通常为 3。这满足了大量业务流量的负载均衡需求,同时提供应急灾难恢复能力。
    副本数量副本数量为负载均衡器的容器组数量。
    提示:为确保负载均衡器的高可用性,建议副本数量不少于 3。
    节点标签使用标签过滤节点以部署负载均衡器。
    提示
    • 建议满足要求的节点数量大于负载均衡器副本的数量。
    • 具有相同键的标签只能选择一个(如果选择多个,将没有匹配的主机可用)。
    资源分配方式
    • 实例:可以为项目使用负载均衡器实例监听的范围在 1-65535 之间的任意端口。
    • 端口(Alpha):仅可以为项目使用指定范围内的端口。此方法在端口资源有限时,允许进行更细粒度的资源控制。
    分配项目
    • 资源分配方式 设置为 实例 时,负载均衡器可以分配给当前集群关联的所有项目或指定项目。在被分配的项目中,所有 Pods 在所有命名空间下都可以接收由负载均衡器分配的请求。
      • 所有项目:将负载均衡器分配给当前集群的所有项目使用。
      • 指定项目(Alpha):单击 指定项目 下的下拉框,然后单击项目名称左侧的复选框以选择一个或多个项目,将负载均衡器分配给这些指定项目。
        提示:您可以通过在下拉框中输入项目名称来过滤项目。
      • 不分配(Alpha):暂时不分配任何项目。负载均衡器创建后,您可以使用 更新项目 操作来更新创建的负载均衡器的分配项目参数。
    • 资源分配方式 设置为 端口 时,此项无需配置。请在创建负载均衡器后手动分配端口信息。
  6. 单击 创建。创建过程将需要一些时间,请耐心等待。

通过 CLI 创建负载均衡器

kubectl apply -f test-alb.yaml -n cpaas-system

通过 Web 控制台更新负载均衡器

NOTE

更新负载均衡器将导致 3 到 5 分钟的服务中断。请在适当的时间进行此操作!

  1. 进入 平台管理

  2. 在左侧导航栏中,单击 网络管理 > 负载均衡器

  3. 单击 ⋮ > 更新

  4. 根据需要更新网络和资源配置。

    • 请根据业务需求合理设置规格。您也可以参考相关的如何合理分配 CPU 和内存资源进行指导。

    • 内部路由 仅支持从 禁用 状态更新到 启用 状态。

  5. 单击 更新

通过 Web 控制台删除负载均衡器

NOTE

删除负载均衡器后,相关的端口和规则也将被删除,无法恢复。

  1. 进入 平台管理

  2. 在左侧导航栏中,单击 网络管理 > 负载均衡器

  3. 单击 ⋮ > 删除,并确认。

通过 CLI 删除负载均衡器

kubectl delete alb2 test-alb -n cpaas-system

配置监听端口(前端)

负载均衡器支持通过监听端口和相应协议接收客户端连接请求,包括 HTTPS、HTTP、gRPC、TCP 和 UDP。

前提条件

如果需要添加 HTTPS 监听端口,您还应联系管理员为当前项目分配 TLS 证书以进行加密。

示例前端自定义资源 (CR)

# alb-frontend-demo.yaml
apiVersion: crd.alauda.io/v1
kind: Frontend
metadata:
  labels:
    alb2.cpaas.io/name: alb-demo
  name: alb-demo-00080
  namespace: cpaas-system
spec:
  backendProtocol: "http"
  certificate_name: ""
  port: 80
  protocol: http
  serviceGroup:
    services:
      - name: hello-world
        namespace: default
        port: 80
        weight: 100
  1. 必需,指示此 Frontend 所属的 ALB 实例。
  2. 格式为 $alb_name-$port
  3. 格式为 $secret_ns/$secret_name
  4. Frontend 本身的协议。
    • http|https|grpc|grpcs 用于 l7 代理。
    • tcp|udp 用于 l4 代理。
  5. 对于 l4 代理,serviceGroup 是必需的。对于 l7 代理,serviceGroup 是可选的。当请求到达时,ALB 将首先尝试将其与此 Frontend 关联的规则进行匹配。只有当请求不匹配任何规则时,ALB 才会将其转发到 Frontend 配置中指定的默认 serviceGroup
  6. weight 配置适用于轮询和加权轮询调度算法。
NOTE

ALB 监听入口并自动创建 Frontend 或规则。source 字段定义如下:

  1. spec.source.type 当前仅支持 ingress
  2. spec.source.name 是入口名称。
  3. spec.source.namespace 是入口命名空间。

通过 Web 控制台创建监听端口(前端)

  1. 进入 容器平台

  2. 在左侧导航栏中,单击 网络 > 负载均衡

  3. 单击负载均衡器的名称以进入详细信息页面。

  4. 单击 添加监听端口

  5. 根据以下说明配置相关参数。

    参数描述
    协议支持的协议包括 HTTPS、HTTP、gRPC、TCP 和 UDP。选择 HTTPS 时,必须添加证书;对于 gRPC 协议,添加证书是可选的。

    注意
    • 选择 gRPC 协议时,后端协议默认为 gRPC,不支持会话保持。
    • 如果为 gRPC 协议设置了证书,负载均衡器将卸载 gRPC 证书并将未加密的 gRPC 流量转发到后端服务。
    • 如果使用 Google GKE 集群,则同一 容器网络类型 的负载均衡器不能同时具有 TCP 和 UDP 监听协议。
    内部路由组- 当负载均衡算法设置为 轮询(RR) 时,流量将按内部路由组的顺序分配到内部路由端口。
    - 当负载均衡算法设置为 加权轮询(WRR) 时,权重值较高的内部路由被选中的概率更高;流量将根据配置的 weight 分配到内部路由端口。
    提示:概率计算为当前权重值与所有权重值之和的比率。
    会话保持始终将特定请求转发到与上述内部路由组对应的后端服务。

    特定请求包括(选择一个):
    • 源地址哈希:来自同一 IP 地址的所有请求。
      注意:在公有云环境中,源地址通常会发生变化,这可能导致来自同一客户端的请求在不同时间具有不同的源 IP 地址,从而导致源地址哈希技术未能达到预期效果。
    • Cookie 键:携带指定 Cookie 的请求。
    • 头名称:携带指定头的请求。
    后端协议用于将流量转发到后端服务的协议。例如,如果转发到后端 Kubernetes 或 dex 服务,则必须选择 HTTPS 协议。
  6. 单击 确定

通过 CLI 创建监听端口(前端)

kubectl apply -f alb-frontend-demo.yaml -n cpaas-system

后续操作

对于来自 HTTP、gRPC 和 HTTPS 端口的流量,除了默认的内部路由组外,您可以设置更多不同的后端服务匹配规则。负载均衡器将根据设置的规则初步匹配相应的后端服务;如果规则匹配失败,则将匹配与上述内部路由组对应的后端服务。

相关操作

您可以单击列表页面右侧的 ⋮ 图标或单击详细信息页面右上角的 操作 来根据需要更新默认路由或删除监听端口。

NOTE

如果负载均衡器的资源分配方式为 端口,则只有管理员可以在 平台管理 视图中删除相关监听端口。

配置规则

为 HTTPS、HTTP 和 gRPC 协议的监听端口添加转发规则。负载均衡器将根据这些规则匹配后端服务。

NOTE

TCP 和 UDP 协议无法添加转发规则。

示例规则自定义资源 (CR)

# alb-rule-demo.yaml
apiVersion: crd.alauda.io/v1
kind: Rule
metadata:
  labels:
    alb2.cpaas.io/frontend: alb-demo-00080
    alb2.cpaas.io/name: alb-demo
  name: alb-demo-00080-test
  namespace: cpaas-system
spec:
  backendProtocol: ""
  certificate_name: ""
  dslx:
    - type: METHOD
      values:
        - - EQ
          - POST
    - type: URL
      values:
        - - STARTS_WITH
          - /app-a
        - - STARTS_WITH
          - /app-b
    - type: PARAM
      key: group
      values:
        - - EQ
          - vip
    - type: HOST
      values:
        - - ENDS_WITH
          - .app.com
    - type: HEADER
      key: LOCATION
      values:
        - - IN
          - east-1
          - east-2
    - type: COOKIE
      key: uid
      values:
        - - EXIST
    - type: SRC_IP
      values:
        - - RANGE
          - "1.1.1.1"
          - "1.1.1.100"
  enableCORS: false
  priority: 4
  serviceGroup:
    services:
      - name: hello-world
        namespace: default
        port: 80
        weight: 100
  1. 必需,指示此规则所属的 Frontend
  2. 必需,指示此规则所属的 ALB。
  3. Frontend 相同。
  4. Frontend 相同。
  5. 数字越小,优先级越高。
  6. Frontend 相同。

dslx

dslx 是一种领域特定语言,用于描述匹配标准。

例如,以下规则匹配满足以下所有条件的请求:

  • URL 以 /app-a 或 /app-b 开头
  • 方法为 POST
  • URL 参数的 group 为 vip
  • 主机为 *.app.com
  • 头的 location 为 east-1 或 east-2
  • 存在名为 uid 的 Cookie
  • 源 IP 来自 1.1.1.1-1.1.1.100
dslx:
  - type: METHOD
    values:
      - - EQ
        - POST
  - type: URL
    values:
      - - STARTS_WITH
        - /app-a
      - - STARTS_WITH
        - /app-b
  - type: PARAM
    key: group
    values:
      - - EQ
        - vip
  - type: HOST
    values:
      - - ENDS_WITH
        - .app.com
  - type: HEADER
    key: LOCATION
    values:
      - - IN
        - east-1
        - east-2
  - type: COOKIE
    key: uid
    values:
      - - EXIST
  - type: SRC_IP
    values:
      - - RANGE
        - "1.1.1.1"
        - "1.1.1.100"

通过 Web 控制台创建规则

  1. 进入 容器平台

  2. 单击左侧导航栏中的 网络 > 负载均衡

  3. 单击负载均衡器的名称。

  4. 单击监听端口的名称。

  5. 单击 添加规则

  6. 根据以下描述配置相关参数。

    参数描述
    内部路由组- 当负载均衡算法选择 轮询(RR) 时,访问流量将按内部路由组的顺序分配到内部路由端口。
    - 当负载均衡算法选择 加权轮询(WRR) 时,内部路由的权重值越高,被轮询的概率越高,访问流量将根据根据配置的 weight 计算的概率分配到内部路由端口。
    提示:概率的计算方法为当前权重值与所有权重值之和的比率。
    规则指负载均衡器匹配后端服务的标准,包括规则指标及其值。不同规则指标之间的关系为“与”。
    • 域名:支持添加 泛域名精确域名。在同一规则优先级相等的情况下,如果同时存在泛域名和精确域名规则配置,则精确域名转发规则优先生效。
    • URL:RegEx 对应以 / 开头的 URL 正则表达式;StartsWith 对应以 / 开头的 URL 前缀。
    • IP:Equal 对应特定 IP 地址;Range 对应 IP 地址范围。
    • 头:除了输入头的键外,还必须设置匹配规则。Equal 对应头的特定值;Range 对应头值的范围;RegEx 对应头的正则表达式。
    • Cookie:除了输入 Cookie 的键外,还必须设置匹配规则。Equal 对应 Cookie 的特定值。
    • URL 参数:在匹配规则中,Equal 对应特定 URL 参数;Range 对应 URL 参数范围。
    • 服务名称:服务名称指使用 gRPC 协议的服务的名称。使用 gRPC 协议时,可以配置此项,使流量根据提供的服务名称转发到相应的服务,例如:/helloworld.Greeter
    会话保持始终将特定访问请求转发到与上述内部路由组对应的后端服务。
    特定访问请求指(选择一个):
    • 源地址哈希:所有来自同一 IP 地址的访问请求。
    • Cookie 键:携带指定 Cookie 的访问请求。
    • 头名称:携带指定头的访问请求。
    URL 重写将访问地址重写为平台后端服务的地址。此功能要求配置 URL 的 StartsWith 规则指标,并且重写地址(rewrite-target)必须以 / 开头。

    例如:设置域名为 bar.example.com,URL 的起始路径为 /,启用 URL 重写 功能并将重写地址设置为 */test*。访问 bar.example.com 将重写 URL 为 bar.example.com/test
    后端协议用于将访问流量转发到后端服务的协议。例如:如果转发到后端的 Kubernetes 或 dex 服务,则选择 HTTPS 协议。
    重定向将访问流量转发到新的重定向地址,而不是与内部路由组对应的后端服务。
    例如:当原访问地址的页面升级或更新时,为了避免用户收到 404 或 503 错误页面,可以通过配置将流量重定向到新地址。
    • HTTP 状态码:在重定向到新地址之前,浏览器向用户呈现的状态码。
    • 重定向地址:当输入相对地址(例如,/index.html)时,转发流量的目的地将是 负载均衡器地址/index.html;当输入绝对地址(例如,[https://www.example.com](https://www.example.com))时,转发流量的目的地将是输入的地址。
    规则优先级规则匹配的优先级:共有 10 个级别,从 1 到 10,1 为最高优先级,默认优先级为 5。
    当同时满足两个或多个规则时,选择优先级更高的规则进行应用;如果优先级相同,系统使用默认匹配规则。
    跨域资源共享 (CORS)CORS(跨域资源共享)是一种机制,利用额外的 HTTP 头部指示浏览器允许在一个源(域)上运行的 Web 应用程序访问来自不同源服务器的指定资源。当资源请求另一个资源,该资源来自与其自身不同的域、协议或端口的服务器时,它会发起跨域 HTTP 请求。
    允许的来源用于指定允许访问的来源。
    • *:允许来自任何来源的请求。
    • 域名:允许来自当前域的请求。
    允许的头部用于指定 CORS(跨域资源共享)中允许的 HTTP 请求头,以避免不必要的预检请求并提高请求效率。示例条目如下:

    注意:其他常用或自定义请求头不会逐一列出;请根据实际情况填写。

    • Origin:表示请求的来源,即发送请求的域。
    • Authorization:用于指定请求的授权信息,通常用于身份验证,例如基本身份验证或令牌。
    • Content-Type:用于指定请求/响应的内容类型,例如 application/json、application/x-www-form-urlencoded 等。
    • Accept:用于指定客户端可以接受的内容类型,通常在客户端希望接收特定类型的响应时使用。

  7. 单击 添加

通过 CLI 创建规则

kubectl apply -f alb-rule-demo.yaml -n cpaas-system

日志和监控

通过结合可视化日志和监控数据,可以快速识别和解决负载均衡器的问题或故障。

查看日志

  1. 进入 平台管理

  2. 在左侧导航栏中,单击 网络管理 > 负载均衡器

  3. 单击 负载均衡器名称

  4. 日志 选项卡中,从容器的角度查看负载均衡器运行时的日志。

监控指标

NOTE

负载均衡器所在的集群必须部署监控服务。

  1. 进入 平台管理

  2. 在左侧导航栏中,单击 网络管理 > 负载均衡器

  3. 单击 负载均衡器名称

  4. 监控 选项卡中,从节点的角度查看负载均衡器的指标趋势信息。

    • 使用率:负载均衡器在当前节点上 CPU 和内存的实时使用情况。

    • 吞吐量:负载均衡器实例的整体进出流量。

其他资源