通过 ALB 配置 GatewayApi Gateway

入站网关(Gateway)是从 Gateway Class 创建的实例。它创建监听器以捕获指定域名和端口的外部流量。结合路由规则,可以将指定的外部流量路由到对应的后端实例。

创建入站网关以实现更细粒度的网络资源分配。

术语

资源名称概述使用说明
Gateway Class在标准 Gateway API 文档中,Gateway Class 被定义为创建网关的模板。不同的模板可创建适用于不同业务场景的入站网关,便于快速流量管理。平台内置专用的 Gateway Class。
入站网关入站网关对应具体的资源实例,用户可独占使用该入站网关的所有监听和计算资源。它是对监听器生效的路由规则配置。当网关检测到外部流量时,会根据路由规则分发到后端实例。可视为负载均衡器实例。
路由规则路由规则定义了从网关到服务的流量分发一系列准则。Gateway API 当前标准支持的路由规则类型包括 HTTPRoute、TCPRoute、UDPRoute 等。平台当前支持监听 HTTP、HTTPS、TCP 和 UDP 协议。

前提条件

平台管理员需确保集群支持 LoadBalancer 类型的内部路由。对于公有云集群,必须安装 LoadBalancer Service Controller。在非公有云集群,平台提供外部地址池功能,配置完成后,LoadBalancer 类型的内部路由可自动从外部地址池获取 IP 以供外部访问。

Gateway 和 Alb2 自定义资源(CR)示例

# demo-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  namespace: k-1
  name: test
  annotations:
    cpaas.io/display-name: ces
  labels:
    alb.cpaas.io/alb-ref: test-o93q7
spec:
  gatewayClassName: exclusive-gateway
  listeners:
    - allowedRoutes:
        namespaces:
          from: All
      name: gateway-metric
      protocol: TCP
      port: 11782
---
apiVersion: crd.alauda.io/v2beta1
kind: ALB2
metadata:
  namespace: k-1
  name: test-o93q7
spec:
  type: nginx
  config:
    enableAlb: false
    networkMode: container
    resources:
      limits:
        cpu: 200m
        memory: 256Mi
      requests:
        cpu: 200m
        memory: 256Mi
    vip:
      enableLbSvc: true
      lbSvcAnnotations: {}
    gateway:
      mode: standalone
      name: test
  1. 此网关使用的 ALB。
  2. 见下方 Gateway Class 介绍。
  3. ALB2 名称格式:{gatewayName}-{random}
  4. Gateway 名称。

通过 Web 控制台创建 Gateway

  1. 进入 Container Platform

  2. 在左侧导航栏点击 Network > Inbound Gateway

  3. 点击 Create Inbound Gateway

  4. 参考以下说明配置具体参数。

    参数说明
    名称入站网关的名称。
    Gateway ClassGateway Class 定义了网关的行为,类似于存储类(StorageClasses)的概念;它是集群资源。
    Dedicated:入站网关对应特定资源实例,用户可使用该网关的所有监听和计算资源。
    规格可根据需求选择推荐使用场景或自定义资源限制。
    访问地址入站网关的地址,默认自动获取。
    内部路由注解用于声明 LoadBalancer 类型内部路由的配置或能力。具体注解信息请参考LoadBalancer 类型内部路由注解说明
  5. 点击 Create

通过 CLI 创建 Gateway

kubectl apply -f demo-gateway.yaml

查看平台创建的资源

入站网关创建后,平台会自动创建大量资源。请勿删除以下资源。

默认创建资源名称
ALB2 类型资源name-lb-random
Deploymentname-lb-random
内部路由
  • name-lb-random
  • name-lb-random-lb-random
配置字典
  • name-lb-random-port-info
  • name-lb-random
Service Accountname-lb-random-serviceaccount

更新 Gateway

NOTE

更新入站网关会导致 3-5 分钟的服务中断,请选择合适时间进行操作。

通过 Web 控制台更新 Gateway

  1. 进入 Container Platform

  2. 在左侧导航栏点击 Network > Inbound Gateway

  3. 点击 ⋮ > Update

  4. 根据需要更新入站网关配置。

    注意:请根据业务需求合理设置规格。

  5. 点击 Update

添加监听器

监控指定域名下的流量,并根据绑定的路由规则转发到后端实例。

前提条件

  • 需要监控 HTTP 协议时,请提前联系管理员准备 域名

  • 需要监控 HTTPS 协议时,请提前联系管理员准备 域名证书

通过 Web 控制台添加监听器

  1. 在左侧导航栏点击 Network > Inbound Gateway

  2. 点击 入站网关名称

  3. 点击 Add Listener

  4. 参考以下说明配置具体参数。

    参数说明
    监听协议和端口当前支持监听 HTTP、HTTPS、TCP 和 UDP 协议,可自定义输入监听端口,例如:80

    注意
    • 端口相同时,HTTP、HTTPS 和 TCP 监听类型不能共存,只能选择其中一种协议。
    • 使用 HTTP 或 HTTPS 协议时,端口相同,域名必须不同。
    域名选择当前命名空间内可用的域名,用于监听访问该域名的网络流量。
    提示:TCP 和 UDP 协议不支持选择域名。
  5. 点击 Create

