Kong健康檢查&熔斷器向導

簡介

用戶可以使用Kong的 ring-balancer 配置 API 代理,ring-balancer 會在多個 target 之間實現(xiàn)負載均衡,并基于 upstream 配置對每個 target 進行健康檢查,針對它們是否正常響應判定它們是否健康,之后 ring-balancer 僅會將流量路由到健康的 target,Kong支持兩種健康檢查,可以單獨使用,也可以結合使用:

  • 主動檢查:定期檢查 target 中指定的 Http 或 Https 端點,并根據(jù)其響應確定 target 的運行狀況
  • 被動檢查:也稱為斷路器,Kong會分析正在運行的代理流量,并根據(jù)其響應請求行為確定 target 的運行狀況

健康與不健康的 target

健康檢查的目的是對于一個指定的Kong節(jié)點,可以動態(tài)的標記其下的 target 是否健康,集群范圍內(nèi)不會同步健康信息,每個Kong節(jié)點單獨判斷 target 的健康情況,這種做法是可取的,因為在一個時間點,一個Kong節(jié)點可能可以成功連接到某個 target,但是另一個Kong節(jié)點連接失敗,這樣第一個節(jié)點就標記其為健康,另一個標記為不健康,并且不再將流量路由到此處
活動探測(主動健康檢查)或者代理請求(被動健康檢查)都會生成用于確定 target 健康與否的數(shù)據(jù),請求可能會導致 TCP 錯誤,超時,或者生成一個 Http 狀態(tài)碼,基于這些數(shù)據(jù),健康檢查器會更新一系列內(nèi)部計數(shù)器:

  • 如果返回的狀態(tài)碼配置為健康,那么它會累加 成功 計數(shù)器,并清空其他所有計數(shù)器
  • 如果連接失敗,那么它會累加 TCP 失敗 計數(shù)器,并清空所有 成功 計數(shù)器
  • 如果超時,那么它會累加 超時 計數(shù)器,并清空所有 成功 計數(shù)器
  • 如果返回的狀態(tài)碼配置為不健康,那么它會累加 HTTP 失敗 計數(shù)器,并清空所有 成功 計數(shù)器
    如果TCP 失敗、超時HTTP 失敗計數(shù)器中的任何一個達到它們配置的閾值,target 就會標記為不健康;如果成功計數(shù)器達到它配置的閾值,target 就會標記為健康
    每個 upstream 可以配置標記健康與否的 HTTP 狀態(tài)列表和每個計數(shù)器的閾值,下面我們有一份 upstream 實體的配置示例,展示了健康檢查配置項的默認值,詳細信息可以參考 Admin API 的參考文檔
{
    "name": "service.v1.xyz",
    "healthchecks": {
        "active": {
            "concurrency": 10,
            "healthy": {
                "http_statuses": [ 200, 302 ],
                "interval": 0,
                "successes": 0
            },
            "http_path": "/",
            "timeout": 1,
            "unhealthy": {
                "http_failures": 0,
                "http_statuses": [ 429, 404, 500, 501,
                                   502, 503, 504, 505 ],
                "interval": 0,
                "tcp_failures": 0,
                "timeouts": 0
            }
        },
        "passive": {
            "healthy": {
                "http_statuses": [ 200, 201, 202, 203,
                                   204, 205, 206, 207,
                                   208, 226, 300, 301,
                                   302, 303, 304, 305,
                                   306, 307, 308 ],
                "successes": 0
            },
            "unhealthy": {
                "http_failures": 0,
                "http_statuses": [ 429, 500, 503 ],
                "tcp_failures": 0,
                "timeouts": 0
            }
        }
    },
    "slots": 10
}

如果 upstream 下的所有 target 都不健康,那么Kong會返回 503 Service Unavailable
注意:

  1. 健康檢查僅作用于活動狀態(tài)的 target,但是不修改Kong數(shù)據(jù)庫中 target 的活動狀態(tài)
  2. 不健康的 target 不會從負載均衡器中移除,因此在使用Hash算法時,不會對平衡器布局造成任何影響(它們只是被跳過)
  3. DNS 和 平衡器的注意事項也適用于健康檢查,如果 target 使用主機名,要確保 DNS 服務器始終返回完整的 IP 地址集,并且不限制響應,如果不這樣做會健康檢查無法執(zhí)行

健康檢查類型

主動健康檢查

顧名思義,主動健康檢查會積極查詢健康狀態(tài),當 upstream 中啟用主動健康檢查時,Kong會向每個 target 的固定路徑周期性地發(fā)送 Http 或者 Https 請求,這使得Kong可以根據(jù)探測結果自動啟用或禁用平衡器中的 target
Kong可以根據(jù) target 健康與否單獨配置健康檢查的周期,如果其中的一個間隔時間設置為0,那么在對應中的場景中會禁用檢查;如果兩個都設為0,將完全禁用主動健康檢查

被動健康檢查(斷路器)

被動健康檢查,即斷路器,是根據(jù)Kong代理的請求執(zhí)行檢查,它本身不會產(chǎn)生額外流量,當 target 無響應時,被動檢查器會檢測到,并將其標記為不健康,ring-balancer 會跳過這個 target,不會將流量路由到這個 target,當問題解決了之后并且準備好再次接受流量時,Kong管理員可以手動觸發(fā)請求,使健康檢查器重新檢測該 target

curl -i  -X POST http://localhost:8001/upstreams/my_upstream/targets/10.1.2.3:1234/healthy HTTP/1.1 
204 No Content

