配置 GatewayAPI Gateway

概述

在 Envoy Gateway operator 和 EnvoyGatewayCtl 就绪后,配置一个 Gateway。 Gateway 定义流量如何进入 Gateway,而配套的 EnvoyProxy 控制底层 Envoy data plane 的部署方式。

在推荐的工作流中,请在 Envoy Gateway Operator 之后、配置 GatewayAPI Route 之前配置 Gateway。

要公开由 Gateway 命名空间外部拥有的其他 listener,请参阅配置 Gateway API ListenerSet。

前提条件

继续操作前,请确保已完成以下操作:

  1. 阅读 Envoy Gateway Operator 以了解基本概念和资源关系
  2. 安装 Envoy Gateway operator 并创建一个 EnvoyGatewayCtl
NOTE

创建 Gateway 前,请先了解 Gateway 的主要概念。如果您已经熟悉这些概念,可以跳转到创建 Gateway部分。

Gateway 基础知识

什么是 Gateway

Gateway 是进入集群的流量入口。它定义如何接收外部请求并将其路由到后端服务。Gateway 主要定义:

  • Listener:定义 Gateway 监听的端口、协议和主机名
  • GatewayClass:选择管理此 Gateway 的 Gateway controller
  • Infrastructure reference:引用一个控制底层 Envoy data plane 部署方式的 EnvoyProxy

Gateway 暴露(Service Type)

Service Type 配置 Gateway 如何通过底层 Envoy Service 暴露。有三种模式: LoadBalancer、NodePort 和 ClusterIP。

在 YAML 中,此设置配置于配套的 EnvoyProxy 资源中的 .spec.provider.kubernetes.envoyService.type。

LoadBalancer(推荐)

其优势在于易于使用,并具备高可用负载均衡能力。 要使用 LoadBalancer,集群必须支持 LoadBalancer,可以通过 MetalLB 启用。

使用 MetalLB 时,可以通过 Service annotations 指定静态 VIP。在 Web Console 中,使用 Service Annotation 字段:

metallb.universe.tf/address-pool: ADDRESS_POOL_NAME
# Or specify a specific IP directly
metallb.universe.tf/loadBalancerIPs: VIP_IP

有关更多详细信息,请参阅使用 MetalLB 指定 VIP 的方法。

NodePort

其优势在于不需要任何外部依赖。

但是,使用 NodePort 存在以下缺点:

  • 使用 NodePort 时,Kubernetes 分配的 NodePort 端口号与 Service 自身的端口不同。访问时必须使用 NodePort 端口号,而不是 Service 端口。
  • 可以通过集群中任意节点的 IP 地址访问该 Service,这可能带来潜在的安全风险。
使用 NodePort 时如何获取正确的端口

在 Gateway 详情页面中,当 Service Type 为 NodePort 时,listener 列表会显示 NodePort 列,其中包含分配的端口号。您也可以使用以下命令:

kubectl get svc -n ${ENVOYGATEWAYCTL_NS} -l gateway.envoyproxy.io/owning-gateway-name=${GATEWAY_NAME} -o=jsonpath="{.items[0].spec.ports[?(@.port==${PORT})].nodePort}"

输出结果即为 NodePort。

ClusterIP

如果不需要对外暴露,ClusterIP 非常方便。

Listener 配置

Listener 定义 Gateway 监听的端口和协议。对于 HTTP 或 HTTPS 协议,不同的主机名可以视为不同的 listener。

不能创建端口、协议或主机名冲突的 listener。

必须在 Gateway 中至少创建一个 listener。

允许 ListenerSet

Gateway 可以接受来自同一命名空间或其他命名空间中 ListenerSet 的额外 listener。配置 spec.allowedListeners.namespaces 以控制接受哪些 ListenerSet 命名空间:

值行为
None拒绝所有 ListenerSet。这是默认设置。
Same接受 Gateway 命名空间中的 ListenerSet。
Selector接受与 selector 匹配的命名空间中的 ListenerSet。
All接受所有命名空间中的 ListenerSet。

对于 Selector,请在 .spec.allowedListeners.namespaces.selector 下配置标签选择器。有关更多信息,请参阅 配置 GatewayAPI ListenerSet。

端口和协议

每个 listener 都通过端口号和协议进行配置。支持的协议包括:HTTP、HTTPS、TCP、UDP 和 TLS。

AllowRouteNS