通过 CLI 添加监听器

kubectl patch gateway test \
  -n k-1 \
  --type=merge \
  -p '{
    "spec": {
      "listeners": [
        {
          "allowedRoutes": {
            "namespaces": {
              "from": "All"
            }
          },
          "name": "gateway-metric",
          "protocol": "TCP",
          "port": 11782
        },
        {
          "allowedRoutes": {
            "namespaces": {
              "from": "All"
            }
          },
          "name": "demo-listener",
          "protocol": "HTTP",
          "port": 8088,
          "hostname": "developer.test.cn"
        }
      ]
    }
  }'

创建路由规则

路由规则为入站流量提供路由策略,类似于入站规则(Kubernetes Ingress)。它们将网关监听到的网络流量暴露给集群内部路由(Kubernetes Service),便于实现路由转发策略。关键区别在于它们面向的服务对象不同:入站规则服务于 Ingress Controller,而路由规则服务于 Ingress Gateway。

Ingress Gateway 设置监听后,会实时监控指定域名和端口的流量。路由规则可将流量按需转发到后端实例。

HTTPRoute 自定义资源(CR)示例

# example-httproute.yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  namespace: k-1
  name: example-http-route
  annotations:
    cpaas.io/display-name: ""
spec:
  hostnames:
    - developer.test.cn
  parentRefs:
    - kind: Gateway
      namespace: k-1
      name: test
      sectionName: demo-listener
  rules:
    - matches:
        - path:
            type: Exact
            value: "/demo"
      filters: []
      backendRefs:
        - kind: Service
          name: test-service
          namespace: k-1
          port: 80
          weight: 100
  1. 可用类型包括:HTTPRouteTCPRouteUDPRoute
  2. Gateway 监听器名称。
NOTE

如果 HTTPRoute 类型路由规则中 Path 对象无匹配规则,将自动添加一个 PathPrefix 模式且值为 / 的匹配规则。

通过 Web 控制台创建路由规则

  1. 进入 Container Platform

  2. 在左侧导航栏点击 Network > Route Rules

  3. 点击 Create Route Rule

  4. 按照以下说明配置部分参数。

    参数说明
    路由类型当前支持的路由类型有:HTTPRoute、TCPRoute、UDPRoute。
    提示: HTTPRoute 支持发布到 HTTP 和 HTTPS 协议监听器。
    发布到监听器左侧选择框选择已创建的 Ingress Gateway,右侧选择框选择已创建的 Listener。平台会将创建的路由规则发布到该监听器下,使网关将捕获的流量转发到指定后端实例。

    注意: 不允许发布路由规则到端口为 11782 或已挂载 TCP 或 UDP 路由的监听器。
    匹配可添加一个或多个匹配规则以捕获符合要求的流量,例如:捕获指定 Path 的流量捕获指定方法的流量等。

    注意:
    • 点击 Add;添加多个路由规则时,规则间关系为“与(AND)”,需全部匹配才生效。
    • 点击 Add Match;添加多组路由规则时,组间关系为“或(OR)”,任一组匹配即可生效。
    • TCPRoute 和 UDPRoute 不支持配置匹配规则。
    • 匹配对象为 path,匹配方式为 ExactPathPrefix 时,输入的 value 必须以“/”开头,且不允许包含“//”、“/./”、“/../”、“%2f”、“%2F”、“#”、“/..”、“/.” 等字符。
    动作可添加一个或多个动作处理捕获的流量。
    • Header:HTTP 消息头包含大量元数据,提供请求或响应的附加信息。通过修改头字段,服务器可影响请求和响应的处理方式。
    • Redirect:匹配的 URL 将按指定方式处理后,重新发起请求。
    • Rewrite:匹配的 URL 将按指定方式处理后,重定向到不同的资源路径或文件名。


    注意:
    • 点击 Add;添加多个动作规则时,平台将按规则显示顺序依次执行所有动作。
    • TCPRoute 和 UDPRoute 不支持配置动作规则。
    • 同一路由规则内,不允许存在多个相同 valueHeader 类型动作。
    • 同一路由规则内,只能存在一种类型的 RedirectRewrite,且只能存在一种模式的 FullPathPrefixPath
    • 若需使用 PrefixPath 操作,请先添加一个 PathPrefix 模式的匹配规则。
    后端实例规则生效后,将根据当前命名空间内选择的内部路由和端口转发到后端实例。可设置权重,权重值越高,被轮询的概率越大。
    提示: 权重旁的百分比表示转发到该实例的概率,计算方式为当前权重值与所有权重值之和的比值。
  5. 点击 Create

通过 CLI 创建路由规则

kubectl apply -f example-httproute.yaml