全部產品
Search
文件中心

Container Service for Kubernetes:Datapath V2下最佳實務

更新時間:May 20, 2026

本文介紹在使用Terway網路外掛程式的叢集中,啟用Datapath V2後如何最佳化叢集的網路設定,例如Conntrack參數配置、Identity資源管理等,以提升叢集效能和穩定性。

最佳化Conntrack配置

Conntrack是Linux核心中的串連跟蹤模組,用於跟蹤網路連接的狀態。在Datapath V2模式下,容器網路的Conntrack由eBPF程式提供。您可以參見最佳化Terway模式下conntrack配置來調整Conntrack參數,例如調整Conntrack表大小、調整TCP連結記錄逾時時間,以適配高並發服務等情境下的網路需求。

限制Identity數量

在 Datapath V2 功能中,NetworkPolicy通過 eBPF 技術實現。與傳統的基於 Netfilter 的方式不同,在 eBPF 的實現中,系統會為每個 Pod 分配一種 Identity作為身份ID標識,用於精準管理網路許可權。

Identity由 Pod 標籤和Namespace標籤組合而成,具有相同標籤組合的 Pod 會被分配同一個 Identity,以便統一管控它們的網路訪問規則。

NetworkPolicy的規則會通過 IP-Identity 映射來判斷流量是否符合策略。簡單來說,系統會使用 Pod 的 IP 地址與其 Identity,判斷是否允許該流量通過。

  • 若您沒有開啟NetworkPolicy功能,Identity無任何作用,Terway會自動限制Identity數量。

  • 若您啟用NetworkPolicy功能,您應當避免一組相同身份的Pod,具備不同的標籤。使用不同標籤會產生大量Identity資源,可能會造成叢集管控壓力升高,IP分配速度下降。

通過配置標籤過濾,可以避免無效的標籤被記錄到Identity中。

重要
  • 調整標籤過濾規則會觸發Identity建立,短時間內Identity數量會增加,API Server資源開銷也會有不同程度的增加。

  • 配置錯誤的標籤過濾規則會導致NetworkPolicy策略失效。

    • 不可過濾所有標籤:需為每組 Pod 保留至少一個標籤(Namespace 或 Pod 標籤),否則系統將無法識別該 Pod 的身份。

    • 被過濾的標籤無法用於策略規則:如果某個標籤被添加到過濾列表中,該標籤將無法在 NetworkPolicy 規則中被引用。請確保僅過濾無效標籤。

關於配置標籤過濾的文法,請參見Cilium

關於在Terway中如何配置,請參見自訂Terway配置參數cilium_args相關內容。

Identity 數量直接影響每個 Pod 的 Policy Map 條目數。Policy Map 容量由 bpf-policy-map-max 控制(預設 16384,單 Endpoint 上限 65536),詳見bpf-lb-map-max

監控 BPF Map 使用率

BPF Map 一旦填滿,會導致 Pod 網路異常或服務條目下發失敗,因此強烈建議在生產叢集中開啟 Cilium Agent 的 Prometheus 指標採集,並對各類 BPF Map 設定使用率警示。

啟用 Prometheus 指標

Datapath V2 複用 Cilium Agent 的指標端點。在 Terway ConfigMap 的cilium_args中追加--prometheus-serve-addr

"cilium_args": "--prometheus-serve-addr=:9962"
  • :9962是 Cilium 上遊約定的 metrics 連接埠;置Null 字元串關閉。監聽在0.0.0.0,可通過 Pod 的 hostNetwork 連接埠直接抓取。

  • 修改後重啟 terway-eniip Pod 生效。

  • 在 Pod/Service 上添加抓取註解,或編寫 ServiceMonitor,使叢集內 Prometheus 自動探索:

    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9962"
        prometheus.io/path: "/metrics"
重要

請為叢集設定合適的安全性群組,避免 metrics 連接埠被外部存取。

重點關注的 BPF Map 指標

部分指標在Terway >=v1.14.0 版本後才提供,請升級至最新版本。

指標名

類型

說明

cilium_bpf_map_pressure

Gauge

最重要。Map 當前條目占max_entries的比例,按 map_name 標籤區分。僅當佔用 ≥0.1(10%)後才會上報。

cilium_bpf_map_capacity

Gauge

Map 容量max_entries,按map_group標籤分組;容量為 65536 的 Map 統一歸到 default 組。

cilium_bpf_map_ops_total

Counter

Map 操作計數,按map_name/operation/outcome標籤區分,可用於發現update失敗激增。

cilium_bpf_maps_virtual_memory_max_bytes

Gauge

所有 Map 佔用的虛擬記憶體上限,監控節點記憶體壓力。

推薦警示與查詢樣本

# 任意 BPF Map 使用率超過 80% 持續 5 分鐘
max by (map_name) (cilium_bpf_map_pressure) > 0.8

# 每個節點的 LB Service Map 使用率
cilium_bpf_map_pressure{map_name=~"cilium_lb[46]_services_v2"}

