Kong的由來
- Nginx是模塊化設計的反向代理軟件,C語言開發。
- Lua是一個小巧的腳本語言,C語言開發,Lua腳本可以容易的被C/C++代碼調用,也可以反過來調用C/C++的函數。
- 通過lua-nginx-module模塊將luaJIT解釋器集成進Nginx,使得Nginx可以執行Lua腳本,靈活但不宜用。
- OpenResty是一個基於Nginx與Lua的高性能Web平臺,其中內部集成了大量精良的Lua庫,第三方模塊以及大多數的依賴項。用於方便地搭建能夠處理超高併發,擴展性極高的動態Web應用、Web服務和動態網關。
- 在Nginx上直接使用Lua開發難度比較大,OpenResty集成大量Lua庫,第三方模塊和所需的依賴項,這樣使用Lua開發功能變得更加容易。
- Kong是一個基於OpenResty開發的應用,可以認爲是一個Web Server,更進一步是一個API Gateway,具有API管理和請求代理的功能。
- 可以舉個例子:Nginx是OS,Lua是編程語言,OpenResty是開發平臺或者框架,Kong是一個OpenResty之上的應用。
Kong版本
Kong是由Kong Inc.開源的API網關項目,其在Github上有24.1K Star。
Kong版本,0.10.0(2017-03-07) – 1.4.0(2019-10-24) 一共發佈29個版本,其中1個x版本,10個y版本,18個z版本。
Kong有社區版本Kong Gateway,收費版本Kong Enterprise。Kong網關本身是開源免費的,Kong Enterprise主要在Kong的管理工具、開發工具,企業級插件方面。
Kong特性
- 雲原生(Cloud-Native):Kong可以在Kubernetes或裸機上運行;
- 動態負載平衡(Dynamic Load Balancing):跨多個上游服務的負載平衡業務。
- 基於哈希的負載平衡(Hash-based Load Balancing):一致的散列/會話親和的負載平衡。
- 斷路器(Circuit-Breaker):智能跟蹤不健康的上游服務。
- 健康檢查(Health Checks):主動和被動監控您的上游服務。
- 服務發現(Service Discovery):解決如Consul等第三方DNS解析器的SRV記錄。
- 無服務器(Serverless):從Kong中直接調用和保證AWS或OpenWhisk函數安全。
- WebSockets:通過WebSockets與上游服務進行通信。
- OAuth2.0:輕鬆的向API中添加OAuth2.0認證。
- 日誌記錄(Logging):通過HTTP、TCP、UDP記錄請求或者相應的日誌,存儲在磁盤中。
- 安全(Security):ACL,Bot檢測,IPs白名單/黑名單等。
- 系統日誌(Syslog):記錄信息到系統日誌。
- SSL:爲基礎服務或API設置特定的SSL證書。
- 監視(Monitoring):能夠實時對關鍵負載和性能指標進行監控。
- 轉發代理(Forward Proxy):使端口連接到中間透明的HTTP代理。
- 認證(Authentications):支持HMAC,JWT和BASIC方式進行認證等等。
- 速率限制(Rate-limiting):基於多個變量的阻塞和節流請求。
- 轉換(Transformations):添加、刪除或操作HTTP請求和響應。
- 緩存(Caching):在代理層進行緩存和服務響應。
- 命令行工具(CLI):能夠通過命令行控制Kong的集羣。
- REST API:可以通過REST API靈活的操作Kong。
- GEO複製:在不同的區域,配置總是最新的。
- 故障檢測與恢復(Failure Detection & Recovery):如果Cassandra節點失效,Kong並不會受影響。
- 羣集(Clustering):所有的Kong節點會自動加入羣集,並更新各個節點上的配置。
- 可擴展性(Scalability):通過添加節點,實現水平縮放。
- 性能(Performance):通過縮放和使用Nigix,Kong能夠輕鬆處理負載。
- 插件(Plugins):基於插件的可擴展體系結構,能夠方便的向Kong和API添加功能。
Kong部署場景
場景 | OS | Docker | Kubernetes |
---|---|---|---|
DB-less無數據庫 | Declarative Config | Declarative Config | Declarative Config Ingress Controller (Kubernetes下推薦無數據庫方式) |
PostgreSQL | 管理API | 管理API | Ingress Controller 管理API |
Cassandra | 管理API | 管理API | 不推薦 |
Kong以前只支持數據庫方式,配置數據(路由規則,Service等)存放在數據庫中,Kong各節點從數據庫中同步配置數據以保持配置數據一致性。從1.1.0版本開始,Kong開始支持無數據方式,無數據庫方式的配置數據存放在聲明式配置文件中,Kong各個節點完全獨立。
Kong有三種配置管理方式:
- 管理API方式:Kong的標準管理方式,Kong的配置數據都是通過調用Kong提供的Rest API進行管理,最終配置都存放在數據庫中,Kong集羣實例從數據庫讀取配置。
- 聲明式配置文件Declarative Config:在無數據庫方式下,Kong提供一種聲明式配置文件,配置數據在文件中聲明,然後通過文件或者Rest API的方式一次性加載到Kong中。
- Ingress Controller:Kong在Kubernetes下支持Ingress Controller,Kong還定義了多個自定義資源CRDs,配置數據通過這些CRDs進行配置。
以下爲Kong的部署架構。