監控封鎖和允許通過的外部服務流量
如何使用 Istio 監控被封鎖和允許通過的外部流量。
了解、控制和保護您的外部服務存取是從像 Istio 這樣的服務網格獲得的主要好處之一。從安全和運營的角度來看,監控哪些外部服務流量被封鎖至關重要,因為它們可能會暴露潛在的錯誤配置或安全漏洞,如果應用程式試圖與不應該允許其通信的服務通信。同樣地,如果您目前有允許任何外部服務存取的政策,那麼監控流量是有益的,這樣您可以逐步添加明確的 Istio 配置以允許存取並更好地保護您的叢集。無論哪種情況,透過遙測技術了解這些流量都非常有幫助,因為這使您可以建立警報和儀表板,並更好地了解您的安全態勢。這是 Istio 生產用戶強烈要求的功能,我們很高興在 1.3 版本中增加了對此功能的支持。
為了實現這一點,Istio 預設指標 使用明確的標籤進行擴充,以捕獲被封鎖和允許通過的外部服務流量。本部落格將介紹如何使用這些擴充的指標來監控所有外部服務流量。
Istio 控制平面使用名為 BlackHoleCluster 和 Passthrough 的預定義叢集來配置 Sidecar 代理,分別封鎖或允許所有流量。為了理解這些叢集,讓我們先從 Istio 服務網格中外部和內部服務的含義開始。
外部和內部服務
內部服務定義為屬於您平台一部分且被認為在網格中的服務。對於內部服務,Istio 控制平面預設會為 Sidecar 提供所有必要的配置。例如,在 Kubernetes 叢集中,Istio 會為所有 Kubernetes 服務配置 Sidecar,以保留所有服務都能彼此通信的預設 Kubernetes 行為。
外部服務是不屬於您平台的服務,即網格外的服務。對於外部服務,Istio 提供兩個選項:首先封鎖所有外部服務存取(透過將 global.outboundTrafficPolicy.mode
設定為 REGISTRY_ONLY
來啟用),其次允許所有存取外部服務(透過將 global.outboundTrafficPolicy.mode
設定為 ALLOW_ANY
來啟用)。此設定的預設選項(截至 Istio 1.3)是允許所有外部服務存取。此選項可透過 網格配置 進行設定。
這就是 BlackHole 和 Passthrough 叢集的使用之處。
什麼是 BlackHole 和 Passthrough 叢集?
BlackHoleCluster - 當
global.outboundTrafficPolicy.mode
設定為REGISTRY_ONLY
時,會在 Envoy 配置中建立一個虛擬叢集 BlackHoleCluster。在此模式下,除非為每個服務明確添加 服務條目,否則所有到外部服務的流量都會被封鎖。為了實現這一點,位於0.0.0.0:15001
的預設虛擬出站監聽器(使用 原始目的地)被設定為以 BlackHoleCluster 作為靜態叢集的 TCP 代理。 BlackHoleCluster 的配置如下所示{ "name": "BlackHoleCluster", "type": "STATIC", "connectTimeout": "10s" }
如您所見,此叢集是靜態的,沒有端點,因此所有流量都會被丟棄。此外,如果請求發送到同一埠上的外部服務,Istio 會為每個平台服務的埠/協議組合建立唯一的監聽器,而不是虛擬監聽器。在這種情況下,Envoy 中每個虛擬路由的路由配置都會被擴充以添加 BlackHoleCluster,如下所示
{ "name": "block_all", "domains": [ "*" ], "routes": [ { "match": { "prefix": "/" }, "directResponse": { "status": 502 } } ] }
路由設定為 直接響應,響應代碼為
502
,這意味著如果沒有其他路由匹配,Envoy 代理將直接返回502
HTTP 狀態代碼。PassthroughCluster - 當
global.outboundTrafficPolicy.mode
設定為ALLOW_ANY
時,會在 Envoy 配置中建立一個虛擬叢集 PassthroughCluster。在此模式下,允許所有到任何外部服務的流量。為了實現這一點,位於0.0.0.0:15001
的預設虛擬出站監聽器(使用SO_ORIGINAL_DST
)被設定為以 PassthroughCluster 作為靜態叢集的 TCP 代理。 PassthroughCluster 的配置如下所示{ "name": "PassthroughCluster", "type": "ORIGINAL_DST", "connectTimeout": "10s", "lbPolicy": "ORIGINAL_DST_LB", "circuitBreakers": { "thresholds": [ { "maxConnections": 102400, "maxRetries": 1024 } ] } }
此叢集使用 原始目的地負載平衡 策略,該策略將 Envoy 配置為將流量發送到原始目的地,即允許通過。
與 BlackHoleCluster 類似,對於每個基於埠/協議的監聽器,虛擬路由配置都會被擴充以將 PassthroughCluster 添加為預設路由
{ "name": "allow_any", "domains": [ "*" ], "routes": [ { "match": { "prefix": "/" }, "route": { "cluster": "PassthroughCluster" } } ] }
在 Istio 1.3 之前,當流量到達這些叢集時,沒有報告任何指標,或者如果報告了指標,則沒有設定明確的標籤,導致無法了解流經網格的流量。
下一節將介紹如何利用此增強功能,因為發出的指標和標籤取決於是否點擊了虛擬出站或明確的埠/協議監聽器。
使用擴充的指標
為了捕獲這兩種情況(BlackHole 或 Passthrough)中的所有外部服務流量,您需要監控 istio_requests_total
和 istio_tcp_connections_closed_total
指標。根據調用的 Envoy 監聽器類型(即 TCP 代理或 HTTP 代理),其中一個指標將會遞增。
此外,在 TCP 代理監聽器的情況下,為了查看通過 BlackHole 或 Passthrough 叢集封鎖或允許的外部服務的 IP 位址,您需要將 destination_ip
標籤添加到 istio_tcp_connections_closed_total
指標。在這種情況下,不會捕獲外部服務的主機名。預設情況下不會添加此標籤,可以通過擴充屬性生成和 Prometheus 處理程式的 Istio 配置來輕鬆添加。如果您的許多服務具有不穩定的 IP 位址,您應該注意時間序列中的基數爆炸。
PassthroughCluster 指標
本節說明基於 Envoy 中調用的監聽器類型發出的指標和標籤。
HTTP 代理監聽器:當外部服務的埠與叢集中定義的服務埠之一相同時,會發生這種情況。在這種情況下,當點擊 PassthroughCluster 時,
istio_requests_total
將像這樣增加{ "metric": { "__name__": "istio_requests_total", "connection_security_policy": "unknown", "destination_app": "unknown", "destination_principal": "unknown", "destination_service": "httpbin.org", "destination_service_name": "PassthroughCluster", "destination_service_namespace": "unknown", "destination_version": "unknown", "destination_workload": "unknown", "destination_workload_namespace": "unknown", "instance": "100.96.2.183:42422", "job": "istio-mesh", "permissive_response_code": "none", "permissive_response_policyid": "none", "reporter": "source", "request_protocol": "http", "response_code": "200", "response_flags": "-", "source_app": "sleep", "source_principal": "unknown", "source_version": "unknown", "source_workload": "sleep", "source_workload_namespace": "default" }, "value": [ 1567033080.282, "1" ] }
請注意,
destination_service_name
標籤設定為 PassthroughCluster,以指示點擊了此叢集,並且destination_service
設定為外部服務的主機。TCP 代理虛擬監聽器 - 如果外部服務埠未映射到叢集內的任何基於 HTTP 的服務埠,則會調用此監聽器,並且
istio_tcp_connections_closed_total
是將會增加的指標{ "status": "success", "data": { "resultType": "vector", "result": [ { "metric": { "__name__": "istio_tcp_connections_closed_total", "connection_security_policy": "unknown", "destination_app": "unknown", "destination_ip": "52.22.188.80", "destination_principal": "unknown", "destination_service": "unknown", "destination_service_name": "PassthroughCluster", "destination_service_namespace": "unknown", "destination_version": "unknown", "destination_workload": "unknown", "destination_workload_namespace": "unknown", "instance": "100.96.2.183:42422", "job": "istio-mesh", "reporter": "source", "response_flags": "-", "source_app": "sleep", "source_principal": "unknown", "source_version": "unknown", "source_workload": "sleep", "source_workload_namespace": "default" }, "value": [ 1567033761.879, "1" ] } ] } }
在這種情況下,
destination_service_name
設定為 PassthroughCluster,並且destination_ip
設定為外部服務的 IP 位址。destination_ip
標籤可用於執行反向 DNS 查找並取得外部服務的主機名。由於此叢集是允許通過的,因此其他與 TCP 相關的指標(如istio_tcp_connections_opened_total
、istio_tcp_received_bytes_total
和istio_tcp_sent_bytes_total
)也會更新。
BlackHoleCluster 指標
與 PassthroughCluster 類似,本節說明基於 Envoy 中調用的監聽器類型發出的指標和標籤。
HTTP 代理監聽器:當外部服務的埠與叢集中定義的服務埠之一相同時,會發生這種情況。在這種情況下,當點擊 BlackHoleCluster 時,
istio_requests_total
將像這樣增加{ "metric": { "__name__": "istio_requests_total", "connection_security_policy": "unknown", "destination_app": "unknown", "destination_principal": "unknown", "destination_service": "httpbin.org", "destination_service_name": "BlackHoleCluster", "destination_service_namespace": "unknown", "destination_version": "unknown", "destination_workload": "unknown", "destination_workload_namespace": "unknown", "instance": "100.96.2.183:42422", "job": "istio-mesh", "permissive_response_code": "none", "permissive_response_policyid": "none", "reporter": "source", "request_protocol": "http", "response_code": "502", "response_flags": "-", "source_app": "sleep", "source_principal": "unknown", "source_version": "unknown", "source_workload": "sleep", "source_workload_namespace": "default" }, "value": [ 1567034251.717, "1" ] }
請注意,
destination_service_name
標籤設定為 BlackHoleCluster,而destination_service
設定為外部服務的主機名。在這種情況下,響應代碼應始終為502
。TCP 代理虛擬監聽器 - 如果外部服務埠未映射到叢集內的任何基於 HTTP 的服務埠,則會調用此監聽器,並且
istio_tcp_connections_closed_total
是將會增加的指標{ "metric": { "__name__": "istio_tcp_connections_closed_total", "connection_security_policy": "unknown", "destination_app": "unknown", "destination_ip": "52.22.188.80", "destination_principal": "unknown", "destination_service": "unknown", "destination_service_name": "BlackHoleCluster", "destination_service_namespace": "unknown", "destination_version": "unknown", "destination_workload": "unknown", "destination_workload_namespace": "unknown", "instance": "100.96.2.183:42422", "job": "istio-mesh", "reporter": "source", "response_flags": "-", "source_app": "sleep", "source_principal": "unknown", "source_version": "unknown", "source_workload": "sleep", "source_workload_namespace": "default" }, "value": [ 1567034481.03, "1" ] }
請注意,
destination_ip
標籤代表外部服務的 IP 位址,並且destination_service_name
設定為 BlackHoleCluster,以指示此流量被網格封鎖。有趣的是,對於 BlackHole 叢集的情況,其他與 TCP 相關的指標(如istio_tcp_connections_opened_total
)不會增加,因為永遠不會建立連線。
監控這些指標可以幫助運營商輕鬆了解叢集中應用程式所消耗的所有外部服務。