您可以讓 Kong 代理的 API 使用 ring-balancer , 通過添加包含一個或多個目標實體的upstream 實體來配置,每個目標指向不同的IP地址(或主機名)和端口。ring-balancer 將在不同的target之間平衡負載,並基於 uptream 配置對目標執行健康檢查,使它們成為健康或不健康的,無論它們是否響應,ring-balancer 將只把流量路由到健康的target。
Kong 支持兩種健康檢查方式,可以單獨使用,也可以組合使用。
-
active checks:其中定期請求目標中的特定 HTTP 或 HTTPS 端點,並根據其響應確定目標的健康狀態;
-
passive checks: Kong 分析正在代理的通信,並根據目標的行為響應請求來確定目標的健康狀況。
健康和不健康的 target
健康檢查功能的目標是為給定的 Kong 節點動態地將 target 標記為健康或不健康。沒有集群范圍內的健康信息同步,每個 Kong 節點分別確定其 target 的健康狀況。這是可以取到的,因為在給定的點上,一個 Kong 節點可能能夠成功地連接到一個目標,而另一個節點則無法到達。這樣第一個節點將認為它是健康的,而第二個則會將其標記為不健康,並開始將流量路由到upstream 的其他 target。
無論是主動探測(針對主動健康檢查)還是代理請求(針對被動健康檢查),都會生成用於確定目標是否健康的數據。請求可能會產生TCP錯誤、超時或HTTP狀態代碼。基於此信息,健康檢查器更新了一系列內部計數器:
- 如果返回的狀態碼配置為 “healthy”,則將增加目標的 “Successes” 計數器,並清除其所有其他計數器;
- 如果連接失敗,將增加目標的 “TCP failure”計數器,並清除 “Successes” 計數器;
- 如果超時,將增加目標的 “timeouts” 計數器並清除 “Successes” 計數器;
- 如果返回的狀態代碼配置為 “unhealthy”,它將增加目標的 “HTTP failures” 計數器,並清除 “Successes” 計數器。
如果任何 “TCP failure”、“HTTP failure” 或 “timeout” 計數器達到其配置的閾值,則target 將被標記為不健康。
如果 “success” 計數器達到其配置的閾值,則 target 將被標記為健康。
如果一個 upstream 的所有 target 都是不健康,Kong 會將 upstream 的請求返回 503 Service Unavailable 。
- 健康檢查只對狀態是 active 的 target 執行,不修改 Kong 數據庫中目標的活動狀態。
- 不健康的 target 不會從 loadbalancer 中刪除,因此在使用哈希算法時不會對balancer 布局產生任何影響(只會跳過它們)。
- DNS警告和 Balancer 警告也適用於健康檢查。如果對 target 使用主機名,需要確保DNS服務器始終為完整的 IP地址和名稱,並且不限制響應。如果不這樣做,可能會導致沒有執行健康檢查。
健康檢查的類型
健康檢查有兩種類型,分別是 Active health checks 和 Passive health checks
Active health checks
Active health checks 就是主動探測他們的健康狀態。當 upstream 實體啟用活動健康檢查時,Kong 將定期向 upstream 的每個 target 的配置路徑發出 HTTP 或 HTTPS 請求。這允許 Kong 根據探測結果自動啟用和禁用 balancer 中的 target 。
Active health checks 的周期性是可以被配置的,當 target 是健康還是不健康。如果其中一個的interval值設置為零,則在相應的場景中禁用檢查。如果兩者都為零,則完全禁用活動健康檢查。
Passive health checks
Passive health checks 是否基於由 Kong 代理的請求(HTTP/HTTPS/TCP)執行檢查,而不生成額外的流量。當 target 變得無響應時,被動健康檢查器將檢測到這一點,並將目標標記為不健康。Ring-balancer 將開始跳過這個 target ,因此不會有更多的流量被路由到它。
當目標的問題解決,並准備再次接收流量時,Kong管理員可以手動通知health checker目標應該再次啟用,通過一個Admin API端點:
$ curl -i -X POST http://localhost:8001/upstreams/my_upstream/targets/10.1.2.3:1234/healthy
HTTP/1.1 204 No Content
這個命令將廣播一個集群范圍的消息,以便將 “health” 狀態傳播到整個 Kong 集群。這將導致 Kong 節點重置在 Kong 節點的所有 worker 中運行的健康檢查器的健康計數器,從而允許環平衡器再次將流量路由到目標。
被動健康檢查的優點是不會產生額外的流量,但它們不能自動將 target 重新標記為健康狀態:“circuit is broken”,需要由系統管理員重新啟用目標。
Kong 的監控
Kong 支持使用 Prometheus 進行監控數據采集,並且官方提供了采集方式和 Grafana 的Dashboard 模板
官方的 Kong Plugin Prometheus 會定期更新,看上去比較活躍。
除了官網以外,有網友也提供了一個監控模板,不過最后一次更新時間是2018 年 5 月 17 日,之后就沒有更新了,大家也可以參考。kong-prometheus-plugin
小結
Kong 的健康檢查主要介紹了健康檢查的類型,這兩類的健康檢查是可以打開和關閉的,打開和關閉的具體方法請參考官網文檔。
