マルチベンダー対応検証ツール Containerlab をつかってネットワークの設計&検証をしている話

この記事は[さくらインターネット Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sakura) 3日目の記事です。

さくらインターネットでシニアプリンシパル・ネットワークエンジニアをやっている土屋 太二です。

[今年の６月からさくらインターネットにJoinさせていただいており](https://sakumaga.sakura.ad.jp/entry/tsuchiyataiji/)、現在はさくらインターネットの全社ネットワークインフラを再設計するプロジェクトに取り組んでいます。

そのプロジェクト内にて、ネットワーク設計する上で大変重宝しているContainerlabというツールについて紹介させていただきたいと思います

# Containerlabってなに？
[Containerlab](https://containerlab.dev/)は、Nokiaのエンジニアが開発した仮想ネットワーク環境を構築するためのツールです。オープンソースで公開されており、現在多くの開発者が参加しているプロジェクトです。

![スクリーンショット 2024-12-02 17.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45596/71ea4b16-4035-b22c-87d2-33d3886ba8de.png)


Containerlabでは、Cisco・Juniper・Aristaなどのネットワーク機器メーカーが提供している仮想ネットワークOS（コンテナ版・VM版）を利用することで、仮想ネットワークOSが動作するコンテナベースのインフラを簡単に構築することができます。

仮想ネットワークOSがデプロイされたコンテナでは、実機のネットワーク機器とほぼ同様の機能が利用できます。各ネットワーク機器のコマンドやコンフィグも投入でき、さらにインタフェースの設定をすることで実際に仮想的なネットワークを構築することが可能です。

Containerlabがサポートしている仮想ネットワークOSは2024年12月2日時点では以下のものがあり、主要なネットワーク機器メーカーに対応しているような状況です。
![スクリーンショット 2024-12-02 20.46.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45596/4d96f03a-8558-dcad-b2da-54ca6c244516.png)


# Containerlab のユースケース
Contaierlabの恩恵を受けられるメリットをユースケースとともにいくつか紹介します。

### 各メーカーの仮想ネットワークOSを何台でも無償で構築可能
Containerlabは、主要ネットワーク機器メーカーが提供する仮想ネットワークOSを利用することで、各メーカーのネットワーク機器を模したコンテナを複数台立ち上げ、仮想のネットワークインフラを瞬時に構築します。

これまでのネットワークエンジニアの日常業務では、実際にネットワーク設計の検証をしようと思うと、物理的なネットワーク機器(一台あたり数百万円〜数千万円)を複数台用意して、各ネットワーク機器のインターフェース同士を物理的に配線し、各機器に適切なコンフィグを投入することで、ようやく検証がはじめられる状況でした。

検証用ネットワーク環境を用意するだけでも数千万円〜数億円規模の莫大な予算がかかりますし、新機種を検証するのであればメーカーと交渉して貸出機を提供してもらう必要があり、リードタイムだけでも数ヶ月かかってしまうのが一般的でした。

Containerlabを使うことで、これらの費用をかけることなく、実質サーバーの利用料のみで、同程度の環境を構築できます。

各ネットワーク機器メーカーが提供する仮想ネットワークOSは、実機のネットワークOSとは全く同じではないものの、その多くの機能は仮想ネットワークOSでも利用可能なため、簡易的な動作確認や機能検証を行うには十分な成果を発揮することができます。

### たった数秒で検証用ネットワークを準備可能

実機で検証用ネットワークを作ろうと思うと、複数台分の機材を調達&輸送するだけでも数日〜数週間かかることはよくあります。機材到着後も、データーセンター現地に出張して機器同士の配線作業や初期コンフィグの投入する作業にも数時間〜数日かかるのが一般的です。

Containerlabであれば、ネットワークトポロジーを表現する１つのYAMLファイルを用意し、以下の１コマンドを実行し、あとは数秒待つだけで検証環境が完成します。

```
containerlab deploy -t <ファイル名>
```

データセンター現地に行く必要もありませんし、構築のためのリードタイムもほとんど必要ありません。


### 最新のネットワーク機能をすぐさま検証

各ネットワーク機器メーカーから提供されている仮想ネットワークOSは、実機のネットワークOSとほぼ同様の機能が動作します。OSのバージョン次第では、最新機能もContainerlab環境で使うことができます。
筆者が利用しているArista cEOS 4.30.5Mでは、EVPNやVXLAN、Segment Routingなどの新しい技術も利用することができました。

新しいルーティングプロトコルの動作検証や経路制御の検証などは、仮想ネットワークOSでも十分に検証できる項目の一つです。
メーカーからリリース情報が公開されたニュースを見た瞬間に、その日のうちに手元で最新機能をすぐさま試すことができます。

### 自動化ツールを開発するためのテストベッドとして利用
ネットワーク機器を操作するための自動化システムを開発する際にもContainerlabは大活躍します。

仮想ネットワークOSは、実機と同様に、自動化のための機能(各種APIやライブラリ、NETCONFやOpenConfigなどの自動化開発を想定した機能)が動作します。

自動化システムの成熟度が低い段階では、いくら壊しても影響の無いContaierlab環境で試行錯誤しながらシステム開発を行い、ある程度システムが成熟したタイミングで実機に投入して最終確認を行う、といった開発プロセスを採用することができます。

Containerlabを使うことで、自動化システムを開発する際にも、安全な環境で大胆な試行錯誤を挑戦することができるようになりました。

### 初級者ネットワークエンジニアのトレーニング環境として利用

物理的なネットワーク機器に１台あたり数百万円かかるネットワークエンジニアの業界では、「壊して覚える環境」を用意することは並大抵の難易度ではありません。実際、一般的な初級者ネットワークエンジニアは、教材を読み込んで座学した後は、いきなり本番環境で実機での作業でトレーニングすることも少なくありません（先輩と一緒に作業をする、いわゆるOn the Job Traningです）。

しかしContainerlabを使えば、初級者が思う存分にネットワーク装置のCLIを試すことができますし、その結果インフラを壊したところで、再構築も簡単なので、誰にも責められることはありません。

そのため初級者が安心してレベルアップできる環境としてもContainerlabの効果は絶大です。

### Containerlabのユースケースまとめ

このContainerlabが登場したおかげで、物理的な機器を一切用意することなく、一度環境を整えれば、思い立った瞬間すぐさまネットワークの検証を開始することができます。

各ネットワーク機器メーカーが提供しているネットワークOSも、最新機種と同様の機能が搭載されているケースも多く、新しくリリースされた機能を仮想ネットワークOS環境でその日のうちに試す、といったことも可能になりました。

ネットワーク設計の検証項目のなかには、どうしても物理的なネットワーク機器を用意しないと検証できない項目も存在しますが（トラフィック負荷テストや経路収束時間の測定など）、それ以外の項目であれば仮想ネットワークOSのみでもほとんど同じ検証が可能です。実際、ルーティングプロトコルの動作確認や経路送受信ポリシーの検証などはハードウェアに依存しにくいものの一例であり、これらの検証はContainerlab環境でも十分に試すことができます。

その観点でも、トポロジー検証のような多数のネットワーク機器が必要になるような検証項目はContainerlab環境で確認し、ハードウェアが必要になる検証は物理的なネットワーク機器で確認する、といったような使い分けもできるようになり、結果として検証全体にかかる時間と金銭的なコストを大幅に節約することができるようになりました。


# Containerlabのインストール
Containerlabは、Dockerが動く環境であればどんな環境にもインストール可能です([公式ページ参照](https://containerlab.dev/install/))。ただし各メーカーが提供する仮想ネットワークOSがある程度マシン環境に依存することもあり、個人的にはLinux環境を用意してインストールするのが最も安定して動作するように感じます。もちろん[さくらのクラウド](https://cloud.sakura.ad.jp/)のようなクラウドサーバー上にも構築すること可能です。たくさんネットワークOSを動かす想定であればCPU／メモリを消費するので、その点だけ要注意です。
想定されるサーバースペックについては、動作させる仮想ネットワークOSの種類や台数にもよりますので、[公式ページのLab examplesのページ](https://containerlab.dev/lab-examples/min-5clos/)が参考になります。

# 仮想ネットワークOSは各自で入手する必要あり
各ネットワーク機器メーカーが提供する仮想ネットワークOSについては自身で入手する必要があります。その多くは無償で提供することが可能です。たとえばオープンソースであるSONiCであれば公式ページからダウンロードできますし、Arista社のcEOS(コンテナ版)およびvEOS(VM版)であれば、ユーザー登録後に無償でダウンロード可能です。
一般的に公開されていない仮想ネットワークOSであっても各メーカーの社員経由であれば入手できることもあるので、各メーカーの担当者にコンタクトしてみてください。

# Containerlab の使い方
Containerlabの使い方はとても簡単です。

ここではシンプルな例として、以下のようにネットワーク機器としてArista cEOS１台とLinuxサーバー2台を用意し、それぞれのインタフェースを繋ぎこんだ構成を想定してみます。
![スクリーンショット 2024-11-27 16.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45596/b8c9dbb5-c30d-f91a-2a01-22ead939f5b5.png)

まずは構築したいネットワークトポロジーを想定したファイルを１つ作ります。

``` clab_poc20241028.yaml
---
name: poc20241028

topology:
  defaults:
    env:
      INTFTYPE: et
  kinds:
    ceos:
      image: ceos:4.32.2F
    linux: 
      image: ghcr.io/hellt/network-multitool
  nodes:
    tor01:
      kind: ceos
    host01:
      kind: linux
    host02:
      kind: linux
  links:
    - endpoints: ["tor01:et3",   "host01:eth1"]
    - endpoints: ["tor01:et4",   "host02:eth1"]        
```

あとは上記のファイルに対して、以下のコマンドを打ち込むだけです。

```
containerlab deploy -f clab_poc20241028.yaml
```

あとは数秒待つだけで、以下のように複数の仮想コンテナを自動的に作ってくれます。
この時点ですでにそれぞれの機器のインタフェース同士が接続済の状態で構築されます。

![スクリーンショット 2024-12-03 9.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45596/7c9fab04-acaa-8504-90b4-80c58da5edf6.png)


もちろん作成したコンテナ/仮想ネットワークOSにログインできます。

```
ssh admin@clab-poc20241028-tor01

Warning: Permanently added 'clab-poc20241028-tor01' (ED25519) to the list of known hosts.
(admin@clab-poc20241028-tor01) Password:
Last login: Mon Oct 28 05:51:43 2024 from 2001:172:20:20::1
tor01>
tor01>en
tor01#show version
Arista cEOSLab
Hardware version:
Serial number: XXXXXXXXXXXX
Hardware MAC address: XXXXXXXXXXXX
System MAC address: XXXXXXXXXXXX

Software image version: 4.32.2F-38195967.4322F (engineering build)
Architecture: x86_64
Internal build version: 4.32.2F-38195967.4322F
Internal build ID: 47416e3e-5279-42fe-a5bd-cf7624a68bb9
Image format version: 1.0
Image optimization: None

Kernel version: 6.8.0-47-generic

Uptime: 4 weeks, 2 days, 3 hours and 44 minutes
Total memory: 12248060 kB
Free memory: 9739536 kB
```

各リンクがUP/UP状態になっていることが確認できます。著者は特になにもしてません。
```
tor01#show interfaces description
Interface                      Status         Protocol           Description
Et3                            up             up
Et4                            up             up
Ma0                            up             up
```

ここではAristaのcEOSの4.32.2Fという比較的新しいものを使っているので、最新機能も無料で動かすことができます。VXLANやEVPN、Segment Routingなどの新しい機能も利用できました。

```
tor01(config)#interface VXlan1
tor01(config-if-Vx1)#
```

```
tor01(config)#router bgp 65000
tor01(config-router-bgp)#address-family evpn
tor01(config-router-bgp-af)#
```

```
tor01(config)#router isis TEST
tor01(config-router-isis)#segment-routing mpls
tor01(config-router-isis-sr-mpls)#
```

# まとめ
今回は、さくらインターネットのネットワーク設計で使っているContainerlabを紹介してみました。
仮想ネットワークOSの扱いに特化したツールであることもあり、とても使いやすく、不具合やトラブルも少ない印象です。
Containerlabが導入できれば、「これまでのネットワーク検証作業の進め方」も大きく変えることができるでしょう。
無償でだれでも使うことができるので「現代のネットワークエンジニアにとっての必須ツールの一つ」として扱ってもいいぐらいのレベルかなと思います。

# で、結局何しようとしているの？
現在Containerlabを使って、さくらインターネットのこれまでのネットワークインフラを全面的に見直し、さくらインターネットが次の１０年も成長し続けられるためのスケーラブルなネットワークインフラを設計 & 検証を開始しています。

![スクリーンショット 2024-12-03 10.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45596/bd813959-ea3d-c793-78c9-12d1dcecb003.png)

まだ詳細を話すことはできませんが、今回の記事に興味を持っていただいて、さくらインターネットの次世代ネットワークインフラを一緒に作ってみたい！という方は、ぜひ一度[さくらインターネットの経験者採用ページ](https://www.sakura.ad.jp/recruit/midcareer/?gad_source=1&gclid=Cj0KCQiAgJa6BhCOARIsAMiL7V_jqYKz5mhBtnRd4jbSsSPtDDtTj-kU-QMOO6keZxjLXTMUAkDsrSQaAuSsEALw_wcB
)や[土屋のインタビュー記事](https://sakumaga.sakura.ad.jp/entry/tsuchiyataiji/)を覗いてみてください。


土屋と知り合いの方で「ぜひ具体的に話を聞いてみたい」という方がいらっしゃれば、カジュアル面談も設定可能ですのでいつでもDMください。https://x.com/taijijiji