Terway Datapath V2 の conntrack、アイデンティティ、BPF マップのパラメーターを調整して、クラスターのパフォーマンスと安定性を向上させます。
conntrack 設定の最適化
Datapath V2 は、コンテナネットワークに eBPF ベースの conntrack を使用します。高同時実行ワークロード向けに conntrack テーブルサイズや TCP タイムアウトなどのパラメーターを調整するには、「Terway の conntrack 設定の最適化」をご参照ください。
アイデンティティ数の制限
Datapath V2 モードでは、NetworkPolicy は Netfilter の代わりに eBPF を使用して各 Pod にアイデンティティを割り当て、きめ細かいネットワークアクセス制御を実現します。
アイデンティティは、Pod ラベルと namespace ラベルで構成されます。同じラベルを持つ Pod は、ネットワークアクセス管理のために 1 つのアイデンティティを共有します。
トラフィックを配信する前に、システムは Pod の IP アドレスとアイデンティティに基づいて NetworkPolicy ルールをチェックします。
-
NetworkPolicy 機能が無効になっている場合、アイデンティティは使用されず、Terway は自動的にアイデンティティの数を制限します。
-
NetworkPolicy を有効にした後、同じアイデンティティを持つ Pod が同じラベルを共有していることを確認してください。ラベルが異なると過剰なアイデンティティが生成され、コントロールプレーンのワークロードが増加し、IP 割り当てが遅くなります。
無効なラベルによる過剰なアイデンティティを防ぐために、ラベルフィルタリングルールを設定します。
-
ラベルフィルタリングルールを変更すると、一時的に新しいアイデンティティが作成され、API サーバーのオーバーヘッドが増加します。
-
ラベルフィルタリングルールが正しくないと、NetworkPolicy ルールが失敗する可能性があります。
-
すべてのラベルをフィルターしないでください:Pod グループごとに少なくとも 1 つのラベル (namespace または Pod) を保持してください。そうしないと、システムがアイデンティティを認識できなくなります。
-
フィルターされたラベルは NetworkPolicy ルールで参照できません。ポリシーで使用されていないラベルのみをフィルターしてください。
-
ラベルフィルタリングの構文については、Cilium のドキュメントをご参照ください。
Terway でこれを設定するには、「Terway 設定パラメーターのカスタマイズ」にある cilium_args パラメーターをご参照ください。
アイデンティティの数は、Pod あたりのポリシーマップエントリに直接影響します。ポリシーマップのキャパシティは bpf-policy-map-max (デフォルト:16384、エンドポイントあたりの最大値:65536) によって制御されます。「bpf-policy-map-max」をご参照ください。
BPF マップ使用率のモニタリング
BPF マップがいっぱいになると、Pod のネットワーク問題やサービスエントリのプログラミング失敗を引き起こす可能性があります。本番クラスターでは Cilium エージェントの Prometheus メトリクスのスクレイピングを有効にし、BPF マップの使用率に対するアラートを設定することを強く推奨します。
Prometheus メトリクスの有効化
Datapath V2 は Cilium エージェントのメトリクスエンドポイントを再利用します。Terway の ConfigMap にある cilium_args に --prometheus-serve-addr 引数を追加します。
"cilium_args": "--prometheus-serve-addr=:9962"
-
:9962は Cilium の規約上のメトリクスポートです (無効にするには空文字列に設定します)。0.0.0.0でリッスンするため、Pod の hostNetwork ポートから直接スクレイピングできます。 -
変更を有効にするには、terway-eniip Pod を再起動します。
-
Pod またはサービスにスクレイピング用のアノテーションを追加するか、自動的な Prometheus ディスカバリのために ServiceMonitor を作成します。
metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "9962" prometheus.io/path: "/metrics"
メトリクスポートへの外部アクセスを防ぐために、クラスターに適切なセキュリティグループを設定してください。
主要な BPF マップメトリクス
一部のメトリクスには Terway v1.14.0 以降が必要です。最新バージョンにアップグレードしてください。
|
メトリクス |
タイプ |
説明 |
|
|
ゲージ |
最も重要。現在のエントリ数と |
|
|
ゲージ |
マップのキャパシティ ( |
|
|
カウンター |
マップ操作のカウンターで、 |
|
|
ゲージ |
すべてのマップが使用する最大仮想メモリで、ノードのメモリプレッシャーの監視に使用します。 |
アラートとクエリの例
# いずれかの BPF マップの使用率が 5 分間 80% を超えた場合にアラートを発行
max by (map_name) (cilium_bpf_map_pressure) > 0.8
# 各ノードの LB Service Map の使用率
cilium_bpf_map_pressure{map_name=~"cilium_lb[46]_services_v2"}
# 各エンドポイントの Policy Map の使用率 (トップ 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
# マップ書き込み失敗率
sum by (map_name) (rate(cilium_bpf_map_ops_total{operation="update",outcome="fail"}[5m])) > 0
cilium_bpf_map_pressure が継続的に 0.8 を超える場合は、「BPF マップキャパシティのチューニング」セクションで説明されているように、対応するパラメーターを調整してください。値が 0.95 を超える場合は緊急事態であり、エントリのプログラミング失敗を防ぐために、直ちにキャパシティを拡張する必要があります。
BPF マップキャパシティのチューニング
Datapath V2 は、作成時に max_entries が固定され、実行時に拡張できない BPF マップを使用します。マップがいっぱいになると、update の失敗、Pod トラフィックの異常、新しいアイデンティティやサービスエントリのブロックを引き起こす可能性があります。「BPF マップ使用率のモニタリング」セクションのメトリクスを使用して、マップのサイズを事前に評価し、調整してください。
BPF マップのサイズを調整するには、マップを再作成するために Cilium エージェント (terway-eniip Pod) を再起動する必要があります。
再起動中、エージェントは conntrack とサービスエントリを再投入するため、一時的に接続のジッターが発生する可能性があります。ローリングアップデート戦略を用いて、オフピーク時に実行してください。
パラメーターの概要
|
パラメーター |
影響を受ける機能 |
デフォルト値 |
値の範囲 |
調整するタイミング |
|
|
コネクショントラッキングと NAT:ノード上の同時接続 (CT) と NAT エントリの数を制御します。 |
|
|
ノードが高同時実行または長寿命接続のワークロードを実行しており、CT/NAT マップへのプレッシャーが高い場合。 |
|
|
NetworkPolicy (Pod ごと):Pod ごとのポリシールールの数 (許可されるピアアイデンティティ × ポート/プロトコルの組み合わせ) を制御します。いっぱいになると、ポリシーのプログラミングが切り捨てられ、適用が意図と一致しない可能性があります。 |
|
|
NetworkPolicy が有効になっており、アイデンティティの数が多いか、単一の Pod が広範囲のピアと通信する場合。 |
|
|
Kubernetes Service (全ノード):Kubernetes のサービスとエンドポイントエントリの総数を制御します。いっぱいになると、新しいサービスやバックエンドをプログラミングできず、Service IP が到達不能になる可能性があります。 |
|
厳密な上限なし (メモリによる制約)。 |
サービス数、各サービスのバックエンド Pod 数、およびポート/プロトコルの組み合わせを考慮して計算される合計エントリ数が、デフォルトの 65536 に近づいた場合。 |
|
|
クラスターノードのスケール:クラスターノードの最大数を制御します。 |
|
|
クラスター内のノード数が 16,000 に近づいた場合。 |
これらのパラメーターを 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 — のキャパシティは、このパラメーターとノードの物理メモリから動的に計算されます。 -
値の範囲:
(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](マップあたり約 1 GiB のメモリ) にクランプされます。マップあたりの最大エントリ数:2^24 = 16,777,216。 -
チューニングの推奨事項:
-
高同時実行ノード (ノードあたり 10,000 以上の長寿命接続) の場合、大容量メモリノードでより多くの CT/NAT エントリを許可するために、
0.005–0.01に増やしてください。 -
bpf-ct-global-tcp-max、bpf-ct-global-any-max、またはbpf-nat-global-maxが明示的に設定されているマップは影響を受けません。 -
BPF マップ使用率のモニタリングでcilium_ct4_globalなどのマップのcilium_bpf_map_pressureが継続的に 0.8 を超える場合は、この比率を調整するか、影響を受けるマップのキャパシティを明示的に設定してください。
-
bpf-policy-map-max
-
スコープ:各 Pod は、データプレーンの NetworkPolicy 適用のために、許可されたピアアイデンティティ、ポート、プロトコルの組み合わせを格納する独自の
cilium_policy_*マップを持ちます。 -
デフォルト値:
16384。最小値:256(2^8)、最大値:65536(2^16)。範囲外の値は警告とともにクランプされます。 -
調整するタイミング:
-
クラスターで NetworkPolicy が有効になっており、アイデンティティの数が多い場合 (「
アイデンティティ数の制限」を参照)。 -
単一の Pod に対するピアアイデンティティと公開されているポート/プロトコルの組み合わせの積が 16384 に近づく場合。
-
メトリクス
cilium_bpf_map_pressure{map_name=~"cilium_policy_.*"}が継続的に 0.8 を超える場合。
-
-
調整方法:Terway の ConfigMap にある
cilium_argsに--bpf-policy-map-max=32768を追加し、terway-eniip Pod を再起動します。 -
注意:マップあたりのメモリは
max_entriesに比例し、各ノードは Pod ごとに 1 つのマップをホストします。評価なしに 65536 を設定すると、ノードのメモリオーバーヘッドが大幅に増加します。
bpf-node-map-max
-
機能:クラスターが認識できるノードの最大数を制御します。ノード間通信、IPsec/WireGuard 暗号化、およびエグレスゲートウェイのために、単一のグローバルマップにノード ID と IP のマッピングを格納します。いっぱいになると、新しいノードが認識できなくなり、ノード間トラフィックの障害を引き起こします。
-
スコープ:ノード間通信、暗号化、およびエグレスゲートウェイのためにクラスター全体で共有される単一の
cilium_node_map_v2マップ。 -
デフォルト値:
16384(約 16,000 の一意のノード IP を保持可能)。 -
制限:ソースコードは、デフォルトの 16384 より低い値を設定することを禁止しています。起動時に
bpf-node-map-max < 16384の場合、エージェントはエラーで終了します。上限:uint32(理論的には4,294,967,295)、ノードのメモリによって制約されます。 -
調整するタイミング:
-
クラスターサイズが 16,000 ノードに近づいている場合、または 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 サービス — ClusterIP、NodePort、および LoadBalancer — のデータプレーンキャパシティを制御します。これには、バックエンド、リバース NAT、セッションアフィニティ、および Maglev ハッシュテーブルが含まれます。いっぱいになると、新しいサービスやバックエンドをプログラミングできなくなり、到達不能なサービス IP やエンドポイント更新の遅延を引き起こします。
-
スコープ:
cilium_lb{4,6}_services_v2(ClusterIP および NodePort のロードバランシングエントリ) と、以下の LB サブマップのキャパシティを設定します (個別に上書きされない限り):-
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(64K)。いっぱいになると、Cilium はサービスエンドポイントを更新できなくなり、接続性や新しいサービスの作成に影響を与えます。 -
キャパシティの見積もり:サービスごとのエントリ数 = バックエンド Pod 数 × Service spec 内のポート/プロトコルの組み合わせ数。
必要な LB マップサイズを見積もります:
ClusterIP/NodePort サービスごとのエントリ数 = サービスに選択されたバックエンド Pod 数 × Service spec 内のポート/プロトコルエントリ数。
推定合計マップサイズ:
これは、サービスごとの Pod とポート/プロトコルエントリがほぼ正規分布していることを前提としています。著しい外れ値 (たとえば、多くのバックエンドを持つ 1 つのサービス) がある場合は、より詳細な見積もりを実行してください。
bpf-lb-map-max を調整して Cilium を再起動すると、エージェントがサービスエントリを再投入する間、接続が中断されます。