配置 ALB

WARNING

ALB 已被废弃。请改用 ingress-nginx-operatorenvoy-gateway

ALB

ALB 是表示负载均衡器的自定义资源。alb-operator 默认嵌入所有集群中,监听 ALB 资源的创建/更新/删除操作,并据此创建相应的 Deployment 和 Service。

对于每个 ALB,会有一个对应的 Deployment 监听所有附加到该 ALB 的 Frontends 和 Rules,并根据这些配置将请求路由到后端。

前提条件

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

配置 ALB

ALB 配置包含三部分。

# test-alb.yaml
apiVersion: crd.alauda.io/v2beta1
kind: ALB2
metadata:
  name: alb-demo
  namespace: cpaas-system
spec:
  address: 192.168.66.215
  config:
    vip:
      enableLbSvc: false
      lbSvcAnnotations: {}
    networkMode: host
    nodeSelector:
      cpu-model.node.kubevirt.io/Nehalem: 'true'
    replicas: 1
    resources:
      alb:
        limits:
          cpu: 200m
          memory: 256Mi
        requests:
          cpu: 200m
          memory: 256Mi
      limits:
        cpu: 200m
        memory: 256Mi
      requests:
        cpu: 200m
        memory: 256Mi
    projects:
      - ALL_ALL
  type: nginx

资源相关配置

资源相关字段描述 alb 的部署配置。

字段类型描述
.spec.config.nodeSelectormap[string]stringalb 的节点选择器
.spec.config.replicasint,可选,默认 3alb 的副本数
.spec.config.resources.limitsk8s 容器资源限制,可选alb 中 nginx 容器的资源限制
.spec.config.resources.requestsk8s 容器资源请求,可选alb 中 nginx 容器的资源请求
.spec.config.resources.alb.limitsk8s 容器资源限制,可选alb 中 alb 容器的资源限制
.spec.config.resources.alb.requestsk8s 容器资源请求,可选alb 中 alb 容器的资源请求
.spec.config.antiAffinityKeystring,可选,默认 localk8s 反亲和性键

网络配置

网络字段描述如何访问 ALB。例如,在 host 模式下,alb 使用 hostnetwork,可以通过节点 IP 访问 ALB。

字段类型描述
.spec.config.networkModestring: hostcontainer,可选,默认 hostcontainer 模式下,operator 会创建 LoadBalancer 类型的 Service,并使用其地址作为 ALB 地址。
.spec.addressstring,必填可以手动指定 alb 的地址
.spec.config.vip.enableLbSvcbool,可选container 模式下自动为 true。
.spec.config.vip.lbSvcAnnotationsmap[string]string,可选LoadBalancer Service 的额外注解

项目配置

字段类型
.spec.config.projects[]string,必填
.spec.config.portProjectsstring,可选
.spec.config.enablePortProjectbool,可选

将 ALB 添加到项目意味着:

  1. 在 Web UI 中,只有该项目内的用户可以查找和配置此 ALB。
  2. 该 ALB 会处理属于该项目的 ingress 资源。请参考 ingress-sync
  3. 在 Web UI 中,项目 X 创建的规则不能在项目 Y 下被查找或配置。

如果启用端口项目并为项目分配端口范围,则意味着:

  1. 不能创建不属于该项目分配端口范围的端口。

调优配置

alb cr 中有一些全局配置可以调优。

ALB 操作

创建

使用 Web 控制台

Web UI 中暴露了一些常用配置。创建负载均衡器的步骤如下:

  1. 进入 Administrator
  2. 左侧边栏点击 网络管理 > 负载均衡器
  3. 点击 创建负载均衡器

Web UI 中的每个输入项对应 CR 的一个字段:

参数描述
Assigned Address.spec.address
Allocated ByInstance 表示项目模式,可选择下方项目;port 表示端口项目模式,创建 alb 后可分配端口范围
使用 CLI
kubectl apply -f test-alb.yaml -n cpaas-system

更新

