はじめに
今回はContainerlab上でixia-c-oneをデプロイする方法を紹介する。
※ContainerlabはDockerコンテナを利用してネットワークトポロジーを構築するツールであり、YAML形式のトポロジー定義ファイルからネットワークラボを簡単に構築できる。
2023年に投稿したContainerlab関連の記事はこちら
ixia-c-oneとは
これまでの記事では、Community Editionとして Controller・Traffic Engine・Protocol Engineを個別のコンテナとしてデプロイしていた。本記事では、これらを1つのコンテナに統合した ixia-c-one を利用する。
Containerlabでは keysight_ixia-c-one という専用のノードタイプが提供されており、Containerlab環境では ixia-c-one を利用する構成が推奨されている。
※ixia-c-oneはcontainerlabリリース 0.26から利用可能
通常の ixia-c は Controller・Traffic Engine・Protocol Engine をそれぞれ独立したコンテナとしてデプロイする。一方、ixia-c-one はこれら主要コンポーネントを 1 つのコンテナに統合したパッケージであり、Containerlab 上で簡単に利用できるようになっている。機能的には OTG API を利用したトラフィック生成やプロトコルエミュレーションをそのまま利用できるが、デプロイや管理が大幅に簡略化される。
ixia-c Community Editionとixia-c-oneの比較
| 項目 | ixia-c Community Edition | ixia-c-one |
|---|---|---|
| 構成 | Controller + Traffic Engine・Protocol Engine(複数コンテナ) | 3コンポーネントを1コンテナへ統合 |
| デプロイ | Docker Compose、Kubernetesなど | Containerlabとの相性が良い |
| 学習 | コンポーネント構成を理解しやすい | すぐにトラフィック試験を始められる |
| ネットワークラボ | やや設定が多い | 非常に簡単 |
| 記事シリーズ | これまではこちらを利用 | 今回はこちらを利用 |
環境準備
まずは今までの検証で利用していた環境を整理する。
1 既存コンテナ停止
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b54a40e1db28 ghcr.io/open-traffic-generator/ixia-c-protocol-engine:1.00.0.531 "/docker_im/opt/Ixia…" 2 days ago Up 2 days ixia-c-protocol-engine-veth-z
08fd208906b0 ghcr.io/open-traffic-generator/ixia-c-traffic-engine:1.8.0.544 "./entrypoint.sh" 2 days ago Up 2 days ixia-c-traffic-engine-veth-z
a1930715575a ghcr.io/open-traffic-generator/ixia-c-protocol-engine:1.00.0.531 "/docker_im/opt/Ixia…" 2 days ago Up 2 days ixia-c-protocol-engine-veth-a
daf273642050 ghcr.io/open-traffic-generator/ixia-c-traffic-engine:1.8.0.544 "./entrypoint.sh" 2 days ago Up 2 days ixia-c-traffic-engine-veth-a
9f2a8460d14f ghcr.io/open-traffic-generator/keng-controller:1.57.0-2 "./bin/controller --…" 2 days ago Up 2 days 0.0.0.0:8443->8443/tcp, 0.0.0.0:40051->40051/tcp keng-controller
$ docker stop $(docker ps -aq)
b54a40e1db28
08fd208906b0
a1930715575a
daf273642050
9f2a8460d14f
2 ixia-cコンテナ削除と削除確認
$ docker rm keng-controller
docker rm ixia-c-traffic-engine-veth-a
docker rm ixia-c-traffic-engine-veth-z
docker rm ixia-c-protocol-engine-veth-a
docker rm ixia-c-protocol-engine-veth-z
keng-controller
ixia-c-traffic-engine-veth-a
ixia-c-traffic-engine-veth-z
ixia-c-protocol-engine-veth-a
ixia-c-protocol-engine-veth-z
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.イメージの確認(今回のケースでは利用しないが、イメージは残しておく)
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/open-traffic-generator/keng-controller 1.57.0-2 ec76d8522e76 3 weeks ago 272MB
ghcr.io/open-traffic-generator/ixia-c-protocol-engine 1.00.0.531 5c5cb153147c 3 weeks ago 1.59GB
ghcr.io/open-traffic-generator/ixia-c-traffic-engine 1.8.0.544 a324f7965b93 7 weeks ago 194MB
4 Containerlabの確認
Containerlabはすでにインストールされているものとして想定。
インストールについては最後の参照の項目を参考にしてほしい。
containerlab versionでバージョン確認。今回は0.76.1を使用
labのデプロイ
トポロジー定義ファイル(YAML) eth1とeth2をBack-to-Backで接続する構成を作る。
この構成はPort Endpoint、Device Endpointのどちらでも利用できる。
name: ixiac-b2b
topology:
nodes:
ixia-c:
kind: keysight_ixia-c-one
image: ghcr.io/open-traffic-generator/ixia-c-one:1.55.0-1
links:
- endpoints: ["ixia-c:eth1", "ixia-c:eth2"]
本記事では、Containerlab公式のLab Exampleで採用されている ghcr.io/open-traffic-generator/ixia-c-one:1.55.0-1 を使用した。
デプロイ実施(containerlab deploy --topo ixia-c-one-b2b.yml)
containerlab deploy --topo ixia-c-one-b2b.yml
ログ抜粋
01:18:35 INFO Containerlab started version=0.76.1
01:18:35 INFO Parsing & checking topology file=ixia-c-one-b2b.yml
01:18:35 INFO Creating docker network name=clab IPv4 subnet=172.20.20.0/24 IPv6 subnet=3fff:172:20:20::/64 MTU=0
01:18:35 INFO Pulling images
01:19:34 INFO Creating lab directory path=/home/test/lab/containerlab/clab-ixiac-b2b
01:19:34 INFO Creating container name=ixia-c
01:19:35 INFO Created link: ixia-c:eth1 ▪┄┄▪ ixia-c:eth2
01:19:35 INFO Running postdeploy actions for keysight_ixia-c-one 'ixia-c' node
01:20:13 INFO Adding host entries path=/etc/hosts
01:20:13 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-ixiac-b2b.conf
01:20:13 INFO containerlab version
🎉=
│ A newer containerlab version (0.77.0) is available!
│ Release notes: https://containerlab.dev/rn/0.77/
│ Run 'clab version upgrade' or see https://containerlab.dev/install/ for other installation options.
╭───────────────────────┬────────────────────────────────────────────────────┬─────────┬───────────────────╮
│ Name │ Kind/Image │ State │ IPv4/6 Address │
├───────────────────────┼────────────────────────────────────────────────────┼─────────┼───────────────────┤
│ clab-ixiac-b2b-ixia-c │ keysight_ixia-c-one │ running │ 172.20.20.2 │
│ │ ghcr.io/open-traffic-generator/ixia-c-one:1.55.0-1 │ │ 3fff:172:20:20::2 │
╰───────────────────────┴──────────
ここで表示されている clab は Containerlab の略称で、Containerlabは自動生成するDockerネットワークやコンテナ名の先頭にこの clab を付与し、コンテナ名を clab-- という命名規則で自動生成する。本記事では name: ixiac-b2b、ノード名 ixia-c としたため、コンテナ名は clab-ixiac-b2b-ixia-c となる。
コードの設定(以前利用したコードをContainerlab+ixia-c-one環境へ移行して実施)
以前作成したPort Endpointの試験コードをContainerlab + ixia-c-one環境へ移行して実施する。Flowの設定はそのままで、Controller接続先とPortのlocationのみ変更する。
- Controller接続
以前作ったコードは以下のようにlocationがlocalhostとなっていたが、デプロイ後に表示されるコンテナ名もしくはIPv4 Addressの部分を記載する。
#前回までの設定 このまま試験を実行するとConnection refusedのエラーが出力される
api = snappi.api(
location="https://localhost:8443",
verify=False,
)
#今回のLabのデプロイで生成されたIPアドレスを使う
api = snappi.api(
location="https://172.20.20.2:8443",
verify=False,
)
#Dockerのコンテナ名で名前解決できる環境では、Containerlabが自動生成したコンテナ名を指定してもよい
api = snappi.api(
location="https://clab-ixiac-b2b-ixia-c:8443",
verify=False,
)
2.Port location
以前のコードではlocatinをveth-a・veth-zにしていたが、今回はixia-c-oneのサンプルをもとにeth1・eth2と変更する。
#以前のコード
p1 = cfg.ports.add(
name="p1",
location="veth-a"
)
p2 = cfg.ports.add(
name="p2",
location="veth-z"
)
#変更後のコード
cfg.ports.add(
name="Tx Port",
location="eth1",
)
cfg.ports.add(
name="Rx Port",
location="eth2",
)
今回の検証では、Containerlabへの移行に伴う変更点を確認することを目的とした。そのため、Controller接続先とPortのlocationのみ変更し、それ以外のコードは以前の記事と同じものを使用している。
結果、双方向のTrafficが正常に送受信できることを確認できた。
./do.sh pytest examples/clab-bydirectional-config.py -s
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-7.1.1, pluggy-1.6.0 -- /home/test/lab/ixia-c/conformance/.env/bin/python
cachedir: .pytest_cache
rootdir: /home/test/lab/ixia-c/conformance, configfile: pytest.ini
plugins: html-4.2.0
collecting ... 2026-07-11 12:31:53.691 [snappi] [WARNING] Version check is disabled
----------------------------- live log collection ------------------------------
WARNING snappi:snappi.py:106 Version check is disabled
2026-07-11 12:31:53.692 [snappi] [WARNING] Certificate verification is disabled
WARNING snappi:snappi.py:164 Certificate verification is disabled
Traffic Started
Traffic Stopped
choice: flow_metrics
flow_metrics:
- bytes_rx: '5060058624'
bytes_tx: '5060058624'
frames_rx: '9882927'
frames_rx_rate: 0
frames_tx: '9882927'
frames_tx_rate: 0
name: p1_to_p2
rx_rate_bps: 0
transmit: stopped
tx_rate_bps: 0
- bytes_rx: '4845813248'
bytes_tx: '4845813248'
frames_rx: '9464479'
frames_rx_rate: 0
frames_tx: '9464479'
frames_tx_rate: 0
name: p2_to_p1
rx_rate_bps: 0
transmit: stopped
tx_rate_bps: 0
collected 0 items
======================= no tests ran in 67.46s (0:01:07) =======================
※pytestの検出はcollected 0 itemsとなっているが、これはテスト関数の命名規則の影響であり動作自体には影響しない
※本記事では、コード変更点を最小限に抑えてContainerlabへ移行できることを確認することを目的としている。そのため、pytestのアサーション追加などのコード改善は行っていない。
次にDevice Endpoint+BGPの試験を同様の環境に移して実施。こちらも Controller接続とLocationを変更したのみである。こちらの動作確認結果も以前記載したBGPの試験と同様のものである。
Port Endpointだけでなく、Device EndpointのコードもController接続先とPortのlocationを変更するだけでContainerlab環境へ移行できた。FlowやBGPの設定は変更不要であった。
./do.sh pytest examples/clab-bgp-example.py -s
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-7.1.1, pluggy-1.6.0 -- /home/test/lab/ixia-c/conformance/.env/bin/python
cachedir: .pytest_cache
rootdir: /home/test/lab/ixia-c/conformance, configfile: pytest.ini
plugins: html-4.2.0
collecting ... collected 1 item
examples/clab-bgp-example.py::test_ixia_c_veth_bgp_example 2026-07-11 12:45:53.840 [snappi] [WARNING] Version check is disabled
-------------------------------- live log call ---------------------------------
WARNING snappi:snappi.py:106 Version check is disabled
2026-07-11 12:45:53.841 [snappi] [WARNING] Certificate verification is disabled
WARNING snappi:snappi.py:164 Certificate verification is disabled
---
Protocol Started
bgpv4_metrics:
- fsm_state: established
name: Device1.BGP.Peer
routes_advertised: '1'
routes_received: '1'
session_state: up
- fsm_state: established
name: Device2.BGP.Peer
routes_advertised: '1'
routes_received: '1'
session_state: up
choice: bgpv4_metrics
Traffic Started
choice: flow_metrics
flow_metrics:
- bytes_rx: '142848'
bytes_tx: '173568'
frames_rx: '279'
frames_rx_rate: 0
frames_tx: '339'
frames_tx_rate: 0
name: Device1_route_to_Device2_route
rx_rate_bps: 0
transmit: started
tx_rate_bps: 0
- bytes_rx: '202752'
bytes_tx: '259072'
frames_rx: '396'
frames_rx_rate: 0
frames_tx: '506'
frames_tx_rate: 0
name: Device2_route_to_Device1_route
rx_rate_bps: 0
transmit: started
tx_rate_bps: 0
choice: flow_metrics
flow_metrics:
- bytes_rx: '1133910016'
bytes_tx: '1133910016'
frames_rx: '2214668'
frames_rx_rate: 228709.81
frames_tx: '2214668'
frames_tx_rate: 228739.83
name: Device1_route_to_Device2_route
rx_rate_bps: 936795400
transmit: stopped
tx_rate_bps: 936918340
- bytes_rx: '1155921920'
bytes_tx: '1155921920'
frames_rx: '2257660'
frames_rx_rate: 223568.2
frames_tx: '2257660'
frames_tx_rate: 223611.16
name: Device2_route_to_Device1_route
rx_rate_bps: 915735360
transmit: stopped
tx_rate_bps: 915911300
Traffic Stopped
Protocol Stopped
PASSED
補足
試験完了後や環境をシャットダウンする場合は以下実施をする。
| docker-compose版 | Containerlab版 |
|---|---|
./do.sh topo rm |
containerlab destroy --topo ... |
./do.sh topo new |
containerlab deploy --topo ... |
Containerlabの環境を崩した時の作業ログ
containerlab destroy --topo ixia-c-one-b2b.yml
00:00:17 INFO Parsing & checking topology file=ixia-c-one-b2b.yml
00:00:17 INFO Parsing & checking topology file=ixia-c-one-b2b.yml
00:00:17 INFO Destroying lab name=ixiac-b2b
00:00:19 INFO Removed container name=clab-ixiac-b2b-ixia-c
00:00:19 INFO Removing host entries path=/etc/hosts
00:00:19 INFO Removing SSH config path=/etc/ssh/ssh_config.d/clab-ixiac-b2b.conf
まとめ
今回はContainerlab+ixia-c-oneの環境を使った試験を実施した。Port Endpoint・Device EndpointともにController接続先とPortのlocationを変更するだけで既存コードをそのまま利用できることを確認できた。 ラボのデプロイも簡単で、DUTを接続した検証はこちらの方が使いやすそうだという印象を持った。次回はDUTを接続した試験を確認する予定である。
参考
Containerlab on Windows
https://containerlab.dev/windows/
Deploy Ixia-c-one using containerlab
https://ixia-c.dev/deployments-containerlab/
