Kong网关介绍[通俗易懂](玩转Kong网关)
傳統服務如下左圖,通用函數重復使用在多個服務中,系統龐大僵化難以管理,由于會沖擊其他服務導致的擴展困難,由于系統限制導致生產率低,如下右圖是kong的解決方案
kong特點:
云原生:平臺無關,kong可以在裸機和Kubernetes上運行。
動態負載平衡:跨多個上游服務的流量負載均衡。
基于哈希的負載平衡:具有一致的哈希和粘性會話。
斷路器:智能跟蹤不健康的上游服務。
健康檢查:主動和被動監控您的上游服務。
服務發現:解析第三方DNS解析程序(如Consul)中的SRV記錄。
Serverless:直接從kong調用AWS lambda或openswish函數。
WebSockets:通過WebSockets與上游服務通信。
OAuth2.0:輕松地向API添加OAuth2.0身份驗證。
日志記錄:通過HTTP、TCP、UDP或磁盤記錄對系統的請求和響應。
安全性:ACL、bot檢測、白名單/黑名單IP等…
系統日志:記錄到系統日志。
ssl:為基礎服務或api設置特定的ssl證書。
監控:實時監控提供關鍵的鏈路和性能指標。
轉發代理:使Kong作為透明的HTTP代理。
認證:HMAC、JWT、BASIC等 。
速率限制:基于多個變量的阻塞和限制請求。
轉換:添加、刪除或操作HTTP請求和響應。
緩存:在代理層緩存和響應服務。
cli:從命令行控制您的Kong集群。
REST API:Kong可以使用RESTful API進行管理操作,以獲得最大的靈活性。
地理復制:配置跨不同區域的更新。
故障檢測和恢復:如果您的Cassandra節點之一發生故障,Kong不會受到影響 。
集群:集群中kong節點自動保持更新。
可伸縮性:Kong支持橫向擴展。
性能:Kong核心通過擴展和使用nginx,可以輕松地處理負載。
插件:支持向Kong和API添加功能的可擴展的架構。有關插件和集成的更多信息,您可以查看KongHub。
kong架構:
OpenResty—定制的Nginx模塊(Lua虛擬機)
Kong—在OpenResty中運行的Lua腳本網關程序
配置數據中心—基于數據庫
Router—三種路由規則
LoadBalance—Dns解析和Ring-balancer
Plugin—可擴展的插件
Kong核心基于OpenResty構建,對請求/響應使用Lua腳本處理;
Kong Restful API提供了管理kong的功能;
數據中心用于存儲Kong集群節點信息、API、消費者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建議使用Cassandra;
Kong使用了DNS-Balancer和Ring-Balancer兩種均衡模式
Kong會代理HTTP請求,根據HTTP主機頭、請求URI和請求方式(GET/POST等)匹配路由規則,找到實際處理請求的后端服務
Kong插件支持裁剪添加插件,插件不僅可以處理請求,還可以定義API,操作數據庫,本身提供了許多插件,支持鑒權認證、安全控制、流量調控和請求報文轉換等
DNS解析器將使用標準配置文件/etc/hosts和etc/resolv.conf ,會將主機名解析為SRV或A記錄
流程:
init_by_lua*
??發生在master進程啟動階段。這里會對數據訪問層進行初始化,加載插件的代碼,構造路由規則表。
init_worker_by_lua*
??發生在worker進程啟動階段。這里會開啟數據同步機制,執行每個插件的init_worker方法。
set_by_lua*
??處理請求第一個執行階段。這里可以做一些流程分支處理判斷變量初始化。kong沒有使用該階段。
rewrite_by_lua*
??這里可以對請求做一些修改。kong在這里會把處理代理給插件的rewrite方法。
access_by_lua*
??kong在這里對請求進行路由匹配,找到后端的upstream服務的節點。
balancer_by_lua*
??kong在這里會把上一階段找到的服務節點設置給nginx的load balancer。如果設置了重試次數,此階段可能會被執行多次。
header_filter_by_lua*
??這里可以對響應頭做一些處理。kong在這里會把處理代理給插件的header_filter方法。
body_filter_by_lua*
??這里可以對響應體做一些處理。kong在這里會把處理代理給插件的body_filter方法。
log_by_lua*
??kong在這里會通過插件異步記錄日志和一些metrics數據。
功能:
Service:對外提供的服務
Route:路由規則
插件:包含豐富的功能
Consumers:與Service使用方關聯,可用于跟蹤,訪問管理等
配置:具有豐富的功能,支持注入Nginx指令
存儲:Cassandra或PostgreSQL
1、添加服務 $ curl –i -X POST \ —url http://localhost:8001/services/ \ –data ‘name=example-service’ \ –data ‘url=http://mockbin.org‘
2、添加路由 $ curl –i -X POST \ —url http://localhost:8001/services/example-service/routes \ –data ‘hosts[]=example.com‘
3、添加插件 $ curl –i -X POST \ —url http://localhost:8001/services/example-service/plugins/ \ –data ‘name=key-auth‘
4、Consumers與使用您的Service的個人相關聯,并可用于跟蹤,訪問管理等 添加consumer $ curl -i -X POST \ –url http://localhost:8001/consumers/ \ –data “username=Jason?
5、Kong將把所有數據(例如路由,服務,消費者和插件)存儲在Cassandra或PostgreSQL中,并且屬于同一群集的所有Kong節點必須將它們自己連接到同一個數據庫。
6、origin配置 http://upstream-foo-bar:1234=http://localhost:5678服務端口:
8000 Kong用來監聽來自客戶端的HTTP流量,并將其轉發到上游服務
8443 Kong用來監聽傳入的HTTPS流量。此端口具有和8000端口類似的行為,但它僅用于HTTPS流量。可以通過配置文件禁用此端口。
8001 Admin API用于接收管理命令。
8444 Admin API監聽HTTPS流量。
路由功能:
三種規則
{
“hosts”: [“example.com”, “foo-service.com”],
“paths”: [“/foo”, “/bar”],
“methods”: [“GET”]
}
首先嘗試匹配具有最多規則的路由
Host 匹配示例:GET / HTTP/1.1 Host: service.com -> GET / HTTP/1.1 Host: <my-service-host.com>
Paths 匹配規則:最長路徑規則,支持正則表達式,
Method方法匹配:{ “methods”: [“GET”, “HEAD”], “service”: { “id”: “…” } } -> GET / HTTP/1.1 Host: … HEAD /resource HTTP/1.1 Host: …
負載均衡:
基于DNS的負載均衡:
Kong從DNS服務器獲取信息,按如下順序解析記錄:
1、上一次成功解析的類型
2、SRV 記錄:包含ip、port、weight
3、A 記錄:只包含ip
4、CNAME 記錄
環裝負載均衡:Kong維護節點信息,基于一致性hash
這種方法可支持灰度發布/多版本部署及流量分配
Upstream:權重分配、健康檢查、session sticky
Target:維護機器信息
kong會根據配置定期對后端服務節點機器調用檢查url進行檢查,如果檢查超時或HTTP返回碼滿足失敗條件的次數超過限制,負載均衡器會把該節點標記為不可用。
kong集群:
集群節點使用同一db,共享相同配置
集群與負載均衡無關,組建集群前仍需負載均衡
擁有一個Kong集群并不意味著您的客戶流量將在您的Kong節點之間進行負載均衡。您仍需要在Kong節點前面安裝負載均衡器來分配流量
數據庫緩存配置:1、db_update_frequency (default: 5s) ,此值確定Kong節點將為無效事件輪詢數據庫的頻率;2、db_update_propagation (default: 0s),延遲更新,為了確保更改有時間跨數據庫節點傳播;3、db_cache_ttl (default: 0s),Kong將緩存數據庫實體(命中和未命中)的時間(以秒為單位),0表示不會清除緩存
用戶管理:
支持Restful管理Api:
1、功能強大,2、可發到集群任何節點,3、自動下沉至db數據中心,4、kong定時刷新緩存保證信息一致性
支持命令行管理命令:
kong check kong migrations kong prepare kong quit
kong reload kong restart kong stop kong version
kong health
kong check 檢查給定Kong配置文件的有效性
kong health 驗證Kong 的服務組件是否正常運行
kong migrations 管理數據庫遷移
kong prepare 此命令用來準備Kong前綴文件夾及其子文件夾和文件
kong quit 優雅地退出一個正在運行的Kong節點(Nginx和其他節點)在給定的前綴目錄中配置的服務
kong reload 重新加載Kong節點(并啟動其他已配置的服務)在給定的前綴目錄中
kong restart 重新啟動Kong節點(以及其他配置的服務,如Serf)在給定的前綴目錄中。
kong stop 停止給定的正在運行的Kong節點(Nginx和其他已配置的服務)在指定的前綴目錄
kong version 打印kong的版本
健康檢查和斷路器:
1、主動檢查
定期向上游的每個目標的已配置路徑發出HTTP或HTTPS請求
TCP failures”,“HTTP failures”或“timeouts”計數器達到配置的閾值,則目標將被標記為不健康。
“Successes”計數器達到其配置的閾值,則目標將標記為健康。
2、被動檢查—斷路器
主動探測(在主動健康檢查上)或代理請求(在被動健康檢查上)會生成用于確定目標是健康還是不健康的數據。請求可能會產生TCP錯誤,超時或產生HTTP狀態代碼。根據此信息,運行狀況檢查器會更新一系列內部計數器:
如果返回的狀態代碼是一個配置為“healthy”的狀態代碼,它將遞增目標的“Successes”計數器,并清除所有其他計數器;
如果連接失敗,它將遞增目標的“TCP failure”計數器,并清除“Successes”計數器;
如果超時,它將遞增目標的“超時”計數器并清除“成功”計數器;
如果返回的狀態代碼是配置為“unhealthy”的狀態代碼,它將遞增目標的“HTTP failure”計數器并清除“成功”計數器。
認證:
通過插件支持身份驗證
支持匿名訪問
支持多重認證:
1、多客戶端對同服務可以使用不同認證方法
2、支持多個認證插件的與和或邏輯
Kong支持給定服務的多個身份驗證插件,允許不同的客戶端使用不同的身份驗證方法來訪問給定的服務或路由。
在評估多個身份驗證憑據時,可以將auth插件的行為設置為執行邏輯AND或邏輯OR。行為的關鍵是config.anonymous屬性。
驗證插件的通用方案/流程如下:
1、將auth插件應用于服務或全局(您不能將其應用于消費者)
2、創建一個消費者consumer實體
3、為消費者提供特定身份驗證方法的身份驗證憑據
4、現在每當有請求進入Kong時,都會檢查提供的憑據(取決于身份驗證類型),如果請求無法驗證,它將阻止請求,或者在header中添加使用者和憑據詳細信息并轉發請求。
日志:
debug:含調試信息
info/notice:包含正常行為
warn:警告日志。
error:錯誤日志。
crit:當Kong在緊急條件下工作而不能正常工作從而影響多個客戶時,使用此級別。
支持編寫規則屏蔽某些日志
debug:它提供有關插件的runloop和每個插件或其他組件的調試信息。只是在調試期間使用,因為它的消息量太多了。
info/notice:kong沒有在這兩個級別上產生很大的差異。提供有關正常行為的信息,其中大多數行為可以忽略。
warn:要記錄任何不會導致事務丟失但需要進一步調查的異常行為,應使用警告級別。
error:用于記錄導致請求被停止的錯誤(例如,獲取HTTP 500錯誤)。需要監控此類日志的速率。
crit:當Kong在緊急條件下工作而不能正常工作從而影響多個客戶時,使用此級別。
插件:
Lua插件使用插件開發工具包(PDK),與Kong的核心和其他組件交互
|
模塊文件名稱 |
是否必須 |
描述 |
|
api.lua |
No |
定義Admin API中可用的端點列表,用來與插件處理的自定義實體進行交互。 |
|
daos.lua |
No |
定義DAO(數據庫訪問對象)列表,這些DAO是插件所需的自定義實體的抽象,存儲在數據存儲區中。 |
|
handler.lua |
Yes |
接口的實現。每個函數都由Kong在請求或連接所需的時刻運行。 |
|
migrations/xxxx.lua |
No |
數據庫遷移(如創建表)。只有當您的插件必須在數據庫中存儲自定義實體并通過daos.lua定義的其中一個DAO與它們進行交互時,才需要進行遷移。 |
|
schema.lua |
Yes |
保存插件配置的schema約束,以便用戶只能輸入有效的配置值。 |
插件繼承基類base_plugin.lua并在handler.lua中實現功能
在nginx啟動階段加載plugins目錄中插件
插件列表:
認證
Basic Authentication 基礎認證插件
HMAC Authentication 認證插件
JWT 插件
Key Authentication 密鑰認證插件
LDAP Authentication 認證插件
OAuth 2.0 Authentication 認證插件
Session 插件
安全
CORS 插件
IP Restriction 插件
Bot Detection 機器人檢測插件
日志
File Log 插件
TCP Log 插件
變更
Correlation ID 關聯 ID插件
Request Transformer 請求變更插件
Response Transformer 響應變更插件
傳輸限制
ACL 插件
Proxy Caching 代理緩存插件
Rate Limiting 速率限制插件
Response Rate Limiting 響應率限制插件
Request Termination 請求終止插件
Request Size Limiting 請求大小限制插件
分析與監測
Datadog 插件
Zipkin 插件
部署
Kubernetes Sidecar 注入插件
插件開發套件:
插件開發工具包 Plugin Development Kit(或“PDK”)是一組Lua函數和變量
插件可以使用這些函數和變量來實現自己的邏輯
kong.configuration 包含當前Kong節點配置的只讀表,基于配置文件和環境變量
kong.db Kong的DAO實例(kong.db模塊)。 包含各種實體的訪問者對象。
kong.dns Kong 的DNS解析器實例,來自lua–resty–dns-c模塊的客戶端對象
kong.worker_events Kong的IPC模塊實例,用于來自lua–resty-worker-events模塊的worker進程間間通信
kong.cluster_events 用于節點間通信的Kong的集群事件模塊的實例
kong.cache 來自kong.cache模塊的Kong數據庫緩存對象的實例
kong.client 客戶信息模塊一組函數,用于查詢在給定請求的上下文中連接到Kong的客戶端的信息
kong.ctx 客戶信息模塊函數組,用于查詢在給定請求的上下文中連接到Kong的客戶端的信息。
kong.ip 此模塊可用于確定給定IP地址是否在trusted_ips配置屬性定義的可信IP地址范圍內
kong.log 允許日志以插件的名稱作為前綴,以便進行調試
kong.node 返回節點信息
kong.request request 模塊是一組函數,用于獲取有關客戶端發出的傳入請求的信息。
kong.response 此模塊允許在將響應發送回客戶端之前改變響應
kong.routerRouter 模塊用于訪問請求的路由屬性的一組功能。
kong.serviceservice 模塊包含一組函數來操作對service的請求的連接
kong.service.request 操作對service的請求
kong.service.response 用來操作Service的響應
kong.table 表的公用程序
kubernetes&service mesh:
Kubernetes sidecar injector plugin
使用iptables
分為數據面和控制面板
服務與數據面kong在一個pod
通過kong-admin管理mesh
Origins配置在Kong用于服務網格(service mesh)時是必需的 http://upstream-foo-bar:1234=http://localhost:5678
配置在db中(Postgre和cassandra),控制面kong-admin寫入配置
servicea -> servicea-kong -> serviceb-kong -> serviceb
kong對比istio+envoy:
|
功能點 |
kong-mesh (community) |
istio + envoy |
分析 |
|
服務發現 |
通過admin api添加服務,并只能發現通過api添加的服務 |
支持對接k8s, consul等注冊中心進行服務發現 |
從平臺獨立性來看,kong mesh占優; 從服務接管易用性來看,istio占優 |
|
服務協議 |
支持http, http2, websocket, stream |
支持http, http2, grpc, websocket, stream |
istio+envoy占優 |
|
服務路由 |
支持根據源、目標地址,method、host、path、protocol等細粒度的路由 |
支持除左側列舉的所有能力外,還支持按header以及subset(標簽)的路由 |
istio+envoy占優 |
|
負載均衡 |
支持輪詢、權重、一致性hash的負載均衡模式 |
支持除左側列舉的所有負載均衡模式外,還支持隨機、最低負載等模式 |
istio+envoy占優 |
|
健康檢查 |
支持主動健康檢查以及被動健康檢查(熔斷) |
支持主動健康檢查以及被動健康檢查(熔斷) |
基本對等 |
|
安全 |
支持Certificate證書管理,支持JWT+TLS加密傳輸 |
支持證書下發及更新,JWT+mTLS加密傳輸 |
基本對等 |
|
多用戶 |
支持按consumer授權 |
支持RBAC用戶–角色授權 |
istio+envoy占優 |
|
故障注入 |
不支持 |
支持 |
istio+envoy占優 |
|
監控統計 |
繼承nginx的統計能力,支持按請求、連接、健康狀態等維度的統計 |
支持更細粒度的比如按協議、Zone的統計 |
istio+envoy占優 |
|
可擴展性 |
背靠openresty,提供強大的自定義插件能力,使用lua進行開發 |
提供lua插件開發能力,但能力比較基礎 |
kong mesh占優 |
|
學習曲線 |
kong自身提供控制面和數據面能力,組網簡單,純lua語言上手較輕松 |
istio+envoy一起至少4個組件,跨兩種語言,上手較難 |
kong mesh占優 |
引用:
1、Nginx、OpenResty和Kong的基本概念與使用方法https://www.cnblogs.com/lijiaocn/p/9769771.html
2、kong-docs-cnhttps://github.com/qianyugang/kong-docs-cn
3、kong mesh深度分析報告https://www.servicemesher.com/blog/kong-mesh-analyse-report/
4、kong docshttps://docs.konghq.com/install/kubernetes/
5、kong源碼導讀http://techblog.ppdai.com/2018/04/16/20180416/
總結
以上是生活随笔為你收集整理的Kong网关介绍[通俗易懂](玩转Kong网关)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查看已经archive过的produ
- 下一篇: 白话地图投影之Proj.4地图投影库简介