配置负载均衡器

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

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

本节相关概念说明请参考下表。

参数说明
Load Balancer一种将网络请求分发到集群中可用节点的软件或硬件设备。平台中使用的负载均衡器是七层(Layer 7)软件负载均衡器。
VIP虚拟IP地址(Virtual IP Address),指不对应具体计算机或具体网卡的IP地址。当负载均衡器为高可用类型时,访问地址应为VIP。

目录

前提条件

Load Balancer 的高可用需要 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. 按照以下说明完成网络配置。

    参数说明
    网络模式
    • Host 网络模式:单节点上只允许部署一个负载均衡器副本,多个服务共享一个 ALB,网络性能更优。
    • 容器网络模式:单节点上可部署多个负载均衡器副本,满足每个服务独立 ALB 的需求,网络性能略逊。
    服务及注解(Alpha)
    • 服务:启用时会为负载均衡器访问地址创建一个内部 LoadBalancer 类型服务。使用前请确保当前集群支持 LoadBalancer 类型服务。可实现平台内置的 LoadBalancer 类型服务;禁用时需为负载均衡器配置外部地址池
    • 注解:用于声明内部 LoadBalancer 类型路由的配置或能力,具体请参考内部 LoadBalancer 类型服务注解
    访问地址负载均衡的访问地址,即负载均衡器实例的服务地址。负载均衡器创建成功后,可通过该地址访问。
    • Host 网络模式下,请根据实际情况填写,可为域名或 IP 地址(内网 IP、外网 IP、VIP)。
    • 容器网络模式下,地址会自动获取。
  5. 按照以下说明完成资源配置。

    参数说明
    规格请根据业务需求合理设置规格,也可参考如何合理分配 CPU 和内存资源进行参考。
    部署类型
    • 单点:负载均衡器容器组部署在单个节点,若机器故障可能导致负载均衡器不可用风险。
    • 高可用:负载均衡器多个容器组部署在对应数量的节点上,通常为 3 个,满足大业务量负载均衡需求并具备应急灾备能力。
    副本数副本数即负载均衡器容器组数量。
    提示:为保证负载均衡器高可用,建议副本数不少于 3 个。
    节点标签通过标签筛选节点部署负载均衡器。
    提示
    • 建议满足要求的节点数大于负载均衡器副本数。
    • 同一标签键只能选择一个(若选择多个则无匹配主机)。
    资源分配方式
    • 实例:可为项目提供负载均衡器实例可监听的 1-65535 范围内任意端口。
    • 端口(Alpha):仅能分配指定范围内端口给项目使用,端口资源有限时可实现更细粒度资源控制。
    分配项目
    • 资源分配方式实例时,负载均衡器可分配给当前集群关联的所有项目或指定项目,分配项目中所有命名空间的所有 Pod 均可接收负载均衡器分发的请求。
      • 所有项目:分配负载均衡器供当前集群关联的所有项目使用。
      • 指定项目(Alpha):点击指定项目下拉框,勾选项目名称左侧复选框,选择一个或多个项目,分配负载均衡器供指定项目使用。
        提示:可在下拉框输入项目名称进行筛选。
      • 不分配(Alpha):暂不分配任何项目,负载均衡器创建后可通过更新项目操作更新已创建负载均衡器的分配项目参数。
    • 资源分配方式端口时,无需配置此项,创建负载均衡器后请手动分配端口信息。
  6. 点击 创建,创建过程需要一定时间,请耐心等待。

通过 CLI 创建负载均衡器

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

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

NOTE

更新负载均衡器会导致服务中断 3 到 5 分钟,请选择合适时间进行操作!

  1. 进入 平台管理

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

  3. 点击 ⋮ > 更新

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

  5. 点击 更新

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

NOTE

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

  1. 进入 平台管理

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

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

通过 CLI 删除负载均衡器

kubectl delete alb2 test-alb -n cpaas-system

配置监听端口(Frontend)

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

前提条件

若需添加 HTTPS 监听端口,还应联系管理员为当前项目分配 TLS 证书以实现加密。

Frontend 自定义资源(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 用于七层代理。
    • tcp|udp 用于四层代理。
  5. 四层代理时,serviceGroup 必填;七层代理时,serviceGroup 可选。当请求到达时,ALB 会先尝试匹配与该 Frontend 关联的规则,只有请求未匹配任何规则时,才会转发到 Frontend 配置的默认 serviceGroup
  6. weight 配置适用于轮询和加权轮询调度算法。
NOTE

ALB 监听 ingress 并自动创建 Frontend 或 Rule。source 字段定义如下:

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

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

  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 的请求。
    • Header 名称:携带指定 Header 的请求。
    后端协议用于转发流量至后端服务的协议。例如,转发到后端 Kubernetes 或 dex 服务时需选择 HTTPS 协议。
  6. 点击 确定

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

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

后续操作

对于 HTTP、gRPC 和 HTTPS 端口的流量,除默认内部路由组外,还可设置更多丰富的后端服务匹配规则。负载均衡器会先根据设置的规则匹配对应后端服务,规则匹配失败时再匹配上述内部路由组对应的后端服务。

相关操作

可在列表页右侧点击 ⋮ 图标,或在详情页右上角点击 操作,根据需要更新默认路由或删除监听端口。

NOTE

若负载均衡器资源分配方式为端口,仅管理员可在平台管理视图中删除相关监听端口。

配置规则

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

NOTE

TCP 和 UDP 协议不支持添加转发规则。

Rule 自定义资源(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
  • Host 以 .app.com 结尾
  • Header 中 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 地址范围。
    • Header:除输入 Header 键外,还需设置匹配规则。Equal 对应 Header 具体值;Range 对应 Header 值范围;RegEx 对应 Header 正则表达式。
    • Cookie:除输入 Cookie 键外,还需设置匹配规则。Equal 对应 Cookie 具体值。
    • URL 参数:匹配规则中,Equal 对应具体 URL 参数;Range 对应 URL 参数范围。
    • 服务名:服务名指使用 gRPC 协议的服务名。使用 gRPC 协议时可配置此项,允许根据提供的服务名转发流量,例如 /helloworld.Greeter
    会话保持始终将特定访问请求转发到上述内部路由组对应的后端服务。
    特定访问请求包括(任选其一):
    • 源地址哈希:来自同一 IP 地址的所有访问请求。
    • Cookie 键:携带指定 Cookie 的访问请求。
    • Header 名称:携带指定 Header 的访问请求。
    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)时,转发目标为输入地址。
    规则优先级规则匹配优先级:共 10 级,1 最高,默认优先级为 5。
    当多个规则同时满足时,选择优先级更高的规则应用;若优先级相同,系统使用默认匹配规则。
    跨域资源共享(CORS)CORS(跨域资源共享)是一种机制,利用额外的 HTTP 头部指示浏览器允许运行在一个源(域)上的 Web 应用访问来自不同源服务器的指定资源。当资源请求另一个与自身域、协议或端口不同的服务器资源时,会发起跨域 HTTP 请求。
    允许的源用于指定允许访问的源。
    • *:允许任意源请求。
    • 域名:允许当前域请求。
    允许的头部用于指定 CORS 中允许的 HTTP 请求头,避免不必要的预检请求,提高请求效率。示例条目如下:

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

    • Origin:表示请求来源,即发送请求的域。
    • Authorization:用于指定请求的授权信息,通常用于身份验证,如 Basic Authentication 或 Token。
    • 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 和内存的实时使用情况。

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

其他资源