TLS 檢查器監聽器過濾器
此範例示範如何使用 TLS
檢查器來選擇 FilterChains
,以根據匹配的 transport_protocol
和/或 application_protocols
在上游叢集之間分配流量。
它也示範了 TLS
檢查器監聽器過濾器產生的管理統計資訊。
步驟 1:建立沙箱
將目錄變更為 Envoy 儲存庫中的 examples/tls-inspector
,並啟動服務。
這會啟動一個監聽 localhost:10000
的代理,以及一個監聽 12345 埠的管理介面。
它也會啟動三個上游 HTTP
服務,這些服務會以 json
格式回應收到的標頭。
前 2 個服務是監聽 443
埠的 HTTPS
服務,另一個沒有 TLS
且監聽 80
埠。
$ pwd
envoy/examples/tls-inspector
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------
tls-inspector_service-http_1 docker-entrypoint.sh node ... Up
tls-inspector_service-https-http1.1_1 docker-entrypoint.sh node ... Up
tls-inspector_service-https-http2_1 docker-entrypoint.sh node ... Up
tls-inspector_tls-inspector_1 /docker-entrypoint.sh /usr ... Up 0.0.0.0:10000->10000/tcp, 0.0.0.0:12345->12345/tcp
步驟 2:存取服務
使用 TLS 指定不同 HTTP 版本查詢 10000 埠的服務,或使用沒有 TLS 的 HTTP 協定,請求將由不同的上游服務處理。
使用 HTTP1.1
和 TLS
查詢代理
$ curl -sk --http1.1 https://localhost:10000 | jq '.os.hostname'
"service-https-http1.1"
上游 service-https-http1.1
處理該請求。
使用 HTTP2
和 TLS
查詢代理
$ curl -sk --http2 https://localhost:10000 | jq '.os.hostname'
"service-https-http2"
上游 service-https-http2
處理該請求。
查詢不使用 TLS
的代理
$ curl -sk http://localhost:10000 | jq '.os.hostname'
"service-http"
上游 service-http
處理該請求。由於 TLS 檢查器監聽器過濾器偵測到傳輸是純文字,因此不會將 transport_protocol 設定為 TLS
。
步驟 3:檢視管理統計資訊
TLS 檢查器有一個以 tls_inspector
為根的統計資訊樹狀結構,可以使用設定的管理存取進入點提取。
$ curl -sk http://localhost:12345/stats |grep tls_inspector
tls_inspector.alpn_found: 2
tls_inspector.alpn_not_found: 0
tls_inspector.client_hello_too_large: 0
tls_inspector.connection_closed: 0
tls_inspector.read_error: 0
tls_inspector.sni_found: 2
tls_inspector.sni_not_found: 0
tls_inspector.tls_found: 2
tls_inspector.tls_not_found: 1
檢視管理統計資訊,我們可以發現 TLS
、SNI
和 ALPN
都已偵測到,因為我們透過 TLS
上的 HTTP
存取服務兩次。 它也顯示來自純文字查詢的一個 tls_not_found
。