此命令將在集群范圍內(nèi)廣播消息,所以健康狀態(tài)會傳播到整個Kong集群,這會導致所有Kong節(jié)點都會重置健康檢查器的健康計數(shù)器,從而允許 ring-balancer 能夠再次將流量路由到該 target,被動健康檢查的優(yōu)點是不會產(chǎn)生額外的流量,但是它們無法再次自動將 target 標記為健康,斷路器需要系統(tǒng)管理員重新激活

兩類健康檢查器總結

  • 主動健康檢查器可以在 target 恢復健康之后自動恢復流量;但是被動健康檢查器不能
  • 被動健康檢查器不會產(chǎn)生額外的流量;主動健康檢查器會
  • 主動健康檢查器需要一條URL路徑可以訪問,作為探測的端點(通常簡單配置為"/");被動檢查器不需要這樣的配置
  • 應用可以根據(jù)自身的健康指標生成一個狀態(tài)碼,提供給主動健康檢查器,這樣即使 target 還能持續(xù)提供給被動健康檢查器流量,同時也能響應主動健康檢查器的錯誤狀態(tài)
    用戶可以組合使用者兩種模式,例如使用被動檢查器僅根據(jù)流量狀態(tài)監(jiān)控該 target 健康與否,再僅在非健康狀態(tài)情況下使用主動檢查器,以便自動重啟該 target

啟用、停用健康檢查

啟用主動健康檢查

要啟用主動健康檢查,用戶需要在 upstream 對象中配置 healthchecks.active 屬性的值,指定一些必要的信息,這樣Kong可以對 target 執(zhí)行定期探測,并對結果做出反應
用戶可以使用 healthchecks.active.type 字段來指定是用 HTTP 還是 HTTPS 探測,或者可以設置成 TCP 簡單地測試給定的地址和端口是否可以連接
用戶配置探針時,需要指定以下字段:

  • healthchecks.active.http_path:向 target 發(fā)出 Http Get 請求的地址,默認是"/"
  • healthchecks.active.timeout:Http Get 請求的連接超時時間,默認是1秒
  • healthchecks.active.concurrency:主動檢查時 target 的并發(fā)數(shù)
    用戶需要將間隔時間設置為正值以便運行探針:
  • healthchecks.active.healthy.interval:健康 target 的檢查間隔時間(以秒為單位),值為0表示對健康的 target 不執(zhí)行健康檢查
  • healthchecks.active.unhealthy.interval:非健康 target 的檢查間隔時間(以秒為單位),值為0表示對非健康的 target 不執(zhí)行健康檢查
    用戶可以調整健康檢查的行為,用戶可以將健康與非健康的 target 的檢查間隔時間設成一致,也可以一個比另一個更頻繁一些
    當用戶使用 HTTPS 健康檢查時,還可以指定以下字段:
  • healthchecks.active.https_verify_certificate:檢查時是否檢查遠程主機的SSL證書的有效性
  • healthchecks.active.https_sni:SNI 的主機名,當使用 IP 配置 target 時尤其有效
    注意,TLS驗證的錯誤將累計在 TCP 失敗計數(shù)器上,HTTP 失敗次數(shù)僅針對 HTTP 狀態(tài)碼,無論是通過 HTTP 協(xié)議還是 HTTPS 協(xié)議
    最后,用戶需要配置各種健康計數(shù)器的閾值,告知Kong如何解析這些探測:
  • healthchecks.active.healthy.successes:HTTP狀態(tài)成功次數(shù)的閾值
  • healthchecks.active.unhealthy.tcp_failures:TCP失敗或者TLS驗證失敗次數(shù)的閾值
  • healthchecks.active.unhealthy.timeouts:超時次數(shù)的閾值
  • healthchecks.active.unhealthy.http_failures:HTTP狀態(tài)失敗次數(shù)的閾值

啟用被動健康檢查

被動健康檢查沒有探測功能,它通過流經(jīng) target 的流量來工作,這意味啟動被動檢查,用戶只需要配置計數(shù)器閾值:

  • healthchecks.passive.healthy.successes:HTTP狀態(tài)成功次數(shù)的閾值,這個值需要設置為正值
  • healthchecks.passive.unhealthy.tcp_failures:TCP失敗計數(shù)器
  • healthchecks.passive.unhealthy.timeouts:超時次數(shù)閾值
  • healthchecks.passive.unhealthy.http_failures:HTTP狀態(tài)失敗次數(shù)的閾值

停用健康檢查

被動健康檢查沒有探測功能,它通過流經(jīng) target 的流量來工作,這意味啟動被動檢查,用戶只需要配置計數(shù)器閾值:

  • healthchecks.passive.healthy.successes:HTTP狀態(tài)成功次數(shù)的閾值,這個值需要設置為正值,這樣健康的流量可以重置非健康計數(shù)器
  • healthchecks.passive.unhealthy.tcp_failures:TCP失敗計數(shù)器
  • healthchecks.passive.unhealthy.timeouts:超時次數(shù)閾值
  • healthchecks.passive.unhealthy.http_failures:HTTP狀態(tài)失敗次數(shù)的閾值

停用健康檢查

對于健康檢查中所有的閾值和間隔,將它們設置為0,就可以禁用該屬性表示的功能,將探測的間隔時間設為0可以禁用該探測,這樣用戶可以對健康檢查程序的行為進行細粒度的控制
總結起來,禁用主動健康檢查,需要將 healthchecks.active.healthy.intervalhealthchecks.active.unhealthy.interval 這兩個參數(shù)都設為0;禁用被動健康檢查,需要將被動健康檢查的閾值都設置為0
默認情況下,健康檢查器中的所有閾值和時間間隔默認值都為0,這意味著新創(chuàng)建的 upstream 默認情況下是完全禁用健康檢查的

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容