內部監聽器

Envoy 支援使用者空間的 socket,可以讓 TCP 串流從上游叢集建立到監聽器,而無需使用系統網路 API。接受使用者空間連線的監聽器稱為內部監聽器。內部監聽器的 名稱 會識別客戶端的伺服器 內部位址

若要使用內部監聽器,需要一併設定幾個元件。首先,必須啟用 bootstrap 擴充功能。此擴充功能會註冊一個客戶端連線工廠,讓內部監聽器可以接受來自 Envoy 內部的連線。其次,必須定義一個內部監聽器

name: internal_listener
internal_listener: {}
filter_chains:
- filters: []

第三,上游叢集必須包含一個端點,其中具有一個內部位址,透過名稱參照內部監聽器

name: cluster_0
load_assignment:
  cluster_name: cluster_0
  endpoints:
  - lb_endpoints:
    - endpoint:
        address:
          envoy_internal_address:
            server_listener_name: internal_listener

內部上游傳輸

內部上游傳輸 擴充功能可透過使用者空間的 socket 啟用從下游監聽器到內部監聽器的篩選器狀態交換。此額外狀態可以是從上游主機取得的資源中繼資料形式,或是 篩選器狀態物件。這是可以新增至具有內部位址的上游叢集的選用擴充功能。

此擴充功能會發出下列統計資料

名稱

類型

描述

no_metadata

計數器

匯入位置中缺少中繼資料金鑰。

端點消歧義

如果單一上游叢集中有多個端點參照相同的內部監聽器,請使用 端點 ID 欄位 來改善叢集集區中的變更追蹤。此欄位與內部監聽器名稱結合,會在集區中唯一識別端點。例如,如果多個端點使用不同的上游主機中繼資料,則此欄位的值應為雜湊或來自主機中繼資料的相異值。對於通道內部監聽器,此值應為傳播至內部監聽器的實際目的地地址。

範例

簡單鏈結

這裡有一個將兩個 TCP Proxy 鏈結起來,透過內部監聽器將連線從連接埠 9999 轉送至連接埠 10000 的最小範例:這裡

在 HTTP CONNECT 要求中封裝 HTTP GET 要求

目前 Envoy 的 HTTP 連線管理員 無法在上游 HTTP CONNECT 要求中 Proxy GET 要求。此需求可以透過將 HTTP 連線管理員的上游端點設定為內部監聽器位址來達成。同時,另一個繫結至上述監聽器位址的內部監聽器包含具有 通道組態 的 TCP Proxy。

這裡有一個範例組態:這裡

解封 CONNECT 要求

跨服務或邊緣有一些複雜的 GET-in-CONNECT 要求。為了在 Envoy 中 Proxy GET 要求,需要兩層的 HTTP 連線管理員。第一層 HTTP 連線管理員會從 CONNECT 要求中擷取 TCP 串流,並將 TCP 串流重新導向至第二層 HTTP 連線管理員,以剖析一般 GET 要求。

這裡有一個範例組態:這裡

可以依照下列方式一起測試以上兩個範例

  • bazel-bin/source/exe/envoy-static --config-path configs/encapsulate_http_in_http2_connect.yaml --disable-hot-restart

  • bazel-bin/source/exe/envoy-static --config-path configs/terminate_http_in_http2_connect.yaml --disable-hot-restart.

  • curl 127.0.0.1:10000