APISIX 是一個雲原生 API 閘道器,底層基於 Nginx/OpenResty + Lua,由 Apache 軟體基金會維護。它透過 Admin API 管理 Route、Upstream、SSL、Consumer 等設定資源,官方稱這些設定跟 Plugin 的更新 「不需要重啟」(Hot Updates And Hot Plugins)。功能上涵蓋動態路由、負載均衡、限流熔斷、身分驗證,支援多種插件。在 K8s 場景下也有對應的 Ingress Controller。
在我們的架構裡,APISIX 扮演的角色是 HTTP requests 分流。所有進入 demo-app 的請求,都會先經過 APISIX,再由它根據路由規則決定把流量導向 Stable 版本(v1)還是 Canary 版本(v2)。
APISIX 的部署包含兩個組件:
| 組件 | 職責 |
|---|---|
| Data Plane(Gateway) | 實際轉發流量,根據記憶體中的路由表做決策 |
| Ingress Controller | 監聽 K8s 的 ApisixRoute CRD,將其轉換為 Etcd 中的路由規則 |
兩者協作的方式是:Ingress Controller 把宣告式的路由規則寫進 Etcd,Data Plane 透過 Watch 機制即時取得更新。如果只部署 Data Plane 而沒有啟用 Ingress Controller,Day 04 宣告的 ApisixRoute 不會生效。
這 3 個工具都能分流 request。選擇 APISIX 主要的原因是:
本專案使用的 GCP Load Balancer 是 layer 4,不會去解析 HTTP;APISIX 收到封包後,它會解析 HTTP request 來決定路由,並且把 request 傳送到路由的 backend。
Node-IP:NodePort。這個 Node 的 kube-proxy 攔下這個封包,查自己維護的 Service Endpoints 清單(也就是這個 Service 底下目前所有健康的 Pod IP),挑一個,做 DNAT:把目的地從 Node-IP:NodePort 改寫成 Pod-IP:ContainerPort,再送進那個 Pod。externalTrafficPolicy: Local 犧牲跨 Node 轉發能力去換保留真實來源 IP)。封包送到 APISIX Pod 監聽的 Port(例如 9080)時,才第一次被解析成 HTTP——APISIX 的 Worker 開始看 Method、Path、Header、Cookie,比對 Etcd 裡同步好的 ApisixRoute 規則,呼叫 opa plugin(Day08 內容) 問 OPA 該不該走金絲雀,再由 traffic-split plugin(Day09 內容)決定實際打去哪個 upstream。
這個專案的 APISIX 是用 git commit 觸發部署:把設定檔推進 Config Repo,ArgoCD 偵測到變更後自動同步、幫你執行 helm install。
需要的檔案,全部放在 config 這個 repo:
| 檔案 | 路徑 | 內容 |
|---|---|---|
| AppProject 更新 | manifests/argocd-apps/appproject.yaml |
把 APISIX 的 Helm Repo(https://charts.apiseven.com)加進白名單,不加的話 ArgoCD 會拒絕同步 |
| APISIX Helm Values | manifests/infrastructure/apisix/values.yaml |
APISIX 實際的設定(副本數、怎麼連 Etcd、開哪些 plugin) |
| APISIX ArgoCD Application | manifests/argocd-apps/apisix-app.yaml |
告訴 ArgoCD 要監控哪個 Helm Chart、套用哪份 values 檔 |
replicaCount: 3,但為了省錢,把 podAntiAffinityPreset 從正式環境該用的 hard 降成 soft,3 個 Etcd Pod 並沒有強置分散在 3 個 node 裡,在實驗初期可以開一個 work node 就足夠。APISIX 官方 README「Full Dynamic」章節,apache/apisix README
APISIX 官方 Admin API 文件,列出 Route、Service、Upstream、SSL、Consumer 等可透過 API 管理的資源類型——Admin API