Skip to content

Gateway API 新一代网络 API

本页介绍如何在 Kuboard 中使用 Gateway API 创建第一个 HTTP 网关,并完成跨名称空间引用授权。适用于集群管理员与应用开发者。

Gateway API 是 Kubernetes 官方推出的新一代流量路由 API,目标是逐步取代 Ingress:把 Ingress「一个对象同时描述入口与路由」的做法,拆成 网关类 → 网关 → 路由 三级,集群运维与应用开发者各管各的、互不越权。

对比项IngressGateway API
对象模型一个对象同时承担「入口 + 路由」拆分为 网关类 / 网关 / 路由 三级
职责分工运维与应用开发共用同一对象运维管网关类与网关,开发者只管路由
协议支持以 HTTP / HTTPS 为主HTTP、HTTPS、TLS、TCP、UDP、gRPC
跨名称空间支持有限通过引用授权(ReferenceGrant)显式放行

与 Ingress 的关系

两者可以共存:已有 Ingress 不受影响,新入口建议优先用 Gateway API。传统 Ingress 见 服务与 Ingress,网络隔离见 NetworkPolicy

前置条件

  1. 安装 Gateway API 的 CRD(CustomResourceDefinition):
sh
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
  1. 安装网关控制器(任选其一,不同实现的特性支持略有差异;创建网关类时「控制器名称」填其预设值):
控制器控制器名称预设值
Istioistio.io/gateway-controller
Envoy Gatewaygateway.envoyproxy.io/gateway-controller
Ciliumio.cilium/gateway-controller
NGINX Gateway Fabricgateway.nginx.org/nginx-gateway-controller
ingress-nginxk8s.io/ingress-nginx(需以 --enable-gateway-api 参数启动)

Kuboard 中找不到「网关」菜单怎么办

  1. 菜单路径为 服务与网络 → 网关。集群未安装 Gateway API CRD 时,菜单仍会显示,但列表页为空;
  2. 点击 创建(+) 时,Kuboard 会先探测资源可用性,探测不通过则弹出 「资源不可用」 对话框,其中给出一键复制的安装命令(即上面的 standard-install.yaml)、组件说明与官方文档链接;
  3. 安装完成后刷新页面即可正常使用。

创建第一个 HTTP 网关

以最常见场景为例:让 example.com 的 HTTP 流量经过网关转发到名称空间 web 中的 Service my-web,共四步。网关类与网关通常由集群管理员创建,应用开发者主要创建路由并挂到已有网关上。

步骤 1:创建网关类(GatewayClass)

  1. 进入 服务与网络 → 网关 → 网关类,点击 创建(+)
  2. 填写:
字段说明示例
名称网关类名称example-gateway-class
控制器名称必填。下拉选择主流控制器,也可手动输入istio.io/gateway-controller
描述可选,256 字以内
  1. 点击 保存 → 在 预览 YAML 对话框确认 → 提交后跳转详情页,列表页出现该网关类,详情页状态显示控制器已接管即为成功(网关类为集群级资源,创建时不需要选择名称空间)。

高级项:参数引用

当控制器需要额外配置对象(如配置参数 CRD)时,在表单中展开「启用参数引用(高级)」并填写组 / 类型 / 名称即可。多数场景用不到,保持关闭。

步骤 2:创建网关(Gateway)

  1. 进入 服务与网络 → 网关 → 网关,点击 创建(+),填写 名称网关类名称(填步骤 1 的名称);
  2. 监听器 表格中点击 添加监听器,至少配置一个:
字段说明示例
名称监听器名称http-listener
端口1 - 6553580
协议HTTP / HTTPS / TCP / TLS / UDPHTTP
主机名可选;填写后该监听器只接收匹配此主机名的流量example.com
允许的路由允许哪些名称空间的路由接入:Same(仅本名称空间)/ All(全部)/ Selector(按标签选择)Same
  1. 地址 可选:不填时由控制器自动分配,创建后在详情页查看实际地址;保存并确认预览 YAML。详情页状态显示控制器已接管该网关即为成功;若显示未接管,见文末排障。

步骤 3:创建 HTTP 路由(HTTPRoute)

  1. 进入 服务与网络 → 网关 → HTTP 路由,点击 创建(+),填写 名称(如 my-web-route);
  2. 父级引用 中点击 添加父级引用,指向步骤 2 的网关:
字段说明
名称必填,网关名称
名称空间网关所在名称空间(与路由同名称空间时可不填)
配置节名称 / 端口可选,精确指定挂到某个监听器
  1. 主机名 中输入 example.com(回车确认;不填则匹配该网关下所有主机名);在 路由规则 中点击 添加路由规则,选中该规则后在下方「已选规则」区域配置 后端引用
