目录
一、为什么需要 Gateway?先搞懂 “流量入口” 的进化史
二、Gateway API 核心组件:理清 “谁在做什么”
1. GatewayClass:网关的 “模板”
2. Gateway:实际的 “流量入口”
3. Route:流量的 “导航规则”
三、Gateway 实战:从部署到访问
1. 部署 Nginx Gateway Fabric
2. 创建 GatewayClass 和 Gateway
3. 部署后端服务和 HTTPRoute
4. 测试访问
四、Gateway 的进阶特性:不止于 “转发”
1. HTTPS 终止(SSL/TLS)
2. 流量灰度(权重路由)
3. 跨命名空间路由
4. 健康检查与重试
五、总结:Gateway 为什么是未来?
在 Kuber***es(简称 K8s)生态中,“如何让外部流量安全、高效地访问集群内服务” 一直是核心需求之一。从早期的 Service、Ingress 到如今的 Gateway API,K8s 在流量管理领域不断进化,而Gateway作为新一代流量入口标准,凭借其灵活性、扩展性和标准化特性,逐渐成为企业级 K8s 集群的首选方案。今天我们就从概念入手,拆解 Gateway 的核心能力,再通过实战案例带你掌握其落地方法。
一、为什么需要 Gateway?先搞懂 “流量入口” 的进化史
在聊 Gateway 之前,我们得先明白:K8s 为什么要推出 Gateway?它解决了之前方案的哪些痛点?
早期 K8s 中,服务暴露主要依赖Service:ClusterIP 用于集群内通信,NodePort 通过节点端口暴露服务,LoadBalancer 则依赖云厂商的负载均衡器。但这些方案存在明显局限 —— 比如 NodePort 端口管理混乱、LoadBalancer 成本高且仅支持四层负载;而 Ingress 作为 “七层流量入口”,虽然实现了域名路由、SSL 终止等功能,但又面临新问题:
- 功能固化:Ingress 仅支持 HTTP/HTTPS 路由,无法满足 TCP/UDP、gRPC 等非 HTTP 协议的需求;
- 扩展性差:不同 Ingress 控制器(如 Nginx Ingress、Traefik)自定义配置差异大,缺乏统一标准,跨控制器迁移成本高;
- 权限割裂:Ingress 资源将 “路由规则” 和 “负载均衡器配置” 绑定在一起,运维团队(管负载均衡)和开发团队(管路由)无法分工协作。
为解决这些问题,K8s 社区推出了Gateway API(当前已进入 GA 阶段,即稳定版),而 Gateway 就是 Gateway API 体系中的核心资源之一。它的核心设计理念是 “分离关注点”:将 “流量入口基础设施”(如负载均衡器、网关实例)和 “路由规则” 拆分开,同时支持多协议、多团队协作,彻底打破了 Ingress 的局限性。
二、Gateway API 核心组件:理清 “谁在做什么”
Gateway API 不是单一资源,而是一套 “资源组合”,核心包括GatewayClass、Gateway和Route三类资源,三者分工明确,共同实现流量管理。
1. GatewayClass:网关的 “模板”
GatewayClass 是 “集群级” 资源,相当于网关的 “模板定义”,它指定了当前网关使用的 “控制器实现”(比如 Nginx Gateway Fabric、Traefik Gateway、Istio Gateway 等),以及该类网关的通用配置(如负载均衡器类型、资源限制)。
简单来说:一个 GatewayClass 对应一种 “网关产品”,比如 “nginx-gateway-class” 对应 Nginx Gateway Fabric 控制器,“traefik-gateway-class” 对应 Traefik 控制器。集群中可以有多个 GatewayClass,供不同业务场景选择。
示例:定义一个基于 Nginx Gateway Fabric 的 GatewayClass
apiVersion: gateway.***working.k8s.io/v1
kind: GatewayClass
metadata:
name: nginx-gateway-class # GatewayClass的名称,后续Gateway会引用它
spec:
controllerName: nginx.org/gateway-controller # 对应的控制器标识
parametersRef: # 可选,指定该类网关的通用参数(如负载均衡器配置)
apiGroup: k8s.gateway.nginx.org
kind: GatewayClassParameters
name: nginx-gateway-params
2. Gateway:实际的 “流量入口”
Gateway 是 “命名空间级” 资源,它基于 GatewayClass 创建,代表一个 “实际运行的网关实例”—— 比如云厂商的负载均衡器、集群内的 NginxPod 集群。Gateway 的核心作用是 “暴露流量入口”,比如绑定公网 IP、监听特定端口(如 80、443),并定义该入口支持的协议(HTTP、HTTPS、TCP 等)。
举个例子:创建一个监听 80 端口(HTTP)的 Gateway,使用上面定义的 “nginx-gateway-class” 模板
apiVersion: gateway.***working.k8s.io/v1
kind: Gateway
metadata:
name: demo-gateway
namespace: default # Gateway属于特定命名空间