作って、試して、壊せる!containerlab × kind で再現する BGP + Kubernetes 環境

404 Views

November 18, 25

スライド概要

11/18,19 に開催された CloudNative Days Winter 2025(CNDW2025) で発表した、花田 浩紀の資料です。

CloudNative Days Winter 2025
https://event.cloudnativedays.jp/cndw2025

作って、試して、壊せる!containerlab × kind で再現する BGP + Kubernetes 環境
https://event.cloudnativedays.jp/cndw2025/talks/2707

profile-image

サイボウズ株式会社の主に開発本部の資料を公開するアカウントです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

作って、試して、壊せる! containerlab × kind で再現する BGP + Kubernetes 環境 サイボウズ株式会社 Hiroki Hanada 2025/11/18 1

2.

自己紹介 花田 浩紀 (はなだ ひろき) 2025年に新卒でサイボウズ株式会社に入社 業務内容: • サイボウズのオンプレ Kubernetes クラスタの開発・運用 • Kubernetes ネットワーク周りのコンポーネントを担当 Cloud Native Days 初参加 github.com/hanapedia 2

3.

本発表の趣旨 前半: BGP ネットワークと kind クラスタを統合したローカル検証環境を containerlab を用いて宣言的に構築する方法を紹介 → デモ:実際にその kind クラスタで Cilium の native routing や L4LB を動かす 後半: 活用例として、サイボウズで実施した Cilium の BGP 機能の検証作業を紹介 3

4.

目次 背景: Kubernetes と BGP P05 前半: containerlab x kindで再現する BGP + Kubernetes 環境 P14 後半: サイボウズでの取り組み P37 Cilium の BGP コントロールプレーン移行 4

5.

Kubernetes と BGP 5

6.

Kubernetes と BGP Kubernetes のネットワーク クラスタに必要なネットワークの要件が定められている • 各 Pod にクラスタで一意な IP が付与され、Pod 同士が通信できる(Pod ネットワーク) • Pod の入れ替わりがあっても、継続的にアクセスポイントを提供できる(Service API) • アクセスポイントをクラスタ外にも公開できる(LoadBalancer, Gateway API) など どうやって通信を実現するかは自由 • L2, L3, or オーバーレイ。ルーティングできればなんでもよい 6

7.

Kubernetes と BGP BGP とは 主にインターネットで使われているルーティングプロトコル • tcp:179 でセッションを構築し、お互いの経路情報を交換(BGP ピアリング) • AS という単位で経路交換 7

8.

Kubernetes と BGP BGP とは 広報されてくる経路に付与された属性 Local Preference, AS Path length, Origin などを元に best path を選択 8

9.

Kubernetes と BGP IP Clos DC ネットワークでの BGP 活用 • ベンダーに依存せず耐障害性が高く、 スケーラブルなネットワークを構築可能 (IP Clos) • さらに、 DC ネットワークの BGP を Kubernetes の必要とするルーティングに 活用する動きも 9

10.

Kubernetes と BGP DC の BGP ネットワークを Kubernetes でも活用 Pod や Service が使用する IP の経路情報を、上流の DC ネットワークと BGP で交換 オーバーレイを用いない直接的なルーティング: • 余分なオーバーヘッドのない高性能な Pod 間通信が可能 柔軟な L3 ルーティング制御: • Pod IP や Service IP の経路の属性を変更することで経路制御が可能 高可用な負荷分散: • 上流スイッチの ECMP(Equal-Cost Multi-Path)を活用し、複数ノード間で柔軟かつ耐障害性の 高いトラフィック分散が可能 10

11.

Kubernetes と BGP 主要な OSS MetalLB: • 各ノードから LoadBalancer Service IP を上流に広報し、L4LBを提供 Calico: • 各ノードから Pod CIDR を広報し、Pod 間通信を提供 Cilium: • Pod 間通信と L4LB の両方を提供 11

12.

Kubernetes と BGP 導入する前に、手軽に構築・破棄できるローカル環境で検証したいが… BGP ってそもそもローカルで動かせるの? 動かせたとして Kubernetes とどうやって組み合わせる? ローカルで検証環境を構築する手法が広く知られていない 12

13.

