上班日又到來了,前一天的實踐完成了初步使用Kong API Gateway 來進行中介層的認證實踐,接著今天的任務要了解Kong API Gateway 的各種佈署模式。Kong API Gateway 的三種主要部署模式是 Classic (Database)、Hybrid 和 DB-less。
筆者的企業中有購買Kong API Gateway Enterprise Edition,當時也為了適應公司特性,選擇了Hybrid mode作為佈署方式。多年來在各種彈性使用的場景中,深刻的認知到這是一個非常優秀的產品。
先從各種佈署模式來討論:
這種經典模式在企業中非常常見,是將所有 Kong 節點直接連接到同一套資料庫(PostgreSQL),所有設定都儲存在資料庫中,節點從 DB 讀取與更新設定。
註:過去的Kong 還支援Cassandra 分散式資料庫,但從Kong Gateway 3.4 版本就開始終止支援。主因應該是支援過多後端儲存方式過於複雜,且現有各種模式已經可以應對複雜而多變須同步設定的環境,因此現在資料庫應該僅支援PostgreSQL。
參考連結:Why We’re Deprecating Cassandra Support
優點
缺點
圖5-1 Classic mode(資料庫)
混合模式,也稱為控制平面/資料平面分離(CP / DP),是一種部署模型,它將叢集中的所有 Kong Gateway 節點分割為以下兩個角色之一:
在混合模式下,資料庫只需要存在於控制平面節點(CP)上。每個 DP 節點都連接到一個 CP 節點,並且只有 CP 節點直接連接到資料庫。 DP 節點並非直接存取資料庫內容,而是與 CP 節點保持連線以接收最新設定參數。
這種混和模式優點非常多,列舉一些如下:
這種模式優點非常的多,唯一需要考量的是,有一些Plugin 會因為需要將變更直接與資料庫互動,例如OAuth 2.0 Authentication。其他筆者則認為優點大於其限制,非常推薦這種佈署方式。
特別是企業中可能存在各種不同的佈署營運環境,從實體機到容器平台,地端到雲端,都可以透過Data Plane 可以廣泛支援各種平台而成為最彈性的選擇。
混和模式其他參考資料:Kong Hybrid mode
圖5-2 Hybrid Mode
這次系列文主軸就是使用這種DB-Less mode,其實在混和模式的Data Plane節點,就是DB-Less mode的佈署方式。但與混和模式的Data Plane需要與Control Plane 同步設定資料的不同之處,純粹的DB-Less mode則是將相關設定檔案,以宣告式(declarative)的方式將所有設定寫入在Kong 節點中。
DB-Less mode可以降低複雜性並建立更靈活的部署模式。在這種模式下,已配置的實體(例如路由、服務和插件)會儲存在節點的記憶體中。在無資料庫模式下運作時,將使用第二個檔案向 Kong Gateway 提供設定。該檔案包含使用 Kong Gateway 宣告式(declarative)設定語法以 YAML 或 JSON 格式呈現的設定。
DB-Less mode和宣告式(declarative)設定的結合有許多好處:
此模式有一些限制:
圖5-3 DB-Less Mode
其實筆者在多年前,為組織規劃了使用混和模式(Hybrid mode),當時的場景是需要協助多個子公司進行閘道(Data Plane / API Gateway)的佈署,控制中心則由筆者所屬的公司代為維運。
這種架構設計方式的優點,在於各子公司對於維運能力要求的不同,例如有些子公司需要7* 24維運要求,機房對於網路設備以即可恢復程度也投入較高成本。而筆者所在的公司則僅有5* 8 的維運要求,在這種狀況下,子公司所持有的Data Plane如果在遇到與Control Plane 之間的網路異常問題,也可以暫時持續提供API 服務給消費者。
而且Data Plane 可以彈性被佈署到不同的環境中,不論是實體主機或是VMWare,支援多種Linux版本。另外更相容於容器化平台,可以使用單體docker 或是支援K8S平台。這種彈性更讓筆者在過去數年可以協助不同的子公司完成各式各樣的任務。
而為何本次系列文會以DB-Less作為範例來介紹,其實這跟曾經發生過的災難有關。前面有提到,子公司的Data Plane可以靈活被佈署到各種不同的環境進行服務。而且初始設計下,即使Data Plane 結點被重開機,也可以維持前次取得的設定值,持續提供服務。
但三年前曾經發生過,子公司是將Data Plane佈署在Open Shift 平台,以容器的形式存在。在網路一切通暢的狀況下,Data Plane 初始啟動時,會連線到Control Plane 上面將設定值同步回去開始提供服務,這不成問題。
然而,災難就是會發生在各種因素的綜合之下所導致,子公司當時希望升級Open Shift到另一個cluster中。但由於該平台的網路設定錯誤(應該是Egress),導致Data Plane 與Control Plane的設定都無法同步。
容器化服務的初始化與一般作業系統不同,會從一個完全乾淨的容器開始,在無法同步設定檔的狀況下,表示服務無法使用。
當天雖然經歷過混亂,但也在當時接觸到DB-Less mode可以快速先協助緩解與排錯的優勢,才讓筆者突然意識到這種模式的優點。
過去三年,筆者在DevOps 領域打滾了許久,除了體會到要將程式碼進行版本控管的重要性以外,對於Infrasture as Code(IaC)也認為應該將相關設定納入版本控管倉之中。
這種DB-Less mode正是將設定檔給宣告出來,進而讓結點得以參考提供服務,這正符合了IaC的要求與精神。
筆者認為,這種模式搭配CI/CD,可以佈署到各式各樣不同的容器化世界中,並可以搭配金絲雀或是藍綠佈署,達到各節點變更管理的彈性與高可用性。
加上這種模式對於讀者來說,可以直接運行於Docker Desktop,搭配docker compose的佈署示範,可以免去讀者在學習時,還需要安裝資料庫的麻煩。
因此,本系列文將全部都以DB-Less mode作為後續的示範,希望各位讀者能夠有所得與相關啟發。
好啦,本日結束,明天再戰。