# 每個 Endpoint 的 Policy Map 使用率(Top 10)
topk(10, cilium_bpf_map_pressure{map_name=~"cilium_policy_.*"})

# Node Map 容量警示(>80% 即應擴容 bpf-node-map-max)
cilium_bpf_map_pressure{map_name="cilium_node_map_v2"} > 0.8

# 全域 Conntrack Map 壓力(與 bpf-map-dynamic-size-ratio 調優聯動)
cilium_bpf_map_pressure{map_name=~"cilium_ct.*_global"} > 0.7

# Map 寫入失敗速率
sum by (map_name) (rate(cilium_bpf_map_ops_total{operation="update",outcome="fail"}[5m])) > 0

觀察到cilium_bpf_map_pressure持續超過 0.8,應對照BPF Map 容量調優章節按 Map 類別調整對應參數;超過 0.95 時應視為緊急情況立即擴容,否則可能在短時間內出現條目下發失敗。


BPF Map 容量調優

Datapath V2 依賴很多 BPF Map來進行工作,MAP 一旦建立,其max_entries就被固定下來,運行期無法擴容;如果填滿,會出現 update 失敗、Pod 流量異常、Identity/服務條目無法下發等問題。建議結合監控 BPF Map 使用率章節中的指標提前評估並調整。

警告

調整任何 BPF Map 大小都需要重啟 Terway 節點上的 Cilium Agent(即重啟 terway-eniip Pod)以重建 Map。

重建過程中已有串連的 Conntrack/服務條目需要重新填充,可能造成短暫的串連抖動。請避開業務高峰,並分批滾動。

參數總覽

參數

影響功能

預設值

取值範圍

何時調整

bpf-map-dynamic-size-ratio

串連跟蹤與 NAT:節點上可同時存活的 TCP/UDP 串連數、NodePort / SNAT 翻譯條目數。表滿 → 建立串連失敗、丟包

0.0025

(0.0, 1.0]

節點跑高並發或長串連業務,CT/NAT Map 壓力偏高

bpf-policy-map-max

NetworkPolicy(每個 Pod):單個 Pod 資料面可承載的策略規則數(允許通訊的 Identity × 連接埠/協議 組合)。表滿 → 策略規則下發被截斷,行為不符合預期

16384

[256, 65536]

啟用了 NetworkPolicy,且 Identity 較多或單 Pod 訪問的對端範圍廣

bpf-lb-map-max

Kubernetes Service(全節點):ClusterIP / NodePort / LoadBalancer 在資料面下發的條目總數。表滿 → 新 Service 或後端 Pod 無法下發,Service IP 不通

65536

不強制上限(受記憶體約束)

叢集 Service 數 × 平均後端 Pod 數 接近預設 64K

bpf-node-map-max

叢集節點規模:可識別的 Node ID ↔ IP 映射數;跨節點 Pod 通訊、IPsec/WireGuard 加密、Egress Gateway 都依賴此表。表滿 → 新加入的節點無法參與資料面

16384

≥ 16384

叢集節點數接近 5000

通過 Terway ConfigMap 的 cilium_args 欄位統一配置,例如:

"cilium_args": "--bpf-map-dynamic-size-ratio=0.005 --bpf-policy-map-max=32768 --bpf-lb-map-max=131072"

關於在Terway中如何配置,請參見自訂Terway配置參數cilium_args相關內容。

bpf-map-dynamic-size-ratio

  • 功能:決定節點上同時可跟蹤的串連數與 NodePort/SNAT 翻譯條目數。表的容量 = 節點實體記憶體 × 此比例 / 單條記錄大小,容量滿時新串連無法建立,已有串連也可能被驅逐導致丟包。

  • 作用範圍:CT (cilium_ct4_global / cilium_ct_any4_global)、NAT (cilium_snat_v4_external)、Neighbor (cilium_nodeport_neigh4)、SockRevNAT 這幾張全域 Map 的容量,會按本參數 × 節點實體記憶體的比例動態計算

  • 取值範圍(0.0, 1.0],預設 0.0025(即約 0.25% 的實體記憶體)。

  • 典型推算(參考 Cilium 預設元素大小):

    節點實體記憶體

    CT TCP 條目

    CT Any 條目

    NAT 條目

    512 MiB

    33,140

    16,570

    33,140

    1 GiB

    66,280

    33,140

    66,280

    4 GiB

    265,121

    132,560

    265,121

    16 GiB

    1,060,485

    530,242

    1,060,485

  • 上下限保護:動態計算結果會被鉗制到 [1Ki, 16Mi](約 1GiB 記憶體/張 Map)之間,單 Map 上限為 2^24 = 16,777,216 條目。

  • 調優建議

    • 高並發服務(每節點萬級以上長串連)的節點,建議適度提升至 0.005~0.01,讓 CT/NAT 在大記憶體節點上獲得更多條目。

    • 顯式設定了bpf-ct-global-tcp-max/bpf-ct-global-any-max/bpf-nat-global-max的 Map 不會被本參數覆蓋。

    • 如果通過監控 BPF Map 使用率觀察到 cilium_ct4_global 等 Map 的cilium_bpf_map_pressure持續 >0.8,應優先調整本比例或為相應 Map 顯式指定容量。

