排空
在一些不同的情境中,Envoy 會嘗試優雅地釋放連線。例如,在伺服器關閉期間,可以阻止現有的請求,並設定監聽器停止接受連線,以減少伺服器關閉時的開放連線數。排空行為由伺服器選項以及個別監聽器組態定義。
排空會在以下時間發生
伺服器正在進行熱重啟。
伺服器透過 drain_listeners?graceful 管理端點開始優雅排空序列。
伺服器已透過 healthcheck/fail 管理端點手動健康檢查失敗。有關詳細資訊,請參閱 健康檢查篩選器 架構概觀。
個別監聽器正在透過 LDS 進行修改或移除。
預設情況下,Envoy 伺服器會在伺服器關閉時立即關閉監聽器。若要在伺服器關閉之前排空監聽器一段時間,請在關閉伺服器之前使用 drain_listeners。監聽器將直接停止,不會有任何優雅的排空行為,並立即停止接受新的連線。
若要在關閉監聽器之前加入優雅排空期間,請使用查詢參數 drain_listeners?graceful。預設情況下,Envoy 會在一段時間內阻止請求(由 --drain-time-s
決定),但會持續接受新的連線直到排空逾時。請求阻止的行為由排空管理器決定。
請注意,雖然排空是每個監聽器的概念,但必須在網路篩選器層級支援。目前唯一支援優雅排空的篩選器是 Redis、Mongo、Thrift(如果啟用 envoy.reloadable_features.thrift_connection_draining
執行期功能)和 HTTP 連線管理器。
預設情況下,HTTP 連線管理器 篩選器會將「Connection: close」新增至 HTTP1 請求、傳送 HTTP2 GOAWAY,並在請求完成後(在延遲關閉期間之後)終止連線。
每個已設定的監聽器 都有一個 drain_type 設定,用於控制何時進行排空。目前支援的值為
- 預設值
Envoy 會在回應上述所有三種情況(管理健康檢查失敗、熱重啟和 LDS 更新/移除)時排空監聽器。這是預設設定。
- modify_only
Envoy 只會在回應上述第二和第三種情況(熱重啟和 LDS 更新/移除)時排空監聽器。如果 Envoy 同時託管輸入和輸出監聽器,則此設定很有用。可能需要在輸出監聽器上設定 *modify_only*,使其僅在修改期間排空,同時依靠輸入監聽器排空在嘗試執行受控關閉時執行完整的伺服器排空。