使用 Web 控制台
NOTE

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

  1. 进入 Administrator

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

  3. 点击 ⋮ > 更新

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

  5. 点击 更新

删除

使用 Web 控制台
NOTE

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

  1. 进入 Administrator

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

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

使用 CLI
kubectl delete alb2 alb-demo -n cpaas-system

Frontend

Frontend 是定义 ALB 监听端口和协议的自定义资源。 支持的协议:L7(http|https|grpc|grpcs)和 L4(tcp|udp)。

  • L4 代理直接用 frontend 配置后端服务。
  • L7 代理用 frontend 配置监听端口,用 rule 配置后端服务。

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

前提条件

先创建 ALB。

配置 Frontend

# 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:
  port: 80
  protocol: http
  certificate_name: ''
  backendProtocol: 'http'
  serviceGroup:
    session_affinity_policy: ''
    services:
      - name: hello-world
        namespace: default
        port: 80
        weight: 100
  1. alb 标签:必填,指明该 Frontend 所属的 ALB 实例。

  2. frontend 名称:格式为 $alb_name-$port

  3. port:监听的端口。

  4. protocol:该端口使用的协议。

    • L7 协议 https|http|grpcs|grpc 和 L4 协议 tcp|udp。
    • 选择 HTTPS 时必须添加证书;gRPC 协议添加证书为可选。
    • 选择 gRPC 协议时,后端协议默认为 gRPC,不支持会话保持。若为 gRPC 协议设置证书,负载均衡器会卸载 gRPC 证书并将未加密的 gRPC 流量转发到后端服务。
    • 使用 Google GKE 集群时,同一 容器网络类型 的负载均衡器不能同时存在 TCP 和 UDP 监听协议。
  5. certificate_name:用于 grpcs 和 https 协议的默认证书,格式为 $secret_ns/$secret_name

  6. backendProtocol:后端服务使用的协议。

  7. 默认 serviceGroup

    • L4 代理:必填。ALB 直接将流量转发到默认服务组。
    • L7 代理:可选。ALB 会先匹配该 Frontend 上的 Rules,若无匹配则回退到默认 serviceGroup
  8. session_affinity_policy

Frontend 操作

创建

使用 Web 控制台

  1. 进入 Container Platform

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

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

  4. 点击 添加端口

Web UI 中的每个输入项对应 CR 的一个字段:

参数描述
Session Affinity.spec.serviceGroup.session_affinity_policy
使用 CLI
kubectl apply -f alb-frontend-demo.yaml -n cpaas-system

后续操作

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

相关操作

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

NOTE

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

Rule

Rule 是定义 ALB 如何匹配和处理请求的自定义资源。

ALB 处理的 ingress 可以被 自动转换为规则

前提条件

下面是一个示例规则,帮助快速了解规则的使用。

NOTE

规则必须通过标签附加到 frontend 和 alb。

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: 'https'
  certificate_name: 'a/b'
  dslx:
    - type: URL
      values:
        - - STARTS_WITH
          - /
  priority: 4
  serviceGroup:
    services:
      - name: hello-world
        namespace: default
        port: 80
        weight: 100
  1. 必填,指明该规则所属的 Frontend
  2. 必填,指明该规则所属的 ALB。
  3. backendProtocol
  4. certificate_name
  5. dslx
  6. 数值越小优先级越高。
  7. serviceGroup

使用 dslx 和优先级匹配请求

dslx

DSLX 是用于描述匹配条件的领域专用语言。 例如,下面的规则匹配满足 全部 以下条件的请求:

  • url 以 /app-a /app-b 开头
  • method 是 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'

优先级

优先级是 0 到 10 的整数,数值越小优先级越高。Ingress 中配置规则优先级可使用如下注解格式:

# alb.cpaas.io/ingress-rule-priority-$rule_index-$path_index
alb.cpaas.io/ingress-rule-priority-0-0: '10'

规则中直接在 .spec.priority 使用整数设置优先级。

动作

请求匹配规则后,可以对请求应用以下动作:

功能描述链接
Timeout配置请求超时设置timeout
Redirect将请求重定向到指定 URLredirect
CORS启用跨域资源共享(CORS)cors
Header Modification允许修改请求或响应头header modification
URL Rewrite转发前重写请求 URLurl-rewrite
WAF集成 Web 应用防火墙(WAF)waf
OTEL启用 OpenTelemetry(OTEL)进行分布式追踪otel
Keepalive启用或禁用应用的 keepalive 功能keepalive

后端

后端协议

默认后端协议为 HTTP。若需使用 TLS 重新加密,可配置为 HTTPS。

服务组和会话保持策略

规则中可配置一个或多个服务。

默认情况下,ALB 使用轮询(RR)算法在后端服务间分发请求。也可为单个服务分配权重,或选择其他负载均衡算法。

详情请参考 负载均衡算法

Rule 操作

使用 Web 控制台

  1. 进入 Container Platform
  2. 左侧导航栏点击 网络 > 负载均衡
  3. 点击负载均衡器名称。
  4. 选择监听端口名称。
  5. 点击 添加规则
  6. 参考下述描述配置相关参数。
  7. 点击 添加

Web UI 中的每个输入项对应 CR 的一个字段。

使用 CLI

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

HTTPS

若 frontend 协议(ft)为 HTTPS 或 GRPCS,规则也可配置为使用 HTTPS。

证书可在规则或 ingress 中指定,用于匹配该端口的证书。

支持终止(termination),若后端协议为 HTTPS 可实现重新加密。但不能为与后端服务通信指定证书。

Ingress 中的证书注解

证书可通过注解跨命名空间引用。

alb.networking.cpaas.io/tls: qq.com=cpaas-system/dex.tls,qq1.com=cpaas-system/dex1.tls

规则中的证书

.spec.certificate_name 格式为 $secret_namespace/$secret_name

TLS 模式

Edge 模式

Edge 模式下,客户端与 ALB 使用 HTTPS 通信,ALB 与后端服务使用 HTTP 协议。 实现方式:

  1. 创建使用 https 协议的 ft
  2. 创建后端协议为 http 的 rule,并通过 .spec.certificate_name 指定证书
重新加密模式

重新加密模式下,客户端与 ALB 使用 HTTPS 通信,ALB 与后端服务使用 HTTPS 协议。 实现方式:

  1. 创建使用 https 协议的 ft
  2. 创建后端协议为 https 的 rule,并通过 .spec.certificate_name 指定证书

Ingress

Ingress 同步

每个 ALB 创建一个同名的 IngressClass,处理同项目内的 ingress。

当 ingress 命名空间带有标签如 cpaas.io/project: demo,表示该 ingress 属于 demo 项目。

ALB 中 .spec.config.projects 配置包含项目名 demo 的,会自动将这些 ingress 转换为规则。

NOTE

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

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

对于未配置证书的 ingress,ALB 提供使用默认证书的策略。

可在 ALB 自定义资源中配置:

  • .spec.config.defaultSSLStrategy:定义未配置证书 ingress 的 SSL 策略
  • .spec.config.defaultSSLCert:设置默认证书,格式为 $secret_ns/$secret_name

可用 SSL 策略:

  • Never:不在 HTTPS 端口创建规则(默认)
  • Always:使用默认证书在 HTTPS 端口创建规则

日志与监控

结合日志和监控数据,可以快速定位和解决负载均衡器问题。

查看日志

  1. 进入 Administrator

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

  3. 点击 负载均衡器名称

  4. 日志 标签页,从容器视角查看负载均衡器运行日志。

监控指标

NOTE

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

  1. 进入 Administrator

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

  3. 点击 负载均衡器名称

  4. 监控 标签页,从节点视角查看负载均衡器的指标趋势信息。

    • 使用率:负载均衡器在当前节点的 CPU 和内存实时使用情况。
    • 吞吐量:负载均衡器实例的整体进出流量。

更多监控指标详情请参考 ALB 监控