默认情况下,Route 只能附加到 Same 命名空间中的 Gateway。要允许跨命名空间路由,请使用 Allowed Routes Namespace 字段:

  • Same:允许同一命名空间中的 Route 附加到此 listener。
  • All:允许任意命名空间中的 Route 附加到此 listener。
  • Selector:允许与选择器匹配的命名空间中的 Route 附加到此 listener。

在 ACP 中,项目通过命名空间上的标签标识,例如 cpaas.io/project: <project-name>。如果希望 listener 仅供特定项目中的 Route 使用,请使用 Selector,并匹配目标命名空间上的项目标签。

Listener 的 Allowed Routes Namespace 设置及其协议共同决定了在 Route Web Console 中将 Route 发布到 listener时可用的 listener。

有关更多信息,请参阅附加到在其他命名空间中创建的 Gateway。

TLS 配置

对于 HTTPS 和 TLS 协议,需要配置 TLS 设置。

TLS 模式:

TLS 模式描述是否需要证书
TerminateEnvoy 终止 TLS,并在转发到后端服务前解密流量是,必须选择 TLS 证书
PassthroughEnvoy 不解密加密的 TLS 流量,直接将其传递到后端服务否
NOTE
  • HTTPS 协议仅支持 Terminate 模式
  • TLS 协议同时支持 Terminate 和 Passthrough 模式
  • Passthrough 模式的 TLS listener 支持 TLSRoute
  • Terminate 模式的 TLS listener 支持 TCPRoute

证书要求:

  • 默认情况下,只能使用在同一命名空间中创建的 Secret
  • Secret 必须为 kubernetes.io/tls 类型,并包含 tls.crt 和 tls.key 键
  • 对于跨命名空间 Secret,请参阅使用在其他命名空间中创建的 Secret

EnvoyProxy(部署配置)

Envoy Gateway 使用 EnvoyProxy 资源控制 Gateway 部署配置。建议为每个 Gateway 创建专用的 EnvoyProxy 资源,并通过 Gateway 的 .spec.infrastructure.parametersRef 字段引用该资源。

当您在 Web Console 中使用由 EnvoyGatewayCtl 创建的 GatewayClass 创建 Gateway 时,控制台会自动创建一个名称和命名空间相同的配套 EnvoyProxy 资源。

通过应用 YAML 创建 Gateway 时,您需要负责确保 Gateway .spec.infrastructure.parametersRef 以及所引用的 EnvoyProxy 资源保持一致。

这种一对一映射方式可以更好地隔离部署配置,并提供更细粒度的控制,例如:

  • 副本数
  • 资源限制和请求
  • 节点选择器
  • Service 类型和 annotations
  • 镜像仓库

要限制某个命名空间中的 Envoy data plane 请求总量,请在该命名空间中创建一个 EnvoyProxyResourceQuota。配额会评估该配套的 EnvoyProxy 以及命名空间中的其他 EnvoyProxy 资源。

推荐资源规格

对于典型的 HTTP 和 HTTPS 南北向流量,单个 envoy-proxy Pod 可使用以下值作为起始配置。这些建议适用于 .spec.provider.kubernetes.envoyDeployment.container.resources。

每个 envoy-proxy Pod 的峰值 QPS推荐 CPU推荐内存
4,0002 核1Gi
8,0004 核2Gi
12,0008 核4Gi
NOTE
  • 这些值是起始配置,并非硬性限制。请根据实际流量特征进行验证。
  • TLS 终止、启用的策略、Route 复杂度、请求和响应大小以及长连接都可能增加资源使用量。
  • 使用多个副本时,应根据每个副本实际处理的 QPS 进行扩展,而不只是依据 Gateway 的总 QPS。

镜像仓库

镜像仓库已预配置为集群的默认值。除非必要,否则不要修改。

有关其他部署配置方法,请参阅deployment-mode。

创建 Gateway

通过 Web 控制台

  1. 导航至 Alauda Container Platform -> Networking -> Gateway -> Gateways
  2. 点击 Create Gateway 按钮
  3. 在 Create Gateway 页面中,选择由你的 EnvoyGatewayCtl 创建的 GatewayClass。在 Envoy Gateway Operator 推荐的默认示例中,该对象为 envoy-gateway-operator-cpaas-default。

页面会显示以下配置选项:

字段描述YAML 路径
NameGateway 名称gateway: .metadata.name
envoyproxy: .metadata.name
GatewayClass要使用的 GatewayClassgateway: .spec.gatewayClassName
Service TypeService Typeenvoyproxy: .spec.provider.kubernetes.envoyService.type
Service AnnotationService 注解envoyproxy: .spec.provider.kubernetes.envoyService.annotations
Resource LimitsDeployment 资源限制envoyproxy: .spec.provider.kubernetes.envoyDeployment.container.resources
ReplicasDeployment 副本数envoyproxy: .spec.provider.kubernetes.envoyDeployment.replicas
Node LabelsDeployment 节点选择器envoyproxy: .spec.provider.kubernetes.envoyDeployment.nodeSelector
ListenerListenergateway: .spec.listeners
WARNING

Web 控制台表单仅支持由 EnvoyGatewayCtl 创建的 GatewayClass。对于其他 GatewayClass,请使用 YAML 编辑器。

NOTE

使用由 EnvoyGatewayCtl 创建的 GatewayClass 时,Web 控制台会自动创建一个与 Gateway 名称和命名空间匹配的配套 EnvoyProxy 资源。

Listener 配置

创建或编辑 Listener 时,可以配置以下内容:

字段描述YAML 路径
NameListener 的名称.spec.listeners[].name
PortListener 监听的端口号.spec.listeners[].port
ProtocolListener 使用的协议。选项:HTTP、HTTPS、TCP、UDP、TLS.spec.listeners[].protocol
Hostname可选。Listener 的主机名.spec.listeners[].hostname
Allowed Routes Namespace控制哪些命名空间可以将路由附加到此 Listener.spec.listeners[].allowedRoutes.namespaces.from
HTTPS 协议配置

选择 HTTPS 作为协议时:

字段描述YAML 路径
Certificates必填。选择包含 TLS 证书的 Kubernetes secret。.spec.listeners[].tls.certificateRefs
NOTE
  • HTTPS 协议仅支持 Terminate 模式
  • HTTPS Listener 必须选择证书
  • 默认情况下,只能使用在同一命名空间中创建的 secret
TLS 协议配置

选择 TLS 作为协议时:

配置字段

字段描述YAML 路径
TLS Mode选择 TLS 模式。选项:Terminate、Passthrough。默认值:Terminate.spec.listeners[].tls.mode
TLS Certificate仅当 TLS Mode 为 Terminate 时必填。选择包含 TLS 证书的 secret。.spec.listeners[].tls.certificateRefs

有关 TLS 模式的详细信息,请参阅 TLS 配置。

通过 YAML

如果不使用推荐的默认示例,请将 envoy-gateway-operator-cpaas-default 替换为你自己的 EnvoyGatewayCtl 创建的 GatewayClass。

以下最小示例会创建一个 HTTP Gateway 和一个专用的 EnvoyProxy。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: demo
  namespace: demo
spec:
  infrastructure:
    parametersRef:
      group: gateway.envoyproxy.io
      kind: EnvoyProxy
      name: demo
  gatewayClassName: envoy-gateway-operator-cpaas-default
  listeners:
    - name: http
      port: 80
      protocol: HTTP
      allowedRoutes:
        namespaces:
          from: Same
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: demo
  namespace: demo
spec:
  provider:
    kubernetes:
      envoyService:
        type: ClusterIP
      envoyDeployment:
        replicas: 1
        container:
          imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
          resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: '1'
              memory: 1Gi
    type: Kubernetes

包含多种 Listener 类型的完整示例

如果需要更多 Listener 类型,请使用以下完整示例:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: demo
  namespace: demo
spec:
  infrastructure:
    parametersRef:
      group: gateway.envoyproxy.io
      kind: EnvoyProxy
      name: demo
  gatewayClassName: envoy-gateway-operator-cpaas-default
  listeners:
    - name: http
      port: 80
      hostname: a.com
      protocol: HTTP
      allowedRoutes:
        namespaces:
          from: Same
    - name: https
      port: 443
      hostname: a.com
      protocol: HTTPS
      allowedRoutes:
        namespaces:
          from: Same
      tls:
        mode: Terminate
        certificateRefs:
          - name: demo-tls
    - name: tls-passthrough
      port: 8443
      hostname: tls.example.com
      protocol: TLS
      allowedRoutes:
        namespaces:
          from: Same
      tls:
        mode: Passthrough
    - name: tls-terminate
      port: 9443
      hostname: secure.example.com
      protocol: TLS
      allowedRoutes:
        namespaces:
          from: Same
      tls:
        mode: Terminate
        certificateRefs:
          - name: demo-tls
    - name: tcp
      port: 8080
      protocol: TCP
      allowedRoutes:
        namespaces:
          from: Same
    - name: udp
      port: 8081
      protocol: UDP
      allowedRoutes:
        namespaces:
          from: Same
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: demo
  namespace: demo