本発表の趣旨 前半: BGP ネットワークと kind クラスタを統合したローカル検証環境を containerlab を用いて宣言的に構築する方法を紹介 → デモ:実際にその kind クラスタで Cilium の native routing や L4LB を動かす 後半: 活用例として、サイボウズで実施した Cilium の BGP 機能の検証作業を紹介 13

14.

containerlab x kindで再現する BGP + Kubernetes 環境 14

15.

containerlab とは コンテナベースのネットワークラボ環境を宣言的に構築できるツール • YAML で topology を定義し、ワンコマンドで環境の起動・破棄が可能 • Docker でルータやスイッチ、ホストなどをコンテナとして再現 • ローカルでデータセンターやクラスタネットワークの再現が可能 出展: https://containerlab.dev/ topology ファイル 15

16.

containerlab の使い方 主要な設定項目: topology: ネットワークラボの構成を定義 • nodes: スイッチやホストを定義 • kind: node の種類を指定 • 後ほど詳細に • exec: 起動後に実行したいコマンドを指定 • コンテナのネットワーク設定が可能 • links: node 間のリンクを定義 YAML の準備ができたら $ containerlab -t <topology ファイルパス> deploy で起動 16

17.

containerlab の使い方 nodes の kind の種類: • ルータやスイッチの OS 名 • e.g. nokia_srlinux, cisco_xrd, etc • containerlab の主力機能(今回は使わない) • linux • ホストを定義 • image でコンテナイメージを指定可能 • k8s-kind • kind クラスタを containerlab で定義 • startup-config で設定ファイルを指定 17

18.

containerlab の使い方 nodes の kind の種類: • ルータやスイッチの OS 名 • e.g. nokia_srlinux, cisco_xrd, etc • containerlab の主力機能(今回は使わない) • linux • ホストを定義 • image でコンテナイメージを指定可能 • k8s-kind • kind クラスタを containerlab で定義 • startup-config で設定ファイルを指定 18

19.

containerlab の使い方 nodes の kind の種類: • ルータやスイッチの OS 名 • e.g. nokia_srlinux, cisco_xrd, etc • containerlab の主力機能(今回は使わない) • linux • ホストを定義 • image でコンテナイメージを指定可能 • k8s-kind • kind クラスタを containerlab で定義 • startup-config で設定ファイルを指定 19

20.

containerlab の使い方 nodes の kind の種類(続き): • ext-container • node として定義されていないコンテナで exec で定義したコマンドを実行可能 • e.g. kind: k8s-kind が作る kind ノードのコン テナで ip コマンドを実行 • node 名を対象コンテナの名前に設定 • linux + network-mode: container • network-mode: container:<コンテナ名> と指 定することでそのコンテナと同じ netns で新た にコンテナを起動可能 • 複数コンテナからなる Pod みたいなイメージ 更なる詳細はドキュメントから 20

21.

containerlab の使い方 nodes の kind の種類(続き): • ext-container • node として定義されていないコンテナで exec で定義したコマンドを実行可能 • e.g. kind: k8s-kind が作る kind ノードのコン テナで ip コマンドを実行 • node 名を対象コンテナの名前に設定 • linux + network-mode: container • network-mode: container:<コンテナ名> と指 定することでそのコンテナと同じ netns で新た にコンテナを起動可能 • 複数コンテナからなる Pod みたいなイメージ 更なる詳細はドキュメントから 21

22.

containerlab x kind デモで使い方を紹介: BGP を使った L4LB と Pod 間通信を動かしてみる! デモ① Cilium の BGP Control Plane v2 の L4LB を kind で動かす デモ② Cilium の native routing を BGP を使って kind で動かす デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc 22

23.

デモ① BGP を使った L4LB 仕組み: 複数のノードから LoadBalancer Service の VIP の経路を 等コストで上流スイッチに広報 • externalTrafficPolicy: Cluster の場合は全ノードから • Local の場合はバックエンド Pod のいるノードからのみ VIP 宛のパケットに対し、上流スイッチがECMP で経路を 選択 (4-tuple hash) 選ばれた経路の先のノードにパケットが転送され、その後 ClusterIP Service 同様にバックエンド Pod を選択 23

24.

