從「Quick Start」到目前為止,並沒有區分「資料平面(Data Plane)」和「控制平面(Control Plane)」。所建立的APISIX服務節點:都同時提供處理請求路由的能力外,也接受Admin API更新設定。這種運作模式下稱作「傳統模式(Traditional)」。至版本3.13
為止,APISIX有三種運作模式和一個實驗性模式。
模式 | 角色 | 配置中心 | 設定來源 | 管理方式 | 適用情境 | |
---|---|---|---|---|---|---|
1 | 傳統模式 (Traditional) | 資料平面 + 控制平面 | etcd | Admin API | Admin API | 處理使用者請求與管理配置都在同一實例上。 |
2 | 解耦模式 (Decoupled) | 資料平面 / 控制平面 | etcd | Admin API | Admin API | 將資料處理與配置管理分開,適合大型部署或高可用性需求。 |
3 | 獨立模式:檔案驅動 (File-driven) | 資料平面 | 無 | 本地 YAML / JSON 檔案 | 本地檔案更新 | 不需要 etcd,配置從本地檔案加載並熱更新,適合 Kubernetes 或 CI/CD 自動化部署。 |
4 | 獨立模式:API 驅動 (API-driven) | 傳統 | 無 | 記憶體 | Standalone Admin API | 實驗性功能,配置完全透過 API 進行,即時更新並儲存在記憶體中,不依賴任何檔案或外部配置中心。 |
(以上表格由AI協助整理)
傳統模式下,apisix_config/config.yaml
實際包含這樣的預設設定:
deployment: # Deployment configurations
role: traditional # Set deployment mode: traditional, control_plane, or data_plane.
role_traditional:
config_provider: etcd # Set the configuration center.
其中deployment.role
申明了使用traditional
(傳統)作爲部署運作方式,並且deployment.role_traditional.config_provider
指定了etcd
作爲設定提供者。實際上ETCD是一個分散式鍵值對資料庫,並且如果將其視作傳統資料庫,整個架構就像是傳統軟體架構:AP+Database。
類似無狀態但依賴資料庫的應用服務,如果直接變更資料庫內容,下次處理請求的結果也會有所不同。實際上Dashboard Web UI就是直接變更ETCD群集儲存的內容,間接反應回服務節點。且不同的是,APISIX並非完全無狀態應用服務,他會保留一份副本在記憶體,並訂閱ETCD群集好取得變更。
APISIX部署方式也可以將「資料平面」和「控制平面」拆分開來,這個模式下ETCD仍是兩個平面溝通的橋樑。「資料平面」專注在處理請求,並且可以依需求使用量做節點縮放;這種模式下,「控制平面」並不需要隨者資料平面共同縮放,可控的數量也讓Admin API的存取控制可以更容易管理。同樣地,Dashboard服務本身雖然不提供Admin API,但依然可以做到更新設定的效果。
不同於傳統模式,deployment.role
申明了節點作為data_plane
(資料平面)提供服務。所以在apisix.enable_admin
的設定也會失效(預設為true
)。
deployment:
role: data_plane
role_data_plane:
config_provider: etcd
#END
相同的,也可以將節點調整成control_plane
(控制平面)提供服務。相對來說該節點不提供處理請求。
deployment:
role: control_plane
role_control_plane:
config_provider: etcd
#END
想想看: 設定提供者是同一組ETCD群集情況下,能不能有些節點是「資料平面」,有些是「控制平面」,還有一些是兩者兼具的「傳統」節點?
ETCD的部署,對於不熟悉的人會是個麻煩。APISIX也可以讀取YAML或JSON檔案設定的方式部署。預設情況每秒會檢查一次檔案的變更,在一些可邏輯共用檔案的環境,如Kubernetes,同樣可以做到變更一次檔案,應用到所有節點的效果。這種部署方式,也很像是調整Nginx的設定,但我認為APISIX的設定使用YAML或JSON,因此更簡單容易上手。
deployment:
role: data_plane
role_data_plane:
config_provider: yaml # or json
這個模式下,會需要使用另一組管理API,並且設定會直接儲存在記憶體,這意味著斷電遺失資料的風險存在。並且可能無法一次對所有資料平面的服務節點一起進行設定更新的調整。
要使用該實驗性質模式,deployment.role
同樣設定為traditional
。不同的是資料提供者改成yaml
。但注意,該模式可能會忽略apisix.yaml
檔案,提供一個空檔案即可。如果要更新設定,需要透過/apisix/admin/configs
進行「完整」更新。
deployment:
role: traditional
role_traditional:
config_provider: yaml