bpf-policy-map-max

  • 作用範圍:每個 Endpoint(每個 Pod)獨立持有一張 cilium_policy_* Map,存放允許該 Endpoint 收發流量的對端 Identity × 連接埠/協議 條目,用於 NetworkPolicy 資料面執行。

  • 預設值16384最小值 256 (2^8),最大值 65536 (2^16);超出範圍會被自動裁剪並列印 warning。

  • 何時需要調整

    • 叢集啟用了 NetworkPolicy 且 Identity 數量較多(參見限制Identity數量章節)。

    • 單個 Pod 需要訪問的對端 Identity 數 × 暴露連接埠/協議組合數接近預設 16384。

    • 通過指標 cilium_bpf_map_pressure{map_name=~"cilium_policy_.*"} 觀察到壓力持續 >0.8。

  • 調整方式:在 Terway ConfigMap 的cilium_args中追加 --bpf-policy-map-max=32768,重啟 terway-eniip Pod 生效。

  • 注意:每張 Map 佔用的記憶體與max_entries成正比,每個節點上 Map 數量等於該節點 Pod 數量。盲目設定到 65536 會顯著增加節點記憶體開銷,請結合實際 Identity 規模評估。

bpf-node-map-max

  • 功能:決定叢集可識別的最大節點規模。所有節點的 Node ID ↔ IP 映射存在這一張全域 Map 中,是跨節點 Pod 通訊、IPsec/WireGuard 加密、Egress Gateway 等節點級特性的基礎資料。表滿後新加入的節點無法被資料面識別,跨節點流量會失敗。

  • 作用範圍:單張 cilium_node_map_v2 存放叢集內所有 Node 的 Node ID ↔ IP 映射,用於跨節點 Pod 通訊、Encryption、Egress Gateway 等情境。

  • 預設值16384(約可承載 1.6 萬個唯一 Node IP)。

  • 限制:源碼寫入程式碼 不允許設定低於預設值 16384,啟動時如果 bpf-node-map-max < 16384 會直接報錯退出;上限受uint32約束(理論最大 4,294,967,295),但實際取決於節點記憶體。

  • 何時需要調整

    • 叢集規模即將逼近 1.6 萬節點,或開啟 IPsec/WireGuard 等需要每節點條目膨脹的功能時。

    • 通過指標 cilium_bpf_map_pressure{map_name="cilium_node_map_v2"} 觀察到壓力 >0.8。

  • 調整方式:在cilium_args中追加 --bpf-node-map-max=32768,重啟 terway-eniip Pod 生效。

說明

如果節點開啟雙棧或者擷取到其他地址,一個節點可佔用2、3個條目。

bpf-lb-map-max

  • 功能:決定全叢集 Kubernetes Service 在資料面的下發能力,覆蓋 ClusterIP、NodePort、LoadBalancer 三種類型,以及它們對應的後端、反向 NAT、會話親和性、Maglev 雜湊表等所有 LB 子 Map。表滿後,新建立的 Service / 新增的後端 Pod 無法寫入 BPF,表現為 Service IP 訪問不通或端點更新延遲。

  • 作用範圍:Cilium 使用名為 cilium_lb{4,6}_services_v2 的 LB Service Maps 來儲存 ClusterIP 和 NodePort 類型服務的負載平衡條目。本參數同時作為以下 LB 子 Map 的預設上限(如未單獨指定):

    • cilium_lb4_services_v2 / cilium_lb6_services_v2

    • cilium_lb4_backends_v3 / cilium_lb6_backends_v3

    • cilium_lb4_reverse_nat / cilium_lb6_reverse_nat

    • cilium_lb4_affinity / cilium_lb6_affinity

    • cilium_lb4_source_range / cilium_lb6_source_range

  • 預設值65536(64Ki)。如果此映射已滿,Cilium 可能無法更新服務端點,影響服務 IP 的連通性或建立新服務的能力。

  • 容量估算:每個 ClusterIP/NodePort 服務建立的條目數等於該服務後端 Pod 數 × Service spec 中連接埠/協議組合數。

服務 LB 映射所需的大小取決於多個因素。

每個 ClusterIP/NodePort 服務建立的條目數量等於該服務選擇的後端 Pod 數量乘以相應 Service spec 中的連接埠、協議條目數量。

利用這一點,我們可以粗略估算所需的映射大小為:

注意這種估算假設每個服務選擇的 Pod 數量和連接埠/協議條目數大致呈常態分佈。如果您的用例存在較大的異常值(例如,某個服務選擇了非常大量的 Pod 後端),則可能需要進行更詳細的估算。
警告

調整bpf-lb-map-max參數並重啟 Cilium 會導致串連中斷,因為新映射需要重新填充現有的服務條目。