在動態 Kubernetes 環境中管理網路連線和安全政策,會帶來重大的作業挑戰。GKE Dataplane V2 觀測功能可讓平台管理員掌握叢集網路流量的 Kernel 層級資訊,有助於快速排解問題、持續稽核法規遵循情形,以及主動驗證路徑。
本文將說明 Google Kubernetes Engine (GKE) 網路可觀測性的概念架構和最佳做法,包括遙測堆疊、分流的心智模型、主動式警報規則、Terraform 自動化,以及成本最佳化技術。
如需逐步疑難排解說明和診斷程序,請參閱「排解網路可觀測性問題」。
GKE 網路觀測功能的優點
在 GKE 中實作可觀測性策略,可帶來下列主要優勢:
- 加快平均解決時間 (MTTR):運用 eBPF 支援的指標和 Hubble 流量記錄,您可以立即找出網路異常狀況。這項功能可讓您區分應用程式層級的失敗、Kubernetes NetworkPolicy 封鎖和 VPC 防火牆捨棄,將偵錯週期從數小時縮短至數分鐘。
- 無附屬容器的核心層級檢測:GKE Dataplane V2 會使用 eBPF,直接在主機 Linux 核心中執行可觀測性邏輯。這樣一來,您就不需要耗用大量資源的 Sidecar Proxy,也不必修改應用程式層級的程式碼,確保將負擔降到最低,同時維持應用程式效能。
- 持續稽核安全法規遵循情形:NetworkPolicy 記錄會為每次連線嘗試 (
ALLOW或DENY的判決) 產生詳細的稽核記錄。這些記錄提供叢集流量的防竄改記錄,對於滿足法規遵循架構 (例如 PCI-DSS、SOC 2 和 HIPAA) 至關重要。 - 主動路徑驗證:與 Connectivity Tests 整合後,您就能模擬網路路徑,並在部署工作負載前靜態評估 GKE NetworkPolicy,避免設定漂移和部署階段的連線問題。
- 資源和成本最佳化:詳細的流程追蹤功能可找出效率不彰之處,例如 Cloud NAT 連接埠使用率過高、區域間資料傳輸量暴增,以及未快取的 DNS 解析模式,有助於做出明智的容量規劃和成本管理決策。
GKE 網路觀測架構
GKE Dataplane V2 提供多層觀測能力堆疊,適用於不同作業階段。下表列出核心元件及其建議用途:
| 可觀測性元件 | 主要應用實例 | 可用性 | 資料保留 | 效能負擔 | 主要遙測信號 |
|---|---|---|---|---|---|
| GKE Dataplane V2 指標 | 全系統健康狀態監控、趨勢分析和快訊。 | 僅限 GKE Dataplane V2 | 保留遙測資料記錄 (Cloud Monitoring 和 Google Cloud Managed Service for Prometheus 會儲存 30 天以上的指標和記錄) | 可忽略 (核心層級匯總) | 封包和位元組計數器、TCP 重設計數,以及連線捨棄率 (pod_flow_drop_count)。 |
| NetworkPolicy 記錄 | 安全性政策稽核、歷來連線分析和法規遵循。 | 僅限 GKE Dataplane V2 (適用於 NetworkLogging 自訂資源設定) |
可設定 (Cloud Logging) | 低 (緩衝記錄檔匯出) | 連線中繼資料 (來源和目的地標籤、IP 位址、通訊埠) 和政策判斷結果 (ALLOW 或 DENY)。 |
| Hubble CLI 和 UI | 即時互動式流量分析,以及封包層級的即時偵錯。 | 僅限 GKE Dataplane V2 | 暫時性 (節點本機環狀緩衝區) | 低 (動態啟用) | 即時流程追蹤、詳細的捨棄原因 (例如政策拒絕或連線追蹤表飽和)。 |
| GKE DNS 指標 | 監控 DNS 解析效能、快取效率和上游延遲時間。 | 所有叢集 | 長期 (Cloud Monitoring) | 可忽略 | DNS 要求數、快取命中和未命中率、上游轉送延遲時間,以及並行限制拒絕。 |
| Connectivity Tests | 部署前路徑驗證和靜態設定稽核。 | 所有叢集 | 不適用 (隨選模擬) | 無 (靜態模擬) | 模擬封包路由路徑,包括模擬 NetworkPolicy 評估。 |
| 虛擬私有雲流量記錄 | 節點間和外部流量稽核、安全鑑識和成本分析。 | 所有叢集 | 可設定 (Cloud Logging 或 BigQuery) | 無 (可設定取樣率) | 5 元組連線詳細資料、傳送的位元組和封包、GKE 中繼資料 (命名空間、工作負載、服務) 和 RTT (適用於 TCP)。 |
| Flow Analyzer | 以視覺化方式分析虛擬私有雲流量、找出高流量來源,以及分析跨區域成本,不必編寫 SQL 查詢。 | 所有叢集 | 視 Observability Analytics bucket 保留期限而定 | 無 (分析 UI) | 按照 GKE 工作負載或服務分組的匯總流量和延遲時間。 |
在上表中,「可忽略」的效能負荷表示無論流量或系統規模為何,元件都會嚴格維持在最低資源用量 (通常 <0.1 vCPU 和最低記憶體)。低元件在標準情況下會維持最小的足跡,但會隨著流量密度動態調整。在高輸送量情境下,資源用量最多可擴充至 2 個 vCPU 和數百 MB 的記憶體。
GKE 觀測能力心智模型和分類迴圈
如要有效排解網路異常問題,您必須為作業範圍選取適當的遙測信號,並遵循一致的分類方法。
選擇合適的遙測來源
有多個遙測來源可供選擇,請選擇適合目前作業工作的工具:
| 遙測來源 | 解答 | 適用情況 | Google Cloud 目的地 |
|---|---|---|---|
| GKE Dataplane V2 指標 | 發生了什麼事?規模有多大? | 資訊主頁、警示和容量規劃。 | Cloud Monitoring (prometheus.googleapis.com) |
| NetworkPolicy 記錄 | 為什麼 GKE 內部的連線遭到封鎖? | 安全稽核和安全政策根本原因分析。 | Cloud Logging (policy-action 記錄) |
| 虛擬私有雲流量記錄 | 離開 Pod 後,這項流量發生了什麼事? | 工作負載之間的歷來流量分析、可用區間資料移轉費用,以及 VPC 層級的捨棄歸因。 | Cloud Logging 和 Observability Analytics
(vpc_flows 記錄) |
| Hubble CLI 和 UI | 目前通過節點的資料為何? | 即時偵錯、tcpdump 替代方案和進行中的事件。 | 暫時性環形緩衝區 (Hubble CLI) |
| Connectivity Tests | 流量是否能順利傳輸? | 主動探查資料平面和路徑分析:驗證可連線性,並找出虛擬私有雲防火牆、路徑和 GKE 節點的確切捨棄點。 | Network Intelligence Center (模擬) |
標準化疑難排解迴圈
使用這個可重複的工作流程,對任何 GKE 網路事件進行分類:
- 偵測異常狀況:透過 Cloud Monitoring 警告找出問題 (例如 TCP 重設次數暴增、DNS 並行限制遭拒,或封包遺失)。
- 隔離層級:執行 GCE VM 基準測試 (請參閱「節點層級延遲和 CNI 瓶頸的分類」),判斷封鎖是否位於 GKE 叢集 (CNI、NetworkPolicy、IP 位址偽裝) 內,或位於 VPC (防火牆規則、路由、Cloud NAT) 外。
- 調查根本原因:詳細分析流程:
- 即時事件:使用 Hubble CLI (
hubble observe) 串流即時流量,並找出捨棄原因。 - 如要瞭解過去或間歇性問題:請在 Cloud Logging 中查詢 NetworkPolicy 記錄或虛擬私有雲流量記錄。
- 即時事件:使用 Hubble CLI (
- 驗證修正措施:執行模擬的 Connectivity Tests 測試,確認路徑已靜態允許,然後檢查指標資訊主頁,確認丟包率已恢復為零。
主動監控網路並發出警告
為維持高可用性,平台管理員應在 Cloud Monitoring 中建立警報政策,以便在網路效能降低影響工作負載前,及早識別問題。
封包捨棄量突然增加時發出警報
網路流量中斷次數異常增加,通常表示安全性政策設定錯誤,或是節點層級的連線追蹤 (conntrack) 耗盡。
Prometheus 查詢 (PromQL):
sum(rate(pod_flow_egress_flows_count{verdict="DROPPED"}[5m])) by (source) > 10建議做法:請參閱「診斷封包捨棄和 NetworkPolicy 封鎖」,找出導致封包遺失的特定 GKE NetworkPolicy 或 eBPF 捨棄原因。
針對 DNS 飽和度發出快訊
當 CoreDNS 或 NodeLocal DNSCache 達到並行查詢上限時,後續的 DNS 查詢會遭到拒絕,導致應用程式間歇性逾時。
Prometheus 查詢 (PromQL):
sum by (cluster_name) (rate(kubernetes_io_networking_dns_kubedns_max_concurrent_rejected_request_count[5m])) > 0應變措施建議:調整
kube-dns副本數量,或實作 NodeLocal DNSCache,分散解析負載。如需詳細步驟,請參閱「診斷 DNS 解析失敗問題」。
TCP 重設尖峰警告
TCP 重設封包的尖峰通常表示後端服務拒絕連線,可能是因為應用程式異常終止迴圈或通訊端佇列飽和。
監控查詢語言 (MQL):
fetch prometheus_target | metric 'prometheus.googleapis.com/hubble_tcp_flags_total/counter' | filter (metric.flag == 'RST') | align rate(1m) | every 1m | group_by [metric.source, metric.destination], sum(val()) | condition val() > 50應變措施建議:請參閱「診斷流量不平衡和 TCP 重設」,調查連線黏著性或應用程式佇列飽和度。
在 CI/CD 中自動驗證路徑
將 Connectivity Tests 整合至部署管道,在路由傳送實際工作環境流量前,先靜態驗證網路路徑。使用 gcloud CLI 驗證新部署的工作負載是否能連上外部依附元件 (例如資料庫和 API),且不會遭到政策封鎖。
指令範例:
gcloud network-management connectivity-tests create test-prod-db-egress \ --source-gke-pod=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/k8s/namespaces/prod/pods/my-app-pod \ --destination-ip-address=10.240.0.100 \ --protocol=TCP \ --destination-port=5432
啟用 Observability Analytics,進行視覺化流程分析
如要啟用虛擬私有雲流量的視覺化分析 (不需使用 SQL),請升級 GKE 記錄檔 bucket (通常是 _Default bucket),以使用 Observability Analytics。平台管理員可運用 Flow Analyzer 調查流量分配情形和資料傳輸費用。詳情請參閱「使用 Flow Analyzer 分析叢集流量成本和效能」。
Terraform 自動化:可觀測性即程式碼
如要一致地實作這項可觀測性架構,並避免手動設定錯誤,請使用下列 Terraform 設定部署遙測管道 (需要 google-beta 供應商):
# Configure the VPC Subnet with VPC Flow Logs enabled and all metadata included
resource "google_compute_subnetwork" "gke_subnet" {
name = "gke-subnet"
ip_cidr_range = "10.0.0.0/20"
region = "us-central1"
network = google_compute_network.custom.id
# Enable VPC Flow Logs. flow_sampling is the secondary sampling rate, which
# applies to flow log entries after they are generated. The primary packet
# sampling rate is dynamic and isn't configurable.
log_config {
aggregation_interval = "INTERVAL_5_SEC"
flow_sampling = 0.5 # Default rate; satisfies the LIGHT org policy tier
metadata = "INCLUDE_ALL_METADATA"
}
}
# Configure GKE Cluster with Dataplane V2, Intranode Visibility, and Hubble
resource "google_container_cluster" "primary" {
provider = google-beta
name = "gke-observability-cluster"
location = "us-central1"
network = google_compute_network.custom.id
subnetwork = google_compute_subnetwork.gke_subnet.id
# Enable Dataplane V2 (Required for all advanced telemetry)
datapath_provider = "ADVANCED_DATAPATH"
# Enable Intranode Visibility (ensures local node pod-to-pod traffic hits the VPC)
enable_intranode_visibility = true
# Enable Managed Service for Prometheus (GMP)
monitoring_config {
enable_components = ["SYSTEM_COMPONENTS"]
managed_prometheus {
enabled = true
}
# Enable Dataplane V2 Flow Observability (Hubble Relay and metric exposure)
advanced_datapath_observability_config {
enable_metrics = true
enable_relay = true
}
}
}
# Upgrade the Default log bucket to use Log Analytics (required for Flow Analyzer)
resource "google_logging_project_bucket_config" "default_analytics" {
project = var.project_id
location = "global"
bucket_id = "_Default"
enable_analytics = true
}
# Define a baseline static path validation test (Pod to external internet gateway)
resource "google_network_management_connectivity_test" "pod_to_internet" {
name = "pod-to-internet-egress"
source {
gke_pod = "projects/${var.project_id}/locations/us-central1/clusters/${google_container_cluster.primary.name}/k8s/namespaces/prod/pods/my-app-pod"
}
destination {
ip_address = "8.8.8.8"
port = 443
}
protocol = "TCP"
}
成本最佳化和雜訊抑制
網路遙測 (指標和記錄) 可能會產生大量資料,導致擷取和儲存費用偏高。請使用下列策略,在不影響重要流量可視度的情況下,盡量減少遙測資料收集作業:
停用允許的連線記錄
根據預設,NetworkPolicy 記錄會擷取允許和拒絕的連線。
允許的連線會佔據大部分的記錄量 (通常是 99% 以上的流量)。您可以更新叢集的NetworkLogging設定,只擷取遭拒連線 (捨棄),大幅降低記錄費用:
將下列資訊清單儲存為
network-logging-config.yaml:apiVersion: networking.gke.io/v1alpha1 kind: NetworkLogging metadata: name: default spec: cluster: allow: log: false # Disable logging for allowed traffic delegate: false deny: log: true # Keep logging for blocked traffic (critical for security/triage) delegate: false套用設定:
kubectl apply -f network-logging-config.yaml
透過註解委派記錄作業
如要精細控管費用,請在 NetworkLogging 自訂資源中設定 delegate: true,將記錄作業委派給註解。這項設定可確保下列事項:
- 只有在相符的 NetworkPolicy 具有
policy.network.gke.io/enable-logging: "true"註解時,系統才會記錄允許的流量。 - 只有在以
policy.network.gke.io/enable-deny-logging: "true"註解的命名空間中,系統才會記錄遭拒的 Pod 物件流量。
這項設定可讓您只為高度關鍵的工作負載 (例如付款閘道) 啟用記錄功能,同時忽略低風險的服務。
調整虛擬私有雲流量記錄取樣率
在 Terraform 設定 (或 Google Cloud 控制台) 中,只在需要流量和費用匯總資料 (而非個別流量記錄) 的子網路上,降低次要取樣率。由於虛擬私有雲流量記錄會根據取樣封包估算總流量,因此位元組和封包計數仍可用於以較低的速率進行成本分析。請勿將flow_sampling費率設為低於0.1,也就是滿足ESSENTIAL層級constraints/compute.requireVpcFlowLogs機構政策的最低費率:
resource "google_compute_subnetwork" "gke_subnet" {
# ... other subnet configs ...
log_config {
aggregation_interval = "INTERVAL_5_SEC"
flow_sampling = 0.1 # ESSENTIAL tier: volume and cost analysis, not per-flow troubleshooting
metadata = "INCLUDE_ALL_METADATA"
}
}
下表彙整了次要取樣率,以及對應的 constraints/compute.requireVpcFlowLogs 機構政策層級:
| 次級取樣率 | 組織政策層級 | 適用情況 |
|---|---|---|
1.0 |
COMPREHENSIVE |
持續需要進行流程鑑識或安全稽核的叢集。設定子網路時請選擇這個比率,因為事件發生後提高比率,也無法復原從未擷取的流程。 |
0.5 (預設) |
LIGHT |
支援叢集排解問題的子網路。這是預設費率,也是建議的基準。 |
0.1 |
ESSENTIAL |
您需要流量和費用匯總資料,而非個別流量的子網路。 |
套用 Cloud Logging 排除項目
直接在 Cloud Logging 接收器層級排除雜訊或不相關的記錄 (例如kube-system內部流量)。在 _Default 接收器中新增排除篩選器,捨棄內部中繼資料或系統 Pod 記錄:
resource.type="gce_subnetwork" AND
log_name:"projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" AND
jsonPayload.src_gke_details.pod.pod_namespace="kube-system"
最佳做法和作業提示
部署及維護叢集遙測管道時,請考量下列作業指南:
視需要啟用 GKE Dataplane V2 流量觀測功能:流量觀測功能 (
hubble-relay) 可能會造成輕微的額外負擔。如果是正式版叢集,您可以在偵錯期間啟用這項功能,之後停用這項功能,盡量減少節點的資源消耗:gcloud container clusters update CLUSTER_NAME \ --enable-dataplane-v2-flow-observability \ --location=LOCATION啟用節點內瀏覽功能:根據預設,相同節點上兩個 Pod 物件之間的流量不會離開節點,因此虛擬私有雲流量記錄無法看到這類流量。Autopilot 叢集預設會啟用「掌握節點內流量」功能,Standard 叢集則預設會停用這項功能,包括使用 GKE Dataplane V2 的 Standard 叢集。啟用節點內可視性會透過 VPC 轉送此流量,並確保 VPC 防火牆規則和流量記錄檔會持續套用。
瞭解 Service VIP 解析行為:Kubernetes Service 虛擬 IP (VIP) 解析為後端 Pod IP 位址後,傳輸層 (OSI 第 4 層) 指標會將其計為 Pod 對 Pod 流量。如要追蹤原本的目標服務 VIP,請在連線交握期間使用 Hubble CLI 即時流量。
比對指標和記錄的時間戳記:調查事件時,請將 Cloud Monitoring 指標的尖峰與在 Cloud Logging 或 Hubble CLI 中查詢記錄的確切時間範圍相互關聯,確保您分析的是同一事件。