字段说明示例
类型后端资源类型,默认 ServiceService
名称选择名称空间中的 Servicemy-web
名称空间Service 所在名称空间;跨名称空间时需引用授权(见下文)web
端口Service 的端口80
权重多后端时按权重分配流量(默认 1)1
  1. 保存并确认(结果:列表页出现该路由,详情页关联网关页签显示它挂到了哪个网关)。匹配条件(路径 / 请求头 / 查询参数 / 方法)与过滤器(URL 重写、请求头修改)为高级能力:表单只显示数量,具体内容需在 YAML 中编辑,多数场景只需主机名 + 后端引用。

步骤 4:验证

  1. HTTP 路由详情页 → 状态:显示已被控制器接受即规则生效;网关详情页 → 关联路由:能看到 HTTPRoute / my-web-route
  2. 网关详情页 → 地址:确认网关对外地址(由控制器分配);
  3. curl 验证流量:
sh
curl -H "Host: example.com" http://<网关地>/

能看到 my-web 的响应即成功。

ReferenceGrant 跨命名空间引用授权

Gateway API 的默认策略是:名称空间是信任边界,路由只能引用自己名称空间内的对象,跨名称空间引用一律被拒绝,除非被引用对象所在名称空间中有对应的引用授权。两种典型场景必须创建它:路由要转发到其他名称空间的 Service,或要引用其他名称空间的网关(如统一网关所在的 gateway-system)。

进入 服务与网络 → 网关 → 引用授权(即 ReferenceGrant),点击 创建(+),填写 名称(如 allow-web-to-my-web),然后配置下面两张表:来源(From)声明「谁」被允许引用,目标(To)声明「可以引用什么」。

字段说明示例
引用方资源所属组gateway.networking.k8s.io
类型引用方资源类型HTTPRoute
名称空间引用方所在的名称空间web
字段说明示例
被引用资源所属组(核心组留空)""
类型被引用资源类型Service
名称可选,限定具体对象;不填表示该名称空间内全部my-web

引用授权放在哪个名称空间

引用授权必须创建在被引用对象所在的名称空间。例如名称空间 A 的路由要引用名称空间 B 的 Service,就在名称空间 B 中创建,来源指向 A 的 HTTP 路由,目标指向 B 的 Service。

各类 Route 适用场景对比

类型处理层级主机名规则能力适用场景
HTTPRoute(HTTP 路由)L7路径 / 请求头 / 查询参数 / 方法匹配、过滤器、按权重多后端网站、REST 服务、按域名分流
GRPCRoute(gRPC 路由)L7按方法匹配、过滤器gRPC 微服务
TLSRoute(TLS 路由)L4有(按 SNI 分流)仅后端转发TLS 终结(HTTPS 回源)、按证书域名转发
TCPRoute(TCP 路由)L4仅后端转发数据库、消息队列等 TCP 服务
UDPRoute(UDP 路由)L4仅后端转发DNS、日志采集等 UDP 服务
  • 按域名 / 路径 / 请求头精细转发 → HTTPRoute;gRPC 流量 → GRPCRoute;
  • 只按端口 + 域名(SNI)转发 TLS 流量 → TLSRoute;四层裸流量 → TCPRoute / UDPRoute(无主机名,规则只有后端引用)。

排障:路由不生效看哪里

路由不生效时,先看状态、再看事件

  1. 网关详情页 → 状态路由详情页 → 状态:看不正常(失败 / 被拒绝)的行,「原因」与「消息」会直接说明问题;若路由显示「控制器未上报状态」,说明控制器没有处理它;
  2. 核对关联关系:路由详情页 → 关联网关 确认指向了正确的网关;网关详情页 → 关联路由 确认路由确实在列表中。

常见原因速查:

现象常见原因
网关状态为空 / 未接管网关控制器未安装或未启动;先按「前置条件」检查
路由状态异常(被拒绝)监听器配置不合法(端口冲突、协议不支持)、网关类名称不存在
路由挂不上网关父级引用名称 / 名称空间写错;监听器协议与路由类型不匹配;被监听器的「允许的路由」拒绝
跨名称空间转发失败缺少引用授权(在被引用 Service 所在名称空间创建)
指定了主机名但访问 404路由的主机名与监听器主机名不匹配;或请求的 Host 不在路由的主机名列表内
后端连接失败后端引用的端口写错、Service 不存在、权重为 0

事件怎么看

状态信息不足时,打开对应对象的 事件 页签查看控制器报错。Kuboard 的对象列表与详情页均提供「事件」入口。