配置负载均衡器

负载均衡器是一种将流量分发到容器实例的服务。借助负载均衡功能,它会自动为计算组件分配访问流量,并将其转发到这些组件的容器实例。负载均衡可以提升计算组件的故障容忍能力,扩展这些组件对外提供服务的能力,并增强应用的可用性。

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

有关本节相关概念的说明,请参见下表。

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

前提条件

Load Balancer 的高可用需要 VIP。请参见 Configure 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. 进入 Platform Management

  2. 在左侧边栏中,单击 Network Management > Load Balancer

  3. 单击 Create Load Balancer

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

    ParameterDescription
    Network Mode
    • Host Network Mode:单个节点上只允许部署一个负载均衡器副本,多个服务共享一个 ALB,网络性能更优。
    • Container Network Mode:单个节点上可以部署多个负载均衡器副本,以满足每个服务需要独立 ALB 的场景,但网络性能略低。
    Service and Annotations (Alpha)
    • Service:启用后,会为负载均衡器的访问地址创建一个内部 LoadBalancer 类型的服务。使用前,请确保当前集群支持 LoadBalancer 类型服务。您可以实现平台内置的 LoadBalancer 类型服务;禁用后,需要为负载均衡器配置 External Address Pool
    • Annotations:用于声明内部 LoadBalancer 类型路由的配置或能力,具体请参见 Annotations for Internal LoadBalancer Type Routing
    Access Address负载均衡的访问地址,即负载均衡器实例的服务地址。负载均衡器创建成功后,可通过该地址进行访问。
    • 在 Host Network Mode 下,请根据实际情况填写,可以是域名或 IP 地址(内部 IP、外部 IP、VIP)。
    • 在 Container Network Mode 下,将自动获取。
  5. 按照以下说明完成资源配置。

    ParameterDescription
    Specification请根据业务需求合理设置规格。也可以参考 How to properly allocate CPU and memory resources
    Deployment Type
    • Single Point:负载均衡器的容器组部署在单个节点上,如果发生机器故障,可能会导致负载均衡器不可用。
    • High Availability:负载均衡器的多个容器组部署在相应数量的节点上,通常为 3 个。这既能满足大业务量的负载均衡需求,又能提供应急灾难恢复能力。
    Replicas副本数即负载均衡器的容器组数量。
    提示:为确保负载均衡器高可用,建议副本数不少于 3。
    Node Labels使用标签筛选节点来部署负载均衡器。
    提示
    • 建议满足条件的节点数量大于负载均衡器副本数。
    • 相同键的标签只能选择一个(如果选择多个,将不会有可匹配的主机)。
    Resource Allocation Method
    • Instance:负载均衡器实例可监听范围为 1-65535 内的任意端口,供项目使用。
    • Port (Alpha):仅可将指定范围内的端口分配给项目使用。该方式适用于端口资源有限时进行更细粒度的资源控制。
    Assigned Project
    • Resource Allocation Method 设置为 Instance 时,可以将负载均衡器分配给当前集群关联的所有项目,或分配给指定项目。在已分配的项目中,所有命名空间中的所有 Pod 都可以接收负载均衡器分发的请求。
      • All Projects:将负载均衡器分配给当前集群关联的所有项目使用。
      • Specified Projects (Alpha):单击 Specified Projects 下方的下拉框,并单击项目名称左侧的复选框,选择一个或多个项目,将负载均衡器分配给这些指定项目使用。
        提示:可以在下拉框中输入项目名称来筛选项目。
      • No Allocation (Alpha):暂时不分配任何项目。负载均衡器创建后,可以使用 Update Project 操作更新已创建负载均衡器的分配项目参数。
    • Resource Allocation Method 设置为 Port 时,无需配置此项。请在创建负载均衡器后手动分配端口信息。
  6. 单击 Create。创建过程需要一些时间,请耐心等待。

通过 CLI 创建负载均衡器

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

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

NOTE

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

  1. 进入 Platform Management

  2. 在左侧导航栏中,单击 Network Management > Load Balancer

  3. 单击 ⋮ > Update

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

  5. 单击 Update

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

NOTE

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

  1. 进入 Platform Management

  2. 在左侧导航栏中,单击 Network Management > Load Balancer

  3. 单击 ⋮ > Delete,并确认。

通过 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 用于 l7 proxy。
    • tcp|udp 用于 l4 proxy。
  5. 对于 l4 proxy,serviceGroup 为必填。对于 l7 proxy,serviceGroup 为可选。当请求到达时,ALB 会先尝试将其与该 Frontend 关联的规则进行匹配。只有当请求未匹配任何规则时,ALB 才会将其转发到 Frontend 配置中指定的默认 serviceGroup
  6. weight 配置适用于 Round Robin 和 Weighted Round Robin 调度算法。
NOTE

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

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

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

  1. 进入 Container Platform

  2. 在左侧导航栏中,单击 Network > Load Balancing

  3. 单击负载均衡器名称,进入详情页。

  4. 单击 Add Listener Port

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

    ParameterDescription
    Protocol支持的协议包括 HTTPS、HTTP、gRPC、TCP 和 UDP。选择 HTTPS 时,必须添加证书;选择 gRPC 协议时,证书为可选。

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

    特定请求包括(任选其一):
    • Source Address Hash:来自同一 IP 地址的所有请求。
      注意:在公有云环境中,源地址通常会变化,这可能导致来自同一客户端的请求在不同时刻具有不同的源 IP 地址,从而使 Source Address Hash 技术无法达到预期效果。
    • Cookie key:携带指定 cookie 的请求。
    • Header name:携带指定 header 的请求。
    Backend Protocol用于将流量转发到后端服务的协议。例如,如果转发到后端的 Kubernetes 或 dex 服务,则必须选择 HTTPS 协议。
  6. 单击 OK

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

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

