跳到主要内容
Shell / Bash
Kubernetes Gateway API 实战指南:从原理到部署 综述由AI生成 Gateway API 是 Kubernetes 官方推出的新一代服务网络标准,相比 Ingress 提供更强大的路由能力、多团队支持和类型安全定义。详细阐述了 Gateway API 的核心概念,对比了其与 Ingress 的差异,并演示了基于 Envoy Gateway 和 MetalLB 的完整安装流程。内容涵盖 GatewayClass、Gateway、HTTPRoute 的配置方法,HTTPS 证书集成,以及跨命名空间路由中的 ReferenceGrant 授权机制,帮助开发者快速掌握现代 Kubernetes 网络管理实践。
Stephaine Walsh 发布于 2026/3/17 更新于 2026/4/26 3 浏览Kubernetes Gateway API 实战指南:从原理到部署
随着 Kubernetes 集群规模扩大,传统 Ingress API 在复杂路由和多团队协作上逐渐显露局限。Gateway API 作为官方新一代服务网络标准,提供了更灵活的路由能力、类型安全的定义以及标准化的扩展机制。本文将深入其核心概念,对比其与 Ingress 的差异,并通过实际配置演示如何快速上手。
一、什么是 Gateway API?
1.1 概述
Gateway API 旨在替代和扩展传统的 Ingress API。它通过分层设计实现了更精细的流量管理,支持多团队协作,并具备更强的扩展性。
1.2 核心特性
层次化设计 :利用 GatewayClass、Gateway、Route 等资源实现分层管理。
丰富的路由能力 :支持基于路径、方法、头部、查询参数的精细化路由。
多团队支持 :内置所有权模型和 RBAC 集成。
类型安全 :强类型的 API 定义,减少配置错误。
协议支持 :不仅限于 HTTP/HTTPS,还支持 TCP、UDP 等。
二、Gateway API 与 Ingress 的对比
特性 Ingress Gateway API API 版本 v1 v1 (稳定版) 路由能力 基础路径和主机路由 支持路径、方法、头部、查询参数等 多团队支持 有限,需额外配置 内置 RBAC 和所有权模型 扩展性 依赖注解,非标准 标准扩展机制 流量类型 主要 HTTP/HTTPS HTTP/HTTPS, TCP, UDP 等 策略管理 分散 集中定义和复用
注意:Envoy Gateway 依赖于 Envoy Proxy 和 Gateway API,不同版本的兼容性需仔细核对官方文档。
三、安装 Gateway API
3.1 前提条件
Kubernetes 集群(推荐 1.24+)
kubectl 命令行工具
支持 Gateway API 的控制器(如 Contour、Istio、NGINX 或 Envoy Gateway)
负载均衡环境(裸机测试建议安装 MetalLB)
3.2 控制器选择
不同的控制器实现方式略有差异:
Cilium Gateway :支持主机网络模式,可直接暴露端口,无需 LoadBalancer。
Istio :自动创建 Envoy Deployment 和 Service。
Contour :基于 Envoy,适合本地环境。本教程以 Envoy Gateway 为例,Gateway API 允许同时安装多个控制器。
3.3 安装 CRDs 执行以下命令安装最新稳定版 Gateway API CRDs:
kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml
kubectl get crd | grep networking.k8s.io
kubectl get crd gateways.gateway.networking.k8s.io httproutes.gateway.networking.k8s.io gatewayclasses.gateway.networking.k8s.io
3.4 安装 Envoy Gateway 控制器 helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.7.0 -n envoy-gateway-system --create-namespace
kubectl wait --timeout =5m -n envoy-gateway-system deployment/envoy-gateway --for =condition=Available
3.5 安装 MetalLB(用于裸机测试) 若测试环境无 LB 地址,需安装 MetalLB 模拟负载均衡。
修改 kube-proxy 配置 apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
systemctl restart kube-proxy.service
kubectl patch daemonset kube-proxy -n kube-system -p='{"spec":{"template":{"metadata":{"annotations":{"date":"$(date +' %s')"}}}}}'
部署 MetalLB kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.15.3/config/manifests/metallb-native.yaml
配置 IP 池 创建 metallb-config.yaml 并应用:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: public-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168 .1 .100 /32
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: public-ip-advertisement
namespace: metallb-system
spec:
ipAddressPools:
- public-ip-pool
四、使用 Gateway API
4.1 基本概念
GatewayClass :定义网关类型模板(类似 StorageClass)。
Gateway :实际的网关实例,管理流量入口。
HTTPRoute :定义 HTTP/HTTPS 流量的路由规则。
TCPRoute/UDPRoute :定义 TCP/UDP 流量的路由规则。
4.2 示例:创建基本的 HTTP 路由
1. 创建 GatewayClass apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
2. 创建 Gateway apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: eg
namespace: demo01
spec:
gatewayClassName: eg
addresses:
- type: IPAddress
value: 192.168 .1 .100
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
3. 创建后端应用 准备一个简单的 Service 和 Deployment。
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: demo01
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: demo01
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- image: gcr.io/k8s-staging-gateway-api/echo-basic:v20231214-v1.0.0-140-gf544a46e
name: backend
ports:
- containerPort: 3000
4. 创建 HTTPRoute apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: backend
namespace: demo01
spec:
parentRefs:
- name: eg
namespace: demo01
hostnames:
- "gateway.demo.cn"
rules:
- backendRefs:
- name: backend
port: 3000
matches:
- path:
type: PathPrefix
value: /
配置完成后,将域名解析指向 Gateway 的 IP 即可访问。
4.3 配置 HTTPS 访问 启用 HTTPS 需要证书 Secret 和 TLS 配置。
1. 创建 Secret kubectl create secret tls example-cert \
--cert=example.com.crt \
--key=example.com.key \
-n envoy-gateway-system
2. 配置 Gateway Listener apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: envoy-gateway-system
spec:
gatewayClassName: envoy-gateway
listeners:
- name: https
protocol: HTTPS
port: 443
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: example-cert
allowedRoutes:
namespaces:
from: All
五、跨命名空间配置 生产环境中,通常由基础设施团队维护共享 Gateway,业务方通过 HTTPRoute 引用。
5.1 允许跨 Namespace 绑定 在 Gateway 中设置 allowedRoutes.namespaces.from: All。
5.2 ReferenceGrant 授权 如果 HTTPRoute 需要引用其他命名空间的 Service 或 Secret,必须在该目标命名空间创建 ReferenceGrant。
例如,demo01 的 Route 引用 demo02 的 Service:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-frontend-to-backend
namespace: demo02
spec:
from:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespace: demo01
to:
- group: ""
kind: Service
同 Namespace 引用默认允许,无需 Grant。
跨 Namespace 引用 Service/Secret 必须显式授权。
Route 附加到不同 Namespace 的 Gateway 需 Gateway 端 allowedRoutes 允许。
六、总结 Gateway API 通过层次化设计和标准化扩展,解决了 Ingress 在多团队协作和复杂路由上的不足。掌握其核心组件(GatewayClass, Gateway, HTTPRoute)及跨命名空间的安全机制(ReferenceGrant),是构建现代化 Kubernetes 网络的关键。本文涵盖了从安装、配置到 HTTPS 及跨域调用的完整流程,可作为日常运维的参考手册。
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online