配置 GatewayAPI Gateway
目录
概述前提条件Gateway 基础什么是 GatewayGateway 暴露方式 (Service Type)LoadBalancer (推荐)NodePortClusterIP监听器配置端口和协议AllowRouteNSTLS 配置EnvoyProxy (部署配置)推荐的资源规格镜像仓库创建 Gateway通过 Web Console监听器配置通过 YAML包含多种监听器类型的完整示例查看 Gateway 详情监听器与 Route 参考主机名主机名交集规则支持的 Route 类型下一步概述
在 Envoy Gateway operator 和 EnvoyGatewayCtl 准备就绪后,配置一个 Gateway。
Gateway 定义流量如何进入 gateway,而配套的 EnvoyProxy 则控制底层 Envoy
data plane 的部署方式。
在推荐的工作流程中,请在 Envoy Gateway Operator
之后、配置 GatewayAPI Route 之前配置 Gateway。
前提条件
请确保在继续之前已完成以下步骤:
- 阅读 Envoy Gateway Operator,以了解基本概念和资源关系
- 安装 Envoy Gateway operator 并创建一个
EnvoyGatewayCtl
在创建 Gateway 之前,请先了解主要的 Gateway 概念。如果你已经熟悉这些概念,
可以直接跳到 创建 Gateway 部分。
Gateway 基础
什么是 Gateway
Gateway 是流量进入集群的入口点。它定义外部请求如何接收并路由到后端服务。Gateway 主要定义以下内容:
- 监听器:定义 gateway 监听的端口、协议和主机名
- GatewayClass:选择由哪个 gateway controller 管理该
Gateway - 基础设施引用:引用一个
EnvoyProxy,用于控制底层 Envoy data plane 的部署方式
Gateway 暴露方式 (Service Type)
Service Type 用于配置 gateway 如何通过底层 Envoy Service 暴露。共有三种模式: LoadBalancer、NodePort 和 ClusterIP。
在 YAML 中,此设置配置在配套的 EnvoyProxy 资源中,位置为
.spec.provider.kubernetes.envoyService.type。
LoadBalancer (推荐)
其优点是易用,并具备高可用的负载均衡能力。 要使用 LoadBalancer,集群必须支持 LoadBalancer,可通过 MetalLB 启用。
使用 MetalLB 时,你可以通过 service 注解指定静态 VIP。在 Web Console 中,请使用 Service Annotation 字段:
更多详情请参见 如何在使用 MetalLB 时指定 VIP。
NodePort
其优点是不需要任何外部依赖。
不过,使用 NodePort 有以下缺点:
- 使用 NodePort 时,Kubernetes 分配的 NodePort 端口号与 service 自身端口不同。访问时必须使用 NodePort 端口号,而不是 service 端口。
- 该 service 可通过集群中任意节点 IP 地址访问,可能带来潜在的安全风险。
使用 NodePort 时如何获取正确端口
在 Gateway 详情页中,当 Service Type 为 NodePort 时,监听器列表会显示 NodePort 列,展示分配的端口号。你也可以使用以下命令:
输出结果即为 NodePort。
ClusterIP
如果你不需要对外暴露,这种方式非常方便。
监听器配置
监听器定义 gateway 监听的端口和协议。在 HTTP 或 HTTPS 协议中,不同的主机名可以视为不同的监听器。
你不能创建端口、协议或主机名冲突的监听器。
你必须在 Gateway 中至少创建一个监听器。
端口和协议
每个监听器都通过端口号和协议进行配置。支持的协议包括:HTTP、HTTPS、TCP、UDP、TLS。
AllowRouteNS
默认情况下,Route 只能附加到 Same 命名空间中的 Gateway。若要允许跨命名空间路由,请使用 Allowed Routes Namespace 字段:
Same:允许同一命名空间中的 Route 附加到此监听器。All:允许任意命名空间中的 Route 附加到此监听器。Selector:允许与选择器匹配的命名空间中的 Route 附加到此监听器。
在 ACP 中,一个项目通过命名空间上的标签来标识,例如 cpaas.io/project: <project-name>。如果你希望某个监听器仅供特定项目的 Route 使用,请使用 Selector 并匹配目标命名空间上的项目标签。
监听器的 Allowed Routes Namespace 设置与其协议共同决定了当你将 route 发布到监听器时,Route Web Console 中哪些监听器可用。
更多信息请参见 attach to gateway created in other ns。
TLS 配置
对于 HTTPS 和 TLS 协议,你需要配置 TLS 设置。
TLS 模式:
- HTTPS 协议仅支持 Terminate 模式
- TLS 协议同时支持 Terminate 和 Passthrough 模式
- 采用 Passthrough 模式的 TLS 监听器支持 TLSRoute
- 采用 Terminate 模式的 TLS 监听器支持 TCPRoute
证书要求:
- 默认情况下,你只能使用在同一命名空间中创建的 secret
- secret 必须是
kubernetes.io/tls类型,并包含tls.crt和tls.key键 - 关于跨命名空间 secret,请参见 use secret created in other ns
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 类型和注解
- 镜像仓库
推荐的资源规格
对于典型的 HTTP 和 HTTPS 南北向流量,可将以下值作为单个 envoy-proxy
Pod 的起始参考值。这些建议适用于
.spec.provider.kubernetes.envoyDeployment.container.resources。
- 这些值是起始参考值,不是硬性限制。请结合你的实际流量特征进行验证。
- TLS 终止、已启用的策略、路由复杂度、请求和响应大小,以及长连接都可能增加资源消耗。
- 使用多个从节点时,应根据每个从节点实际处理的 QPS 进行扩缩容,而不仅仅是依据 Gateway 的总 QPS。
镜像仓库
镜像仓库已根据你集群的默认值预先配置。除非必要,请不要修改它。
有关其他部署配置方式,请参见 deployment-mode。
创建 Gateway
通过 Web Console
- 导航到
Alauda Container Platform -> Networking -> Gateway -> Gateways - 点击
Create Gateway按钮 - 在
Create Gateway页面中,选择由你的EnvoyGatewayCtl创建的GatewayClass。在 Envoy Gateway Operator 推荐的默认示例中,该值为envoy-gateway-operator-cpaas-default。
该页面显示以下配置项:
Web Console 表单仅支持由 EnvoyGatewayCtl 创建的 GatewayClass。对于其他 GatewayClass,请使用 YAML 编辑器。
当使用 EnvoyGatewayCtl 创建的 GatewayClass 时,Web Console 会自动创建一个与 Gateway 名称和命名空间匹配的配套 EnvoyProxy 资源。
监听器配置
在创建或编辑监听器时,你可以配置以下内容:
HTTPS 协议配置
当选择 HTTPS 作为协议时:
- HTTPS 协议仅支持 Terminate 模式
- HTTPS 监听器必须选择证书
- 默认情况下,你只能使用在同一命名空间中创建的 secret
TLS 协议配置
当选择 TLS 作为协议时:
配置字段
有关 TLS 模式的详细信息,请参见 TLS 配置。
通过 YAML
如果你没有使用推荐的默认示例,请将 envoy-gateway-operator-cpaas-default 替换为你自己的 EnvoyGatewayCtl 创建的 GatewayClass。
下面这个最小示例创建了一个 HTTP Gateway 和一个专用 EnvoyProxy。
包含多种监听器类型的完整示例
如果你需要更多监听器类型,请使用以下完整示例:
- 参考 EnvoyProxy resource 进行部署配置
- 如有需要,将
envoy-gateway-operator-cpaas-default替换为你自己的GatewayClass listeners定义流量如何进入 gatewayhostname会影响基于主机名的路由如何匹配监听器protocol决定哪些 route 类型可以附加到监听器allowedRoutes控制哪些命名空间可以附加 routetls为 HTTPS 和 TLS 监听器配置 TLS 终止或透传EnvoyProxy名称必须与.spec.infrastructure.parametersRef.name匹配envoyService.type控制 gateway 的暴露方式- 除非你的环境确实需要,否则请保持
imageRepository不变 resources配置 Envoy data plane 的资源限制和请求- 将
provider.type保持为Kubernetes
查看 Gateway 详情
在 Gateway 详情页中,监听器列表会显示以下信息:
当 Gateway Service Type 为 NodePort 时,监听器列表会额外显示 NodePort 列。访问 gateway 时请使用 NodePort 值,而不是 service 端口。更多详情请参见 使用 NodePort 时如何获取正确端口。
监听器与 Route 参考
将 Route 资源附加到 Gateway 时,请使用以下规则。
主机名
监听器中的主机名是相同协议下监听器的唯一标识符。你不能在 gateway 中添加或更新冲突的监听器。
主机名交集规则
请求到达时,会将其与监听器的主机名和 Route 的主机名做交集匹配。只有交集中的主机名才会用于流量路由。
通配符(*)执行后缀匹配。例如,*.example.com 可匹配 foo.example.com 和 bar.example.com,
但不能匹配 example.com。
无交集意味着 Route 状态会变为异常,并且无法处理流量。
支持的 Route 类型
每个监听器会根据其协议支持不同的 Route 类型:
在配置 route 时,请确保它们与所附加监听器的协议相匹配。例如,你不能将 HTTPRoute 附加到 TCP 监听器。
下一步
在 Gateway 准备就绪后,请继续阅读 配置 GatewayAPI Route。如果在 route 附加后你还需要高级流量控制,请继续阅读 配置 GatewayAPI Policy。