CKA [Networking] – Gateway API的使用
以下的ingress流程是我们让用户从外部导入流量,但是ingress只能导入HTTP或HTTPS

如果你想从外部导入TCP / UDP / GRPC 等等其他的流量协议的话,那么就必须使用Gateway API了。Gateway API支持L4和L7的协议。
Gateway是ingress的继任者,以下的连接是ingress所没有的功能,比如http header modification, http request mirroring, grpc routing 等等。
Gateway有什么而外的功能:https://gateway-api.sigs.k8s.io/guides
以下的官方文档有写为什么需要从ingress迁移到使用gateway api
https://gateway-api.sigs.k8s.io/guides/migrating-from-ingress
如果要使用ingress就必须安装ingress controller 比如 nginx ingress controller 否则ingress无法使用,那么使用gateway也是一样的道理,想要使用gateway就必须安装gateway controller, 如果istio 或 nginx,以下的连接可以查看。
Gateway Controller List: https://gateway-api.sigs.k8s.io/implementations

从 Client 发起请求到 Pod 响应的完整流程示意:
Client
↓ 1. DNS 解析
External LoadBalancer (或 NodePort)
↓ 2. 单一 IP/端口
Gateway (CR) —— Listener(端口、协议)
↓ 3. HTTP/Host/Path 匹配
HTTPRoute (CR) —— Route Rules
↓ 4. backendRefs 指向 K8s Service
Service
↓ 5. ClusterIP + Endpoints
Endpoints —— Pod
↓ 6. 真实 Pod
Gateway API也能控制多少%的流量到不同的pod,以便进行canary deployment

根据下图,Gateway API 包含了GatewayClass , Gateway 和 Route

Gateway的架构讲解

GatewayClass讲解
Gateway可以用于不同的Gateway Controller, 通常都是创建GatewayClass来绑定不同的GatewayController
以下创建的nginx GatewayClass就是绑定了nginx-gateway-controller

Gateway讲解
Gateway就是等于外部的流量入口的infra,监听哪个port,指定使用了哪个GatewayClass。
在Gateway也能定义hostname 也就是domain,如果没有定义hostname的话,就是接受全部流量的意思。

Route讲解
在httproute可以定于哪个path导流到哪个service, 根据下图是把流量导去后端的port 80, 并且使用了nginx的gateway
其实Route层不只是有HTTPRoute, 而且还有TLSRoute , TCPRoute , UDPRoute , GRPCRoute


Gateway多个组件之间的关系
- 集群管理员创建 GatewayClass(网关类)
- 这个
GatewayClass
会指向一个特定的Gateway Controller
(比如 Istio、NGINX、GKE Gateway Controller 等) - 它定义了“使用哪个控制器来实现这个类的网关行为”
- 这个
- 开发团队(用户)创建 Gateway(网关)资源
- 这个
Gateway
会引用前面创建的GatewayClass
- 表示“我要用这种类型的网关”
- 可以定义监听端口、协议、证书等信息(如监听
443/HTTPS
)
- 这个
- Gateway Controller 会监听这些资源并实现网络配置
- 控制器看到有新的
Gateway
后,会创建实际的负载均衡器或配置入口流量的资源(比如 Cloud Load Balancer、Envoy 配置等)
- 控制器看到有新的
- 最后,定义路由(如 HTTPRoute)来附加到 Gateway 上
- 这些路由资源定义“流量如何从 Gateway 转发到具体的服务”
- 比如:
/api
的流量转发到 service A/login
的流量转发到 service B

Gateway和httproute都能set hostname?
是的,这两个都能set hostname,只是gateway 是流量的入口, httproute是流量的分发,下面的set hostname的example
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: my-gateway
spec:
gatewayClassName: istio
listeners:
- name: https
protocol: HTTPS
port: 443
hostname: "example.com" # ← 监听的域名
tls:
mode: SIMPLE
certificateRefs:
- name: example-cert
kind: Secret
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: my-route
spec:
parentRefs:
- name: my-gateway
hostnames:
- "example.com" # ← 匹配请求中的 Host header
rules:
- matches:
- path:
type: PathPrefix
value: /app
backendRefs:
- name: my-service
port: 8080