デモ① BGP を使った L4LB 仕組み: 複数のノードから LoadBalancer Service の VIP の経路を 当コストで上流スイッチに広報 VIP 宛のパケットに対し、上流スイッチがECMP で経路を 選択 (4-tuple hash or 5-tuple hash) 選ばれた経路の先のノードにパケットを転送 24

25.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:デモの大まかな流れ 1. 完成系を起動 (1~2分) 1. demo1-cilium-l4lb/ 2. 起動中に topology や各種設定を説明 3. 動作確認 1. router0 から curl を打ってみる 2. router0 に登録された経路を見てみる 25

26.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:Topology の設定 全体像 demo1-cilium-l4lb/topology.yaml 26

27.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:Topology の設定 router0 の設定 BIRD ロゴの出展: https://gitlab.nic.cz/labs/bird demo1-cilium-l4lb/topology.yaml 27

28.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:Topology の設定 kind クラスタを定義 demo1-cilium-l4lb/topology.yaml 28

29.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:Topology の設定 ext-container で kind ノードのネットワークを設定 demo1-cilium-l4lb/topology.yaml 29

30.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB kind0-config.yaml • kind の CNI を無効化 containerlab での再現:kind の設定 • ノードの IP を kubelet に登録 • Cilium が使う label をノードに付与 demo1-cilium-l4lb/kind/kind0-config.yaml 30

31.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB containerlab での再現:BGP の設定 具体的な設定は以下から: - demo1-cilium-l4lb /bird/router0_bird.conf - demo1-cilium-l4lb /cilium/bgpcp.yaml 31

32.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ① BGP を使った L4LB 動作確認 (test/) http サーバ Pod(1)を各ノードにデプロイし、 eTP: Local(2) の LB Service でクラスタ外に公開 1. router0 から curl を打ってみる 2. router0 に登録された経路を見てみる (1) GET / に対し、自身の Pod 名と乗っているノード名を返す (2) ノード転送後、そのノード上の Pod に転送させることで ECMP が動いているのを確認するため 32

33.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ② BGP を使った Pod 間通信 containerlab での再現:デモの大まかな流れ 1. 完成系を起動 (1~2分) 1. demo2-cilium-l4lb-podcidr-sidecar/ 2. 起動中に topology や各種設定を説明 3. 動作確認 1. クラスタ内から curl を打ってみる 2. ノードに経路が登録されているのを確認 33

34.

デモ② BGP を使った Pod 間通信 仕組み: 各ノードに割り当てられた Pod CIDR の経路を上流 スイッチに広報 上流スイッチから広報される他ノードの Pod CIDR の経路を kernel のルーティングテーブルに取り込む 34

35.

デモ② BGP を使った Pod 間通信 仕組み:Cilium に関する補足 Cilium の BGP コントロールプレーンはピアから広報 されてくる経路を kernel のルーティングテーブルに 取り込む機能がないため、少し工夫が必要 サイドカーパターン(1): • ノード上に別途 BGP ピアを用意し Cilium と 上流スイッ チ間の広報を中継する • このピアが Cilium の代わりに経路を取り込む (1): BGP Peering Patterns for Kubernetes Networking at Preferred Networks, 2025 Kube-Con Japan 35

36.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ② BGP を使った Pod 間通信 他ノード上の Pod への経路情報を取り込むため containerlab での再現:Topology に各ノードの netns で BIRD コンテナを起動 demo2-cilium-l4lb-podcidr-sidecar/topology.yaml 36

37.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ② BGP を使った Pod 間通信 containerlab での再現:BGP の設定 具体的な設定は以下から: - demo2-cilium-l4lb-podcidr-sidecar/bird/ - demo2-cilium-l4lb-podcidr-sidecar/cilium/bgpcp.yaml 37

38.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ② BGP を使った Pod 間通信 動作確認 (test/) http サーバ Pod(1)を各ノードにデプロイ http クライアント Pod をデプロイ 1. クラスタ内から Service (2)宛に curl を打つ 2. ノードに経路が登録されているのを確認 (1) GET / に対し、自身の Pod 名と乗っているノード名を返す (2) デモ①と同じ Service 38

39.

デモのレポジトリ: github.com/hanapedia/cndw-local-bgp-poc デモ:BGP を使った L4LB + Pod 間通信 使った環境について: • M4 MacBook Pro • 4 CPU 16 GiB memory の Ubuntu 24.04 Lima VM 参考:デモを起動した際の docker stats: 39