spec:
  provider:
    kubernetes:
      envoyService:
        type: ClusterIP
      envoyDeployment:
        replicas: 1
        container:
          imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
          resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: '1'
              memory: 1Gi
    type: Kubernetes
  1. 用于部署配置的 EnvoyProxy 资源
  2. 如有需要,将 envoy-gateway-operator-cpaas-default 替换为你自己的 GatewayClass
  3. listeners 定义流量如何进入 Gateway
  4. hostname 影响基于主机的路由与 Listener 的匹配方式
  5. protocol 确定哪些路由类型可以附加到 Listener
  6. allowedRoutes 控制哪些命名空间可以附加路由
  7. tls 为 HTTPS 和 TLS Listener 配置 TLS 终止或透传
  8. EnvoyProxy 名称必须与 .spec.infrastructure.parametersRef.name 匹配
  9. envoyService.type 控制 Gateway 暴露方式
  10. 除非环境确有需要,否则请保持 imageRepository 不变
  11. resources 配置 Envoy 数据平面的资源限制和请求
  12. 将 provider.type 保持为 Kubernetes

查看 Gateway 详情

在 Gateway 详情页面中,Listener 列表显示以下信息:

列描述
NameListener 名称
ProtocolListener 协议(HTTP、HTTPS、TCP、UDP、TLS)
Port配置的端口号
NodePort当 Service Type 为 NodePort 时显示。显示用于访问 Listener 的已分配 NodePort 端口号。
NOTE

当 Gateway Service Type 为 NodePort 时,Listener 列表会额外显示 NodePort 列。访问 Gateway 时,请使用 NodePort 值,而不是 Service 端口。更多详细信息,请参阅使用 NodePort 时如何获取正确的端口。

Listener 和 Route 参考

将 Route 资源附加到 Gateway 时,请遵循以下规则。

主机名

Listener 中的主机名是具有相同协议的 Listener 的唯一标识符。无法在 Gateway 中添加或更新冲突的 Listener。

主机名交集规则

请求到达时,系统会将其与 Listener 主机名和 Route 主机名的交集进行匹配。只有交集中的主机名才会用于路由流量。

Listener 主机名Route 主机名交集结果示例
无主机名无主机名匹配所有主机接受任何传入的主机标头
无主机名有主机名(例如 api.example.com)所有 Route 主机名仅匹配包含 api.example.com 的请求
有主机名(例如 api.example.com)无主机名所有 Listener 主机名仅匹配包含 api.example.com 的请求
有主机名(例如 api.example.com)有匹配的精确主机名精确匹配的主机名仅匹配包含 api.example.com 的请求
有通配符(例如 *.example.com)有匹配的主机名匹配的特定主机名匹配包含 api.example.com 或 web.example.com 的请求
有主机名(例如 api.example.com)有不匹配的主机名无交集 - Route 状态异常Route 无法处理流量
NOTE

通配符(*)执行后缀匹配。例如,*.example.com 可以匹配 foo.example.com 和 bar.example.com, 但无法匹配 example.com。

WARNING

无交集意味着 Route 状态会变为异常,无法处理流量。

支持的 Route 类型

每个 Listener 根据其协议支持不同的 Route 类型:

Listener 协议支持的 Route 类型
HTTPHTTPRoute、GRPCRoute
HTTPSHTTPRoute、GRPCRoute
TLS(Passthrough 模式)TLSRoute
TLS(Terminate 模式)TCPRoute
TCPTCPRoute
UDPUDPRoute

配置 Route 时,请确保其协议与要附加到的 Listener 的协议匹配。例如,不能将 HTTPRoute 附加到 TCP Listener。

下一步

Gateway 就绪后,请继续阅读配置 GatewayAPI Route。如果附加 Route 后需要进行高级流量控制,请继续阅读配置 GatewayAPI Policy。 如需在命名空间级别限制 Envoy 数据平面资源,请参阅 配置 EnvoyProxy 资源配额。

商标声明

Envoy® 是 Linux Foundation 的注册商标。

MetalLB™ 是 Linux Foundation 的商标。

Alauda 是独立供应商。本产品与 Linux Foundation 无关,亦未获得其认可或赞助。所有商标均为其各自所有者的财产,在此仅用于识别目的。