配置 ALB

WARNING

ALB 自 ACP 4.4 起已弃用。无法创建新的 ALB 实例,且 ALB 不再在 Web 控制台中提供。在从早期版本升级的集群上,现有 ALB 实例会继续运行,并且仍可通过 API 进行管理,因此可以将其流量迁移到 Envoy Gateway 或 Ingress NGINX。迁移完成后,请移除 ALB 实例。

ALB

ALB 是表示负载均衡器的自定义资源。在从早期版本升级的集群上,alb-operator 会监视 ALB 资源的创建、更新和删除操作,并据此创建相应的 Deployment 和 Service。

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

前提条件

负载均衡器的高可用性需要 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 的 Deployment 配置。

字段类型描述
.spec.config.nodeSelectormap[string]stringALB 的节点选择器
.spec.config.replicasint,optional default 3ALB 的副本数
.spec.config.resources.limitsk8s container-resource,optionalALB 的 nginx 容器限制
.spec.config.resources.requestsk8s container-resource,optionalALB 的 nginx 容器请求
.spec.config.resources.alb.limitsk8s container-resource,optionalALB 容器的限制
.spec.config.resources.alb.requestsk8s container-resource,optionalALB 容器的请求
.spec.config.antiAffinityKeystring,optional default localk8s antiAffinityKey

网络配置

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

字段类型描述
.spec.config.networkModestring: host or container, optional, default host在 container 模式下,operator 会创建一个 LoadBalancer Service,并使用其地址作为 ALB 地址。
.spec.addressstring,required您可以手动指定 ALB 的地址
.spec.config.vip.enableLbSvcbool, optional在 container 模式下自动设置为 true。
.spec.config.vip.lbSvcAnnotationsmap[string]string, optionalLoadBalancer Service 的额外注解。

项目配置

字段类型
.spec.config.projects[]string,required
.spec.config.portProjectsstring,optional
.spec.config.enablePortProjectbool,optional

将 ALB 添加到项目意味着:

  1. 在 Web UI 中,只有指定项目中的用户可以找到并配置此 ALB。
  2. 此 ALB 将处理属于该项目的 ingress 资源。请参阅 ingress-sync。
  3. 在 Web UI 中,在项目 X 中创建的规则无法在项目 Y 下找到或配置。

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

  1. 您无法创建不属于分配给该项目的端口范围的端口。

调整配置

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

ALB 操作

创建

使用 Web 控制台。

Web UI 中提供了一些常用配置。请按照以下步骤创建负载均衡器:

  1. 导航到 管理员。
  2. 在左侧边栏中,点击 网络管理 > 负载均衡器。
  3. 点击 创建负载均衡器。

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

参数描述
分配的地址.spec.address
分配方式Instance 表示项目模式,您可以在下方选择项目;port 表示端口项目模式,创建 alb 后可以分配端口范围
使用 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 alb-demo -n cpaas-system

前端

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

  • 在 L4 Proxy 中,使用 frontend 直接配置后端服务。
  • 在 L7 Proxy 中,使用 frontend 配置监听端口,并使用 rule 配置后端服务。

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

前置条件

首先创建一个 ALB。

配置前端

# 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 label:必填,用于指示此 Frontend 所属的 ALB 实例。

  2. frontend name:格式为 $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 proxy:必填。ALB 直接将流量转发到默认服务组。
    • L7 proxy:可选。ALB 首先在此 Frontend 上匹配规则;如果没有匹配项,则回退到默认的 serviceGroup。
  8. session_affinity_policy

前端操作

创建

使用 Web 控制台

  1. 进入 容器平台。

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

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

  4. 点击 添加端口。

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

参数描述
会话亲和性.spec.serviceGroup.session_affinity_policy
使用 CLI
kubectl apply -f alb-frontend-demo.yaml -n cpaas-system

后续操作

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

相关操作

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

NOTE

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

规则

规则是一种自定义资源(CR),用于定义 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 中配置规则的优先级,可以使用以下 annotation 格式:

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

对于规则,只需在 .spec.priority 中直接设置整数值形式的优先级。

操作

请求匹配规则后,您可以对请求应用以下操作

功能描述链接
超时配置请求的超时设置。timeout
重定向将传入请求重定向到指定 URL。redirect
CORS为原生应用启用跨域资源共享(CORS)。cors
Header 修改允许修改请求或响应 header。header modification
URL 重写在转发传入请求之前重写其 URL。url-rewrite
WAF集成 Web Application Firewall(WAF)以增强安全性。waf
OTEL启用 OpenTelemetry(OTEL)以进行分布式追踪和监控。otel
Keepalive启用或禁用原生应用的 keepalive 功能。keepalive

后端

后端协议

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

服务组和会话亲和性策略

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

默认情况下,ALB 使用 round-robin(RR)算法在后端服务之间分配请求。不过,您可以为各个服务分配权重,或选择其他负载均衡算法。

有关更多详细信息,请参阅负载均衡算法。

规则操作

使用 Web 控制台

  1. 进入容器平台。
  2. 在左侧导航栏中点击网络 > 负载均衡。
  3. 点击负载均衡器的名称。
  4. 选择监听端口名称。
  5. 点击添加规则。
  6. 参考以下说明配置相关参数。
  7. 点击添加。

WebUI 中的每个输入项都对应 CR 的一个字段

使用 CLI

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

HTTPS

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

您可以在规则或 ingress 中指定证书,以匹配特定端口的证书。

系统支持终止 TLS;如果后端协议为 HTTPS,还可以进行重新加密。但是,您无法为与后端服务的通信指定证书。

Ingress 中的证书 Annotation

可以通过 annotation 跨 namespace 引用证书。

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 模式下,客户端使用 HTTPS 与 ALB 通信,而 ALB 使用 HTTP 协议与后端服务通信。 要实现此配置:

  1. 创建使用 HTTPS 协议的 ft
  2. 创建后端协议为 HTTP 的规则,并通过 .spec.certificate_name 指定证书
Re-encrypt 模式

在 Re-encrypt 模式下,客户端使用 HTTPS 与 ALB 通信,而 ALB 使用 HTTPS 协议与后端服务通信。 要实现此配置:

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

Ingress

Ingress 同步

每个 ALB 都会创建一个同名的 IngressClass,并处理同一项目中的 Ingress。

当 ingress namespace 具有类似 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 namespace。
SSL 策略

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

您可以使用以下设置配置 ALB 自定义资源:

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

可用的 SSL 策略:

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

日志与监控

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

查看日志

  1. 前往 管理员。

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

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

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

监控指标

NOTE

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

  1. 前往 管理员。

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

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

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

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

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

有关监控指标的更多详细信息,请参阅 ALB 监控。