40.

サイボウズでの取り組み Cilium の BGP コントロールプレーン移行 40

41.

サイボウズの Kubernetes クラスタ (Neco) オンプレ環境の Kubernetes クラスタ (Neco) • 数百ノード • シングルクラスタ・マルチテナント • サーバからミドルウェアまで開発・運用管理 開発・運用 デプロイ 利用 41

42.

Neco のネットワーク DC ネットワークと Kubernetes ネットワークは別チームが管理 • Top of Rack スイッチから上流は DC ネットワークチーム • Kubernetes ネットワーク周りのコンポーネントやノードの ネットワークは Neco-network チーム • Cilium, BIRD, Contour などの管理 • Coil の開発・運用 • Neco 独自の CNI plugin • Pod IPAM や Egress NAT の機能を提供 42

43.

Neco での Kubernetes + BGP Kubernetes ノードの BIRD が ToR スイッチと BGP ピアリング • Pod, Service, ノードの IP を広報 Coil は BGP speaker を持たない • ルーティングテーブルを介して Pod CIDR の経路情報を BIRD に共有 • BIRD が上流スイッチと経路交換 Cilium はノードの BIRD と BGP ピアリング • サイドカーパターン • BIRD を経由して上流スイッチに L4LB VIP を広報 • BGP コントロールプレーンは MetalLB CP を使用 • 現在 BGP CP v2 に移行中 43

44.

Cilium の BGP コントロールプレーン移行 MetalLB CP から BGP CP v2 への移行検証: 検証①:BGP CP v2 の機能検証 • 既に動いているコンポーネントと組み合わせても動作する?いろいろな設定を試してみたい 検証②:切り替え時の挙動の確認 • どうやって切り替える?切り替え時にダウンタイムは生じる? いずれの検証も試行回数を重ねる必要があるので、 ローカルで手軽に構築・破棄できる環境が欲しいところ… 44

45.

Cilium の BGP コントロールプレーン移行 課題:手軽なローカル検証環境がない CI にも使われている VM ベースの開発環境はあったが リソースが大量に必要でローカルでは動かない + 起動に1時間近くかかる → containerlab x kind で解決! 45

46.

Cilium の BGP コントロールプレーン移行 Neco の Kubernetes + BGP を containerlab x kind で再現 • BIRD + Cilium + Coil を本番とほぼ同等の設定で起動 • デモで見せた環境 + Coil + kpr, maglev, DSR などなど • ワンコマンドでローカルの Docker 上に 1 ~ 2 分で起動 設定変更 → 構築 → 移行検証 → 破棄 → 設定変更 → 構築 ... のようなサイクルが数分で回せるようになり、移行時の障壁や課題が明らかに 46

47.

Cilium の BGP コントロールプレーン移行 移行時の障壁を発見 & 修正 発見①:MetalLB CP と BGP CP v2 が広報する 経路の Origin 属性が違う • 各ノードの BGP speaker は段階的に移行していく ため、MetalLB CP と BGP CP v2 が混在する • このとき Origin 属性の違いによって ECMP が壊れ てしまう Origin 属性を MetalLB CP に揃える設定を追加する PR をマージしてもらった cilium/cilium #41231 47

48.

Cilium の BGP コントロールプレーン移行 移行時の障壁を発見 & 修正 発見②:切り替え時に既存の LB の VIP が消えてし まう • LB VIP の広報が取り下げられ、ダウンタイムが生じる • LB VIP を管理する LBIPAM の初期化処理の仕様が原因 独自パッチで対応。PR を出すかは検討中 48

49.

Cilium の BGP コントロールプレーン移行 その他の発見: • LBIPAM のメトリクスの一部が機能していないバグを発見 & 修正 • 修正 PR を出してマージしてもらった cilium/cilium #41999 当初の検証目標も達成: • ダウンタイムなしで BGP CP v2 への切り替えができそう 49

50.

まとめ 前半: BGP ネットワークと kind クラスタを統合したローカル検証環境を containerlab を用いて宣言的に構築する方法を紹介 後半: 活用例として、サイボウズで実施した Cilium の BGP 機能の検証作業を紹介 50

51.

Q&A は Ask the speaker にて スライドは後日公開予定です ご清聴ありがとうございました! 51