Kubernetes Gateway API


Gateway API 的官网,官方文档, 应用场景

官网: https://gateway-api.sigs.k8s.io/

官方文档: https://gateway-api.sigs.k8s.io/guides/

应用场景:

精细化流量管理:实现基于请求头、路径、权重的流量切分,支持蓝绿、金丝雀发布等高级策略


Gateway API 与 Traefik 、istio 、higress 的关系

Gateway API 是 K8S 官方定制的一套接口标准和规范,它本身并不处理规范,只是定义了 GatewayClassGatewayHTTPRoute 等资源对象

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

成功!

上一篇
下一篇