パート8: eBPFデータパス内部構造のクイズ
Cilium 1.20.2 · 2026-10-15
Cilium 1.20では、カーネルが対応している場合、デバイスごとのプログラムにどのattach方式を使いますか。対応していない場合はどうなりますか?
- A) 常に従来の
clsactフィルターを使う。tcxはnetkitでのみ使う - B) tcxの
bpf_link(カーネル6.6以降)を使う。対応していない場合はclsact+cls_bpfのdirect-actionを使う - C) すべてのvethでXDPを使う。対応していない場合はagentの起動を拒否する
- D) すべてのインターフェイスでcgroupフックを使う。対応していない場合はiptablesを使う
回答を表示
回答: B) tcxの
bpf_link(カーネル6.6以降)を使う。対応していない場合はclsact+cls_bpfのdirect-actionを使うbpf.enableTCXのデフォルトはtrueです。リンクは/sys/fs/bpf/cilium/...以下にpinされ、reload時にアトミックに更新されます。tc-bpfもtcxも動作しない場合に限り、agentは失敗します。- A) 常に従来の
同じノード内のPod間トラフィックはBPFホストルーティングと
bpf_redirect_peerを使います。宛先Podのingressポリシーはどこで適用されますか?- A) 送信元の
bpf_lxcプログラムがcilium_call_policy[destination endpoint ID]をtail callする - B) 宛先vethのtc egressフックが、送信元エンドポイント用にpinされたポリシーマップを使って適用する
- C) agentが各エンドポイントの宛先netnsに設定したiptablesチェーン
- D) パケットがvethに到達する前に、ノードNICのXDPプログラムが適用する
回答を表示
回答: A) 送信元の
bpf_lxcプログラムがcilium_call_policy[destination endpoint ID]をtail callするredirect_peerは宛先側のtc egressフックを通らないため、宛先のcil_lxc_policyはglobal prog arrayに保存され、送信側から呼び出されます。空のスロットはDROP_EP_NOT_READYになります。- A) 送信元の
エンドポイントごとのポリシーマップ
cilium_policy_v3_<id>の型とキー構造は何ですか?- A) リモートPodのIPアドレスと宛先ポートをキーとするHASH
- B) ポート番号をインデックスとし、プロトコルごとに1スロットを持つARRAY
- C) ポリシールール番号をインデックスとし、ルールごとのプログラムをtail callするPROG_ARRAY
- D) ID、方向、プロトコル、ポートプレフィックスをキーとするLPM_TRIE
回答を表示
回答: D) ID、方向、プロトコル、ポートプレフィックスをキーとするLPM_TRIE
キーには
sec_label、egressビット、protocol、dportが含まれます。ポートプレフィックスを使うと、ポート範囲を少数のエントリで保存できます。また、sec_labelが0の場合はL3のワイルドカードとして動作します。チュートリアルに、Cilium 1.20でオーバーレイ宛先のリモートノードを調べるには
cilium_tunnel_mapを確認するとあります。正しい説明はどれですか?- A)
cilium-dbg bpf tunnel listでノードからエンドポイントへのテーブルを表示する - B) マップは存在するが、IPsecまたはWireGuard暗号化を有効にした場合だけ使用される
- C) マップはなくなり、トンネルエンドポイントは
cilium_ipcache_v2の値のフィールドに格納されている - D) マップがエンドポイント単位の
cilium_tunnel_map_<id>になり、ノードごとに1つのエントリを持つ
回答を表示
回答: C) マップはなくなり、トンネルエンドポイントは
cilium_ipcache_v2の値のフィールドに格納されている1.20のBPFコードで
cilium_tunnel_mapを参照する箇所はありません。cilium_ipcache_v2(LPM_TRIE)はflag_has_tunnel_epとともにsec_identityとtunnel_endpointを返します。cilium-dbg bpf ipcache listを使ってください。- A)
1.20.2における
--bpf-map-dynamic-size-ratioのデフォルトと、サイズを決める対象のマップはどれですか?- A) RAMの0.0025。CT、NAT、NodePort neighbor、socket reverse-NATマップ
- B) 0(無効)。
--bpf-policy-map-maxでサイズが決まるポリシーマップだけ - C) RAMの0.25。LBマップとipcacheを含むすべてのBPFマップ
- D) RAMの0.0025。ipcacheとポリシーマップだけ
回答を表示
回答: A) RAMの0.0025。CT、NAT、NodePort neighbor、socket reverse-NATマップ
動的サイズ設定はデフォルトで有効です。
--bpf-ct-global-tcp-maxなどのサイズ指定フラグを設定すると、そのマップだけ動的サイズ設定が無効になります。LBマップには代わりに--bpf-lb-map-maxを使います。--bpf-lb-map-max(デフォルト65536)は何を制御しますか?- A)
cilium_lb4_services_v2マップだけを制御し、バックエンドとrev-NATはそれぞれのデフォルト値のままにする - B) Serviceごとのバックエンド数を制御し、上限を超えたエンドポイントを拒否する
- C) 固定リストから素数を選ぶ必要があるMaglev検索テーブルのサイズ
- D) LBマップごとにある6つのフラグ(services、backends、rev-NAT、affinity、source-range、Maglev)で使うフォールバックサイズ
回答を表示
回答: D) LBマップごとにある6つのフラグ(services、backends、rev-NAT、affinity、source-range、Maglev)で使うフォールバックサイズ
マップごとの6つのフラグはそれぞれデフォルトが0であり、「
lb-map-maxを使う」という意味です。Maglevテーブルのサイズは別のフラグで指定します。サイズ変更ではマップを再作成するため、再投入されるまで接続が中断します。- A)
socket-LBが有効な場合、ClusterIPはどこで変換されますか。また、応答でアプリケーションからServiceアドレスが見えるのはなぜですか?
- A) すべてのパケットでveth上のDNATによって変換され、応答経路では
cilium_lb4_reverse_natが元に戻す - B) cgroupフックが
connect()/sendmsg()で変換し、recvmsg/getpeernameフックがcilium_lb4_reverse_skを使って元に戻す - C) ホストnetnsのkube-proxy iptables DNATで変換し、conntrackが元のアドレスに戻す
- D) パケットがスタックに到達する前にNICのXDPで変換し、Hubble relayが元に戻す
回答を表示
回答: B) cgroupフックが
connect()/sendmsg()で変換し、recvmsg/getpeernameフックがcilium_lb4_reverse_skを使って元に戻すネットワーク上ではDNATが行われないため、Pod内の
tcpdumpにはバックエンドIPが表示されます。cilium_lb4_reverse_natを使うパケット単位の経路は、socket-LBが適用されない場合(たとえばhost-namespace-onlyモード、L7 LB、SCTP)に限り使われます。- A) すべてのパケットでveth上のDNATによって変換され、応答経路では
オーバーレイモードでパケットが
cilium_vxlanに到着すると、cil_from_overlayはどのように送信元IDを取得しますか?- A) 送信元IDを設定した送信側が付与したトンネルID(VNI)を、
bpf_skb_get_tunnel_keyで読み取る - B) 外側の送信元IPを
cilium_lxcで検索する。このマップはノードIPとIDを対応付ける - C) ローカルEnvoyプロキシがリクエストへ追加したHTTPヘッダーを読む
- D) エンドポイントラベルキャッシュを使って送信元Pod名からIDを解析する
回答を表示
回答: A) 送信元IDを設定した送信側が付与したトンネルID(VNI)を、
bpf_skb_get_tunnel_keyで読み取るトンネルIDにhost IDが入っている場合は
DROP_INVALID_IDENTITYで拒否されます。ネイティブルーティングにはVNIがないため、送信元IPからcilium_ipcache_v2を使って送信元IDを取得します(またはIPsec/WireGuard利用時にはmarkから取得します)。- A) 送信元IDを設定した送信側が付与したトンネルID(VNI)を、
管理者がCiliumNetworkPolicyを編集すると、agentはデータパスに何を行いますか?
- A) 影響するエンドポイントごとにclangで
bpf_lxc.cを再コンパイルし、そのveth上のプログラムを再読み込みする - B) 新しいポリシーをアトミックに反映するため、すべてのデバイスでpin済みtcxリンクを置き換える
- C)
cilium_policy_v3_<id>のエントリを更新する。プログラムを再読み込みするのは、エンドポイントまたはノード設定のハッシュが変わった場合だけ - D) すべてのエンドポイントでプログラムを再生成するため、Cilium agent Podを再起動する
回答を表示
回答: C)
cilium_policy_v3_<id>のエントリを更新する。プログラムを再読み込みするのは、エンドポイントまたはノード設定のハッシュが変わった場合だけポリシーの変更はマップ操作(
RegenerateWithoutDatapath)です。テンプレートオブジェクトはtemplate-config hashごとにキャッシュされ、エンドポイントごとの値は.rodata.configに保存されます。- A) 影響するエンドポイントごとにclangで
1.20のHubbleイベントパイプラインに関する正しい説明はどれですか?
- A) BPFがring bufferへ書き込み、Hubble Relayが各ノードのBPF filesystemから直接読み取る
- B) イベントは
cilium_events(perf array)に入り、agent monitorとHubble queueを経由して4095 flowを保持するメモリ内ringに入る - C) agentがflowをディスクに保存し、再起動後にHubble Relayへ再生する
- D) L7イベントはプロキシリダイレクトマップが一致した際に、
bpf_lxctailプログラムが生成する
回答を表示
回答: B) イベントは
cilium_events(perf array)に入り、agent monitorとHubble queueを経由して4095 flowを保持するメモリ内ringに入るperf_event_ring_bufferでの損失やobserver_events_queueでの損失が発生することがあります。L7レコードはBPFではなく、EnvoyとDNSプロキシからagentイベントとして送られます。