第四部分:Gateway 资源介绍

📝 前言

在 Kubernetes 的服务治理体系中,如何管理集群入口流量 一直是核心问题。

早期的 Ingress 资源承担了大部分 HTTP/HTTPS 流量入口的工作,但随着应用场景复杂化,Ingress 的功能和可扩展性逐渐显得不足。

Gateway API 是 Kubernetes 社区推动的新一代流量入口管理标准,旨在提供比 Ingress 更清晰、更强大、更可扩展的解决方案。

🧭 背景介绍

在云原生环境中,应用面临的流量管理挑战包括:

  • 多协议支持不足:Ingress 仅支持 HTTP/HTTPS,难以覆盖 TCP/UDP 等场景。
  • 跨团队协作复杂:Ingress 规则通常由开发和运维团队共享,权限边界模糊。
  • 实现不一致:不同 Ingress Controller 对规范的支持差异较大,缺乏统一标准。

Gateway API 的设计目标:

  • 抽象解耦:通过 GatewayClass、Gateway、Route 等资源对象,将控制权拆分给不同角色。
  • 协议扩展:除 HTTP 外,还能支持 TCP、UDP、TLS 等协议。
  • 多租户友好:允许在不同命名空间下定义路由并绑定同一个 Gateway。
  • 标准化生态:提供统一的 CRD 标准,便于 NGINX、Istio、Kong 等实现。

🧠 本章知识卡片

🚀 本章小节

1️⃣ 什么是 Gateway

网关(Gateway)API 是一组 API 类别,可提供动态基础设施配置和高级流量路由。
Gateway API 通过使用可扩展的、角色导向的、 协议感知的配置机制来提供网络服务。

它是一个附加组件,包含可提供动态基础设施配置和高级流量路由的 API 类别。

来源:https://kubernetes.io/zh-cn/docs/concepts/services-networking/gateway/

简单点来说,它能统一管理 L4/L7 层的流量入口

2️⃣ 工作原理

Gateway API 的核心资源对象包括:

  • GatewayClass
    类似于 StorageClass,用于定义网关的控制器类型(例如 NGINX、Istio)。

  • Gateway

    定义实际的网关实例(入口点),由 GatewayClass 控制器负责实现。

    一个 Gateway 对象只能与一个 GatewayClass 相关联

  • Route(HTTPRoute、TCPRoute、UDPRoute、TLSRoute)

    描述路由规则,用于匹配请求并转发到后端 Service。

    多个

Gateway API 被组织成不同的 API 类别,这些 API 类别具有相互依赖的关系,以支持组织中角色导向的特点。

组件图:

3️⃣ 工作流程图

大致工作流程如下所示:

4️⃣ 安装部署

安装 Gateway CRD

可通过以下命令一键安装CRD:

1
2
3
4
# 官方安装
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml

# 若无法下载可关注公众号【青萍叙事】,回复:gateway 即可下载打包好的所有配置文件

安装完成后,可以验证 CRD 是否已就绪:

1
kubectl get crd | grep gateway.networking.k8s.io

选择并安装 Gateway Controller

Gateway API 本身只定义了标准,需要由具体的 实现控制器 来运行。

常见选择包括:

  • NGINX Gateway Fabric(推荐给熟悉 NGINX 的团队)
  • Istio Gateway(适合使用 Service Mesh 的场景)
  • Kong Gateway(API 网关功能更丰富)
  • 云厂商实现(如 AWS Gateway Controller、GCP Gateway Controller、阿里云 ACK Gateway Controller)

以 NGINX Gateway 为例,安装方式如下:

1
2
3
4
5
6
7
8
# 从官方下载 Nginx CRD
wget https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/refs/tags/v2.1.1/deploy/crds.yaml

# 安装 Nginx CRD
kubectl apply -f nginx-gateway-crds.yaml --server-side

# 继续安装 Controller
kubectl apply -f https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/refs/tags/v2.1.1/deploy/nodeport/deploy.yaml

PS:若之前有安装过 Ingress Controller 可先卸载,避免端口冲突。

卸载命令:helm uninstall -n ingress-nginx ingress-nginx

安装 Gateway

在 Controller 安装完成之后,我们继续安装 Gateway 组件。

Gateway 是数据面的核心组件,它定义了一个网络端点,该端点可用于处理流量,即对 Service 等后端进行过滤、平衡、拆分等。

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: nginx-gateway
namespace: nginx-gateway
spec:
gatewayClassName: nginx
listeners:
- name: http
protocol: HTTP
port: 80
hostname: "*.nip.io" # 允许所有 nip.io 子域
allowedRoutes:
namespaces:
from: All # 允许所有命名空间的路由

5️⃣ 实战示例

在上一步我们已经把基础 Gateway 组件全部安装完毕,接下来就是如何使用了。

如果是 L7 的 HTTP 协议,可创建一个 HTTPRoute 资源,并关联 Gateway 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-route
namespace: default
spec:
parentRefs:
- name: nginx-gateway # 关联的 Gateway 名称
namespace: nginx-gateway # 关联的 Gateway 所在命名空间
hostnames:
- "app.192.168.162.129.nip.io"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: nginx-svc
port: 80
namespace: default # 明确指定后端服务的命名空间

至于 deployment 和 service 我们可以使用快速命令完成创建:

1
2
3
4
5
6
7
# 快速创建 nginx deployment
kubectl create deployment nginx-deployment \
--image=nginx:1.27 --replicas=1

# 快速创建 nginx service
kubectl expose deployment nginx-deployment \
--port=80 --name=nginx-svc

资源都准备好了,接下来如何访问呢?

首先我们需要先找到 Gateway 监听的端口,我这里以 NodePort 为例:

1
2
3
kubectl get svc -n nginx-gateway

nginx-gateway-nginx NodePort 10.96.0.72 <none> 80:45718/TCP 6m33s

其中:45718 即为宿主机的访问端口,当然也可以改为80。

访问地址:http://app.192.168.162.129.nip.io:45718

PS:如果是在公有云,使用的是 LoadBalancer 类型,那应该是根据 Gateway 的 IP 来访问,而不是宿主机IP,可通过以下命令查看 Gateway IP:

1
kubectl get gateway -n nginx-gateway

访问流程如下:

6️⃣ 常用命令

命令 说明
kubectl get gatewayclass 查看所有 GatewayClass
kubectl get gateway 查看 Gateway 实例
kubectl describe gateway <name> 查看 Gateway 详情
kubectl get httproute 查看 HTTP 路由规则
kubectl describe httproute <name> 查看路由规则详情

✅ 总结

Gateway API 是 Ingress 的进化版,提供了更清晰的抽象和更强大的协议支持。

例如有以下特性:

  • 支持多协议、多租户、细粒度路由和统一标准化接口。
  • 可以替代 Ingress,实现更灵活的服务治理和灰度发布策略。
  • 与 Kubernetes 原生 API 无缝集成,适合云原生场景和多集群部署。

Gateway API 同时也是官方推荐的新一代流量入口管理,对于老的 Ingress 管理项目可以逐渐进行迁移了。