配置 ALB

WARNING

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

ALB

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

每个 ALB 都有一个对应的 Deployment,该 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 的部署配置。

字段类型描述
.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 表示 port-project 模式,创建 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。

配置 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 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

Frontend 操作

创建

使用 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

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

Rule

Rule 是一种自定义资源(CR),用于定义 ALB 如何匹配和处理传入请求。

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

前提条件

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

NOTE

必须通过标签将 rule 关联到 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 中直接设置一个整数值作为优先级。

Action

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

功能说明链接
超时配置请求的超时设置。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

Backend

后端协议

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

Service Group 和会话亲和性策略

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

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

详情请参阅负载均衡算法。

Rule 操作

使用 web console

  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 中的证书注解

可以通过注解跨 namespace 引用证书。

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

Rule 中的证书

在 .spec.certificate_name 中,格式为 $secret_namespace/$secret_name

TLS 模式

Edge 模式

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

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

在重新加密模式下,客户端通过 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 监控。

商标声明

Envoy® 是 The Linux Foundation 的注册商标。

NGINX® 是 F5, Inc. 在美国及其他国家/地区的注册商标。

Alauda 是独立供应商。本产品与 The Linux Foundation 或 F5, Inc. 不存在关联,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于识别目的。