Gateway API 的官网,官方文档, 应用场景
官网: https://gateway-api.sigs.k8s.io/
官方文档: https://gateway-api.sigs.k8s.io/guides/
应用场景:
精细化流量管理:实现基于请求头、路径、权重的流量切分,支持蓝绿、金丝雀发布等高级策略
Gateway API 与 Traefik 、istio 、higress 的关系
Gateway API 是 K8S 官方定制的一套接口标准和规范,它本身并不处理规范,只是定义了 GatewayClass、Gateway、HTTPRoute 等资源对象
Traefik、istio、higress 是网关控制器的实现者,
Gateway API 的架构

Gateway API 安装、卸载
安装
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
卸载
kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
查看版本
kubectl get crd gateways.gateway.networking.k8s.io -o yaml | grep "gateway.networking.k8s.io/bundle-version:"
#result
#gateway.networking.k8s.io/bundle-version: v1.0.0
基于 Traefik 应用 Gateway API
修改 traefik-values.yaml 配置文件 ,新增
providers:
kubernetesCRD:
enabled: true
kubernetesIngress:
enabled: true
kubernetesGateway: # 新增这一行,启用 Gateway API Provider
enabled: true # 确保设置为 true
更新 traefik
helm upgrade traefik ./traefik-36.3.0.tgz -n traefik-system -f /kubernetes/add-ons/Trefik/traefik-values.yaml
在浏览器上看见,代表成功!

Gateway API 必知必会
1、Gateway API ,如何启用 ,我在crd上看到有,就代表它能用吗? 需要kubectl apply 它嘛?
kubectl get crd 上有代表已经有资源类型httproute、gateway等接口与规范,但还是需要一个控制器(traefik、istio) 来创建资源调用这些接口引用它。流量最终会根据规则转发到后端的service
2、Gateway API 的 CRD。是什么? K8S 中 CRD 又是什么?
K8s 中的 CRD (Custom Resource Definition):CRD 是 Kubernetes 提供的一种扩展机制 。它允许你向 Kubernetes 集群中添加全新的资源类型,就像 Pod、Deployment 这些内置资源一样。一旦你创建了一个 CRD,就可以通过 kubectl 来创建和管理这种新类型的对象 。例如,你创建了一个名为 nacosclusters.stable.example.com 的 CRD,之后就可以 kubectl get nacosclusters 。
Gateway API 的 CRD:Gateway API 项目正是利用 CRD 机制,将 GatewayClass、Gateway、HTTPRoute 等定义为 Kubernetes 集群中的新资源类型 。你可以通过 kubectl get crd | grep gateway.networking.k8s.io 命令查看它们是否已安装 。
3、GatewayClass , Gateway , HTTPRoute , TCPRoute 是什么、与适应场景

Gateway API 发布http
1、配置 gateway
cat my-gateway.yaml
# my-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-traefik-gateway
namespace: traefik-system # 部署在 Traefik 所在的命名空间
spec:
gatewayClassName: traefik # 引用 Traefik 的 GatewayClass
listeners:
- name: http
protocol: HTTP
port: 8000
allowedRoutes:
namespaces:
from: All # 允许所有命名空间的 HTTPRoute 绑定到此 Gateway
2、配置 HTTPRoute
cat httproutes-xiuxian.yaml
# HTTPRoute for v1.oldboyedu.com
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: xiuxian-v1-httproute
namespace: default # 你的应用服务所在的命名空间
spec:
parentRefs:
- name: my-traefik-gateway
namespace: traefik-system # Gateway 所在的命名空间
hostnames:
- "v1.oldboyedu.com"
rules:
- backendRefs:
- name: svc-xiuxian-v1
port: 80
---
# HTTPRoute for v2.oldboyedu.com
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: xiuxian-v2-httproute
namespace: default # 你的应用服务所在的命名空间
spec:
parentRefs:
- name: my-traefik-gateway
namespace: traefik-system
hostnames:
- "v2.oldboyedu.com"
rules:
- backendRefs:
- name: svc-xiuxian-v2
port: 80
---
# HTTPRoute for v3.oldboyedu.com
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: xiuxian-v3-httproute
namespace: default # 你的应用服务所在的命名空间
spec:
parentRefs:
- name: my-traefik-gateway
namespace: traefik-system
hostnames:
- "v3.oldboyedu.com"
rules:
- backendRefs:
- name: svc-xiuxian-v3
port: 80
Gateway API 灰度发布
# HTTPRoute for xiuxian.oldboyedu.com (金丝雀发布 90% v1, 10% v2)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: xiuxian-canary-httproute
namespace: default # 你的应用服务所在的命名空间
spec:
parentRefs:
- name: my-traefik-gateway
namespace: traefik-system
hostnames:
- "xiuxian.oldboyedu.com"
rules:
- backendRefs:
- name: svc-xiuxian-v1
port: 80
weight: 90 # 90% 流量到 v1
- name: svc-xiuxian-v2
port: 80
weight: 10 # 10% 流量到 v2
测试
for i in {1..100}; do curl -s http://xiuxian.oldboyedu.com:7777; done | grep -o "凡人修仙传 v[12]" | sort | uniq -c
90 凡人修仙传 v1
10 凡人修仙传 v2
成功!