配置 ALB 规则

目录

介绍

什么是规则?

规则是一个自定义资源(CR),定义了 ALB 如何匹配和处理传入请求。

由 ALB 处理的 Ingress 可以自动转换为规则

前提条件

安装 alb 和 ft

规则快速演示

下面是一个演示规则,帮助你快速了解如何使用规则。

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将传入请求重定向到指定 URL。redirect
CORS为应用启用跨域资源共享(CORS)。cors
Header Modification允许修改请求或响应头。header modification
URL Rewrite转发前重写传入请求的 URL。url-rewrite
WAF集成 Web 应用防火墙(WAF)以增强安全性。waf
OTEL启用 OpenTelemetry (OTEL) 进行分布式追踪和监控。otel
Keepalive启用或禁用应用的 keepalive 功能。keepalive

后端

后端协议

默认情况下,后端协议设置为 HTTP。如果需要使用 TLS 重新加密,可以配置为 HTTPS。

服务组和会话亲和策略

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

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

详情请参考负载均衡算法

创建规则

使用 Web 控制台

  1. 进入 Container Platform
  2. 点击左侧导航栏的 Network > Load Balancing
  3. 点击负载均衡器名称。
  4. 点击监听端口名称。
  5. 点击 Add Rule
  6. 参考以下说明配置相关参数。
  7. 点击 Add

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

使用 CLI

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

Https

如果 frontend 协议(ft)是 HTTPS 或 GRPCS,规则也可以配置为使用 HTTPS。 你可以在规则或 ingress 中指定证书,以匹配该端口的证书。

支持终止(termination),如果后端协议是 HTTPS,也支持重新加密(re-encryption)。但不能为与后端服务通信指定证书。

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 的规则,并通过 .spec.certificate_name 指定证书

重新加密模式

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

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

Ingress

ingress 同步

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

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

.spec.config.projects 配置中包含项目名 demo 的 ALB 会自动将这些 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 端口创建规则,使用默认证书