后续操作

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

相关操作

您可以单击列表页右侧的 ⋮ 图标,或在详情页右上角单击 Actions,按需更新默认路由或删除监听端口。

NOTE

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

配置规则

为 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 开头
  • method 为 post
  • URL 参数 group 为 vip
  • host 为 *.app.com
  • header 的 location 为 east-1 或 east-2
  • cookie 名称为 uid
  • 源 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. 进入 Container Platform

  2. 在左侧导航栏中,单击 Network > Load Balancing

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

  4. 单击监听端口名称。

  5. 单击 Add Rule

  6. 参考以下说明配置相关参数。

    ParameterDescription
    Internal Route Group- 当负载均衡算法选择 Round Robin (RR) 时,访问流量将按照内部路由组的顺序分发到内部路由端口。
    - 当负载均衡算法选择 Weighted Round Robin (WRR) 时,内部路由的权重值越高,被轮询到的概率越高,访问流量将按照基于配置 weight 计算出的概率分发到内部路由端口。
    提示:概率的计算方式为当前权重值与所有权重值之和的比值。
    Rule指负载均衡器匹配后端服务的条件,包括规则指标及其值。不同规则指标之间的关系为“与”。
    • 域名:支持添加 通配符域名精确域名。当同一规则的优先级相同时,如果同时存在通配符和精确域名规则配置,则会优先生效精确域名转发规则。
    • URL:RegEx 对应以 / 开头的 URL 正则表达式;StartsWith 对应以 / 开头的 URL 前缀。
    • IP:Equal 对应特定 IP 地址;Range 对应 IP 地址范围。
    • Header:除需输入 header 的 key 外,还必须设置匹配规则。Equal 对应 header 的具体值;Range 对应 header 值范围;RegEx 对应 header 的正则表达式。
    • Cookie:除需输入 cookie 的 key 外,还必须设置匹配规则。Equal 对应 cookie 的具体值。
    • URL Param:在匹配规则中,Equal 对应特定 URL 参数;Range 对应 URL 参数范围。
    • Service Name:Service Name 指使用 gRPC 协议的服务名称。使用 gRPC 协议时,可以配置此项,使流量能够根据提供的 Service Name 转发到对应服务,例如:/helloworld.Greeter
    Session Persistence始终将特定访问请求转发到上述内部路由组对应的后端服务。
    特定访问请求指(任选其一):
    • Source Address Hash:来自同一 IP 地址的所有访问请求。
    • Cookie Key:携带指定 cookie 的访问请求。
    • Header Name:携带指定 header 的访问请求。
    URL Rewrite将访问地址重写为平台后端服务的地址。该功能需要配置 URL 的 StartsWith 规则指标,且重写地址(rewrite-target)必须以 / 开头。

    例如:将域名设置为 bar.example.com,并将 URL 的起始路径设置为 /,启用 URL Rewrite 功能并将重写地址设置为 /test。访问 bar.example.com 时,URL 会被重写为 bar.example.com/test
    Backend Protocol用于将访问流量转发到后端服务的协议。例如:如果转发到后端的 Kubernetes 或 dex 服务,则应选择 HTTPS 协议。
    Redirection将访问流量转发到新的重定向地址,而不是转发到内部路由组对应的后端服务。
    例如:当原访问地址对应的页面升级或更新时,为避免用户收到 404 或 503 错误页面,可以通过配置将流量重定向到新地址。
    • HTTP Status Code:跳转到新地址之前,浏览器向用户展示的状态码。
    • Redirect Address:输入相对地址(例如 /index.html)时,转发流量的目标将是 负载均衡器地址/index.html;输入绝对地址(例如 https://www.example.com)时,转发流量的目标将是所输入的地址。
    Rule Priority规则匹配优先级:共有 1 到 10 共 10 个等级,1 为最高优先级,默认优先级为 5。
    当两个或更多规则同时满足时,选择并应用优先级更高的规则;如果优先级相同,则系统使用默认匹配规则。
    Cross-Origin Resource Sharing (CORS)CORS(Cross-origin resource sharing,跨域资源共享)是一种机制,它利用额外的 HTTP header,告诉浏览器运行在某一源(域)上的 Web 应用被允许访问来自不同源服务器的指定资源。当一个资源请求另一个与自身域名、协议或端口不同的服务器上的资源时,就会发起跨域 HTTP 请求。
    Allowed Origins用于指定允许访问的源。
    • *:允许来自任意源的请求。
    • Domain Name:允许来自当前域名的请求。
    Allowed Headers用于指定 CORS(Cross-Origin Resource Sharing)中允许的 HTTP 请求头,以避免不必要的预检请求并提升请求效率。示例如下:

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

    • Origin:表示请求的源,即发起请求的域名。
    • Authorization:用于指定请求的认证信息,通常用于身份识别,例如 Basic Authentication 或 Token。
    • Content-Type:用于指定请求/响应的内容类型,例如 application/json、application/x-www-form-urlencoded 等。
    • Accept:用于指定客户端可接受的内容类型,通常用于客户端希望接收特定类型响应的场景。

  7. 单击 Add

通过 CLI 创建规则

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

日志与监控

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

查看日志

  1. 进入 Platform Management

  2. 在左侧导航栏中,单击 Network Management > Load Balancer

  3. 单击 Load Balancer Name

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

监控指标

NOTE

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

  1. 进入 Platform Management

  2. 在左侧导航栏中,单击 Network Management > Load Balancer

  3. 单击 Load Balancer Name

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

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

    • Throughput:负载均衡器实例的总入站和出站流量。

更多资源