在雲原生應用迭代過程中,金絲雀發佈(Canary Release)是保障發佈穩定性的關鍵策略——通過將少量流量引流至新版本服務,驗證無異常後再逐步擴大流量佔比,可有效降低新版本上線風險。傳統 Kubernetes Ingress 需依賴廠商自定義註解實現金絲雀發佈,存在兼容性差、配置複雜等問題。

而 Kubernetes 官方 Gateway API 憑藉標準化的 HTTPRoute 資源與權重分發能力,原生支持金絲雀發佈場景,且配置更直觀、權限更可控。本文將基於 Gateway API 官方 HTTP 路由指南,結合 Azure Kubernetes Service (AKS) 環境,帶大家從零實現企業級金絲雀發佈方案。

核心原理:Gateway API 如何支撐金絲雀發佈?

Gateway API 通過 HTTPRoute 資源的backendRefs 字段實現流量權重分配,核心邏輯如下:

  1. 多後端關聯:在同一條HTTPRoute 規則中,同時關聯“穩定版服務”和“金絲雀版服務”兩個後端;
  2. 權重精準配置:通過 weight 字段為每個後端分配流量佔比(權重總和建議為100,便於直觀管控);
  3. 標準化兼容:權重配置為 Gateway API 標準字段,無需依賴廠商註解,適配 NGINX、Traefik 等主流網關控制器;
  4. 角色分離管控:運維團隊負責 Gateway 網關實例部署,開發團隊僅需通過 HTTPRoute 配置流量規則,符合企業級多團隊協作規範。

本文將基於 NGINX Gateway Fabric 控制器(AKS 環境適配性最優的開源網關控制器之一),實現“90%流量到穩定版v1,10%流量到金絲雀版v2”的基礎場景,再擴展至全量灰度迭代流程。

前置準備:已部署 Gateway API 基礎環境

實現金絲雀發佈前,需確保 AKS 集羣已完成 Gateway API 基礎環境部署(若已部署可跳過,未部署可參考前文),關鍵檢查項如下:

  1. AKS 集羣版本 ≥ 1.24(Gateway API Beta 版本最低要求),已啓用 RBAC;
  2. 已安裝 Gateway API CRDs(gatewayclasses、gateways、httproutes 等);
  3. 已部署 NGINX Gateway Fabric 控制器,;
  4. 已創建 Gateway 資源,網關狀態為 Ready。

驗證基礎環境狀態:

# 驗證 Gateway API CRDs
kubectl get crds | grep gateway.networking.k8s.io

# 驗證 NGINX 控制器狀態
kubectl get pods -n nginx-gateway

# 驗證 Gateway 狀態
kubectl get gateways.gateway.networking.k8s.io -n nginx-gateway

實戰步驟:實現金絲雀發佈全流程

步驟 1:部署穩定版(v1)和金絲雀版(v2)服務

創建兩個服務,一個Nginx(穩定版,返回 nginx頁面),一個httpd(金絲雀版,返回tomcat頁面)

創建 canary-services.yaml 文件:

# 穩定版 v1 - Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2 
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2 
        ports:
        - containerPort: 80 

---
# 穩定版 v1 - Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx 
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80 

---
# 金絲雀版 v2 - Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  type: ClusterIP 
  selector:
    app: httpd 
  ports:
  - protocol: TCP
    port: 80 
    targetPort: 80
    

應用配置並驗證:

kubectl apply -f canary-services.yaml

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Nginx

# 驗證兩個版本的 Pod 和 Service 狀態
kubectl get pods -n nginx-gateway
kubectl get svc -n nginx-gateway

輸出應顯示 Nginx 有 2 個 Running Pod,Httpd 有 1 個 Running Pod,兩個 Service 均正常暴露 80 端口。

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Nginx_02

步驟 2:創建 HTTPRoute 配置金絲雀流量規則

創建 canary-httproute.yaml 文件,通過匹配標頭“env=canary”將流量路由到金絲雀版本的服務。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: web-service-canary-route
spec:
  # 關聯已創建的 Gateway
  parentRefs:
  - name: example-gateway
  # 路由規則:匹配根路徑(/)的所有 HTTP 請求
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    hostnames:
  	- "canary.aiorg.ltd"
    - backendRefs:
    - matches:
      - headers:
        - type: Exact
          name: env
          value: canary
      backendRefs:
      - name: httpd-service
        port: 80
    - backendRefs:
      - name: nginx-service
        port: 80

應用配置並驗證:

kubectl apply -f canary-httproute.yaml

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Gateway API_03

kubectl apply -f canary-httproute.yaml

# 驗證 HTTPRoute 狀態(STATUS 為 Accepted 表示規則已被網關接納)
kubectl get httproutes.gateway.networking.k8s.io -n default
kubectl describe httproutes.gateway.networking.k8s.io echo-service-canary-route -n default

通過kubectl describe 查看事件,若顯示“Route accepted”,説明流量規則已成功應用到網關。

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Nginx_04


步驟 3:驗證金絲雀發佈效果

92 Echo Service v1 (Stable)
   8 Echo Service v2 (Canary)

驗證訪問穩定版-Nginx頁面,直接curl canary.aiorg.ltd,可以看到成功返回Nginx頁面:

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Gateway API_05

訪問金絲雀版-Httpd,使用curl -H命令 curl -H "env:canary" http://canary.aiorg.ltd ,返回Httpd頁面:

精準流量管控與平滑迭代 - AKS 中基於 Gateway API 實現金絲雀發佈實戰_Gateway API_06

對於 Azure 架構師而言,Gateway API 不僅是流量管理的升級方案,更是 AKS 集羣雲原生治理的重要組成部分。結合 Azure Monitor、Key Vault 等原生服務,可構建更穩定、安全、可觀測的企業級金絲雀發佈體系。