ホワイトボックススイッチとVXLANでベアメタルサービスを構築する（その1）

こんにちは、(株)日立製作所 研究開発グループ サービスコンピューティング研究部の木下です。

　サーバーレスが進展している昨今ですが、機械学習やHPC(High Performance Computing)、さらにはSaaS/PaaS/IaaSを支える基盤として、物理サーバ等の物理リソースをオンデマンドで貸し出すベアメタルサービスを利用あるいは運用している方もいらっしゃるのではないかと思います。ベアメタルサービスはOpenStackのIronicやCanonicalのMaaS(Metal as a Service)、さらにはネットワーク的な実現方法など、様々な実現方法が存在します。今回はネットワーク的な実現方法の一つとして、ホワイトボックススイッチとVXLANを用いた実現方法[1][2]について、その実現例をご紹介します。IaaSにおいては仮想スイッチとVXLANを用いてVMを利用者に提供しますが、今回のベアメタルサービスにおいては物理スイッチとVXLANを用いて物理サーバを提供します。私の職場では実験環境を運用しており、今回ご紹介する方法で実際に簡易的なベアメタルサービスを構築して、SaaS/PaaS/IaaSを始めとするその他のサービスに物理リソースを提供しています。ベアメタルサービスを構築しておくと、たくさんある物理リソースの管理もラクになると思います。本投稿ではまず、全体像と基本的な仕組みを説明します。

**免責事項**：
　本内容は(株)日立製作所 研究開発グループの研究内容とは無関係です。(株)日立製作所及び関連する会社の事業とも無関係です。(株)日立製作所及び関連する会社のいかなる組織の考えや意見を代表するものでもありません。あくまで投稿者の個人的且つオープンなプロジェクトであり、当該プロジェクトの成果を上述の通り実験環境において活用しています。

### 想定するベアメタルサービス
　まず、提供するベアメタルサービスの仕様を整理します。利用者には複数の物理リソースを提供するので、物理リソースだけでなく、物理リソース間を接続するネットワークも提供します。ネットワークを提供することで、複数の利用者の間で物理リソースを分離し易くなるメリットもあります。そのネットワークと外のネットワークを接続する手段も必要です。まとめると、今回は以下の3種類を、利用者毎に、利用者毎に分離された形で、オンデマンドに提供します。サービスを分かり易くするために、これらをまとめた論理的なグループを定義します。この論理的なグループを今回はゾーンと呼びます。利用者がゾーンを作成して、ゾーン内に物理リソースを追加、あるいは、ゾーンから物理リソースを削除する形で利用してもらいます。

- 物理リソース
- 物理リソースを接続するためのネットワーク
- ネットワークを外部に接続するためのゲートウェイ

![baremetal_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/7428683d-e3bf-1b87-b6a9-12058441e827.png)


　物理リソースは何でも構いませんが、ここでは物理サーバを想定します。
　物理リソースを接続するためのネットワークとしては、利用者が物理リソースを管理するための管理ネットワークと、物理リソースを利用して目的の用途に用いるデータネットワークの2種類を考えます。前者は例えば裏LAN、後者は例えば表LANと呼ばれるものです。管理ネットワークとデータネットワークはレイヤ2とし、利用者間でIPアドレス空間の重複を認めることにします。また今回は簡易的なサービスを想定し冗長化は考えません。そのため、物理リソースには物理NICが2つ付いていてそれぞれが管理ネットワークとデータネットワークに接続されることになります。データネットワークについては、利用者自身が複数の用途で論理分離することも想定し、利用者がデータネットワークとしてVLANを利用出来るようにします。利用者がゾーンを作成すると、管理用ネットワークとデータネットワーク用VLAN(便宜上、初期VLANと呼びます)を一つずつ提供し、必要に応じてデータネットワーク用のVLANをオンデマンドで追加してもらいます。また、利用者毎にVLANのIDがかぶらないように、VLANのID空間を利用者毎に分けます。
　ネットワークが2種類ですので、ゲートウェイも管理ゲートウェイとデータゲートウェイの2種類を用意します。管理ネットワーク、および、データネットワーク用の初期VLANのそれぞれに接続された管理ゲートウェイとデータゲートウェイを用意します。管理ネットワークとデータネットワークはそれぞれ、利用者間で分離し、IPアドレス空間も重複し得ますので、管理ゲートウェイとデータゲートウェイでNATします。
　物理リソースのセットアップについては、利用者自身が実施することを想定します。管理ゲートウェイにおいて、利用者がIPMIを用いて物理サーバのBIOS設定を行い、PXEブート等で物理サーバに好みのOSをインストールしてもらいます。

### ホワイトボックススイッチとVXLANを用いた実現方法
　物理リソースには2つの物理NICがあるので、それぞれを管理ネットワーク用の物理スイッチの物理ポートとデータネットワーク用の物理スイッチの物理ポートに接続し、管理ネットワーク用の通信とデータネットワーク用のVLANが流れることになります。管理ネットワーク用の物理スイッチとデータネットワーク用の物理スイッチは実際には1つの物理スイッチでも構いませんが、今回は後述する制約事項のために2つに分けます。管理ネットワークの通信とデータネットワーク用のVLANを、物理スイッチにおいてVXLANでカプセル化します。IaaS基盤においては、VM間のVLANを物理サーバ上の仮想スイッチにおいてVXLANでカプセル化しますが、それを物理サーバと物理スイッチでやるだけです。カプセル化の方法はVXLANだけではありませんが、今回は物理スイッチでも比較的利用し易いVXLANを使います。
　ちなみに、ベアメタルサービスでは利用者が物理サーバを用いてIaaS基盤等を構築するかもしれません。その際には物理サーバ内に仮想スイッチを設けてVXLANを使うかもしれません。その場合は、利用者のVXLANが流れるデータネットワークのVLANを物理スイッチのVXLANでカプセル化しますので、VXLANが二重にネストされることになります。

![baremetal_vxlan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/356e59f3-ac88-a998-2932-b6adc530c5af.png)


### 物理的な構成
　ラック毎に、管理ネットワーク用の物理スイッチとデータネットワーク用の物理スイッチを一つずつ設置して、あとは入れられるだけの物理リソースを設置してそれら物理スイッチに接続します。ラックは複数あり、必要に応じて増えていきますので、物理スイッチ間でファブリック構成します。物理リソースを接続する物理スイッチがリーフスイッチで、それらを束ねるスパインスイッチを設けます。管理ネットワークとデータネットワークがありますので、管理ネットワーク用のリーフ・スパインのファブリックと、データネットワーク用のリーフ・スパインのファブリックを設けることになります。以降、管理ネットワーク用のリーフ側の物理スイッチを管理リーフスイッチ、スパイン側の物理スイッチを管理スパインスイッチと呼び、データネットワーク用のリーフ側の物理スイッチをデータリーフスイッチ、スパイン側の物理スイッチをデータスパインスイッチと呼びます。
　管理ネットワークとデータネットワーク用にそれぞれファブリックがありますが、ToRスイッチをリーフスイッチとしてファブリックを構成する一般的なデータセンタネットワークに準じた構成です。
　また、これらスイッチを管理するためのネットワークを別途設けます。以降、便宜上これを基盤管理ネットワークと呼びます。
　今回は例として、ラックが10本あり、管理スパインスイッチとデータスパインスイッチがそれぞれ2つずつあるものとします。

![baremetal_physical.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492068/b15e8b4b-2b91-bb7c-07b7-55ed9aba701b.png)

### 使用する機器およびソフトウェア
　今回は管理リーフスイッチおよびデータリーフスイッチとしてQuanta社のホワイトボックススイッチを、OSとしてCumulus Linuxの3.x系を使います。VXLANとして、Cumulus LinuxのLNV(Lightweight Network Virtualization)を用います。最新のCumulus Linux 4.x系ではLVNはdeprecatedとなり、VXLANはEVPN(Ethernet Virtual Private Network)を用いることになります。私達の環境は古いので今でもLNVを用いています。以降の設定例も古いLNVのものですので、あまり参考にならないと思いますが、イメージだけでも伝われば幸いです。すいません。今後4.x系のEVPNに乗り換えていきます。
　LNVはコントローラが不要ですが、VTEP間の通信を確立するためにサービスノードと呼ばれるものが必要です。スパインスイッチでもCumulus Linuxを用いると、スパインスイッチのCumulus Linux上のサービスノードデーモン(vxsnd)がそのあたりをうまくやってくれます。私達の環境では、管理ネットワークについてはスパインスイッチでもCumulus Linuxを、一方でデータネットワークのスパインスイッチにおいてはQuanta社のスイッチに付属のQuanta OSを使いました。ではサービスノードをどうするのかというと、大変ありがたいことにCumulus LinuxはvxsndもOSSとして公開してくださってますので、別途用意したサーバ上でそれを動かしました。これはもちろん推奨される方法ではないと思います。
　リーフとスパイン間のファブリックはOSPFで構成します。Cumulus LinuxもQuanta OSもOSPFを使うことが出来ます。

- [Cumulus Linux - LNV](https://docs.cumulusnetworks.com/version/cumulus-linux-37/Network-Virtualization/Lightweight-Network-Virtualization-Overview/)
- [VXFLD: VXLAN BUM Flooding Suite](https://github.com/CumulusNetworks/vxfld)

### サービスノードの準備
　今回はサービスノードデーモンを基盤管理ネットワーク上のサーバで動かします。サービスノードデーモンは上述の[VXFLD](https://github.com/CumulusNetworks/vxfld)に含まれてますので、指定の方法でインストールします。root権限は不要です。今回の例では、基盤管理ネットワークは`192.168.31.0/24`で、サービスノードデーモンを動かすサーバのIPアドレスは`192.168.31.234`とします。

```
pip install git+https://github.com/CumulusNetworks/vxfld.git
```
pipでインストールすると、環境によりますが、例えば`~/.local/bin`あたりにvxsndがインストールされていると思います。次に適当なディレクトリにvxsnd.confを作成します。今回は`~/vxsnd`というディレクトリを作成してその中にvxsnd.confを置きます。設定値は色々とありますが、最低限、以下があればOKのようです。

```~/vxsnd/vxsnd.conf
svcnode_ip = 192.168.31.234 # vxsndを動かしているサーバのIPアドレス
```
一般ユーザであれば以下を実行すればサービスノードデーモンが動いてくれます。

```
/path.to/python /home/hoge/.local/bin/vxsnd -d -p /home/hoge/vxsnd/vxsnd.pid -u /home/hoge/vxsnd/vxsnd.sock -c /home/hoge/vxsnd/vxsnd.conf
```
ちなみに、VXFLDをインストールするとvxsndだけでなく、vxsndctlコマンドもインストールされているはずです。vxsndctlコマンドを使うとvxsndが管理しているVNIとVTEPの対応関係を見れたりします。

```
/home/hoge/.local/bin/vxsndctl -u /home/hoge/vxsnd/vxsnd.sock fdb
```

- [Cumulus Linux - Troubleshooting VXLANs](https://docs.cumulusnetworks.com/version/cumulus-linux-37/Network-Virtualization/Troubleshooting-VXLANs/)

### スイッチの設定
　LNVの設定は基本的にCumulus Linuxの[サンプル](https://docs.cumulusnetworks.com/version/cumulus-linux-37/Network-Virtualization/Lightweight-Network-Virtualization-Overview/LNV-Full-Example/)通りです。個々のリーフスイッチとスパインスイッチにおいて、ファブリックのためのOSPFの設定を行います。リーフスイッチにはVXLANの設定も行います。リーフスイッチは10台ありますが、以降の例では省略して2台分(リーフスイッチ4、6)のみ掲載しています。

管理スパインスイッチ1の設定は以下の通りです。`/etc/frr/frr.conf`にOSPFの設定を追加します。`/etc/network/interfaces`にはインタフェースの設定を行います。ループバックインタフェースとスイッチポートはファブリックへの接続を、eth0インタフェースは基盤管理ネットワークへの接続を担います。

```:/etc/frr/frr.conf抜粋
router ospf
 ospf router-id 0.0.0.201
 network 172.20.0.201/32 area 0.0.0.0  # 管理スパインスイッチ1自身用
 network 172.21.104.0/30 area 0.0.0.0  # 管理リーフスイッチ4用
 network 172.21.106.0/30 area 0.0.0.0  # 管理リーフスイッチ6用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
    address 172.20.0.201/32
    vxrd-src-ip 172.20.0.201
    vxrd-svcnode-ip 192.168.31.234

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
    address 192.168.31.201/24
    gateway 192.168.31.1

auto swp4  # 管理リーフスイッチ4に接続
iface swp4
    address 172.21.104.1/30
    mtu 9216

auto swp6  # 管理リーフスイッチ6に接続
iface swp6
    address 172.21.106.1/30
    mtu 9216
```

管理スパインスイッチ2の設定は以下の通りです。

```:/etc/frr/frr.conf抜粋
router ospf
 ospf router-id 0.0.0.202
 network 172.20.0.202/32 area 0.0.0.0  # 管理スパインスイッチ2自身用
 network 172.22.104.0/30 area 0.0.0.0  # 管理リーフスイッチ4用
 network 172.22.106.0/30 area 0.0.0.0  # 管理リーフスイッチ6用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
    address 172.20.0.202/32
    vxrd-src-ip 172.20.0.202
    vxrd-svcnode-ip 192.168.31.234

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
    address 192.168.31.202/24
    gateway 192.168.31.1

auto swp4  # 管理リーフスイッチ4に接続
iface swp4
    address 172.22.104.1/30
    mtu 9216

auto swp6  # 管理リーフスイッチ6に接続
iface swp6
    address 172.22.106.1/30
    mtu 9216
```

管理リーフスイッチ4の設定は以下の通りです。

```:/etc/frr/frr.conf
router ospf
 ospf router-id 0.0.0.158
 network 172.20.0.158/32 area 0.0.0.0  # 管理リーフスイッチ4自身用
 network 172.21.104.0/30 area 0.0.0.0  # 管理スパインスイッチ1用
 network 172.22.104.0/30 area 0.0.0.0  # 管理スパインスイッチ2用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
  address 172.20.0.158/32
  vxrd-src-ip 172.20.0.158
  vxrd-svcnode-ip 192.168.31.234  # サービスノードのIPを指定

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
  address 192.168.31.158/24
  gateway 192.168.31.1

auto swp47  # 管理スパインスイッチ1に接続
iface swp47
  address 172.21.104.2/30
  mtu 9216

auto swp48  # 管理スパインスイッチ2に接続
iface swp48
  address 172.22.104.2/30
  mtu 9216
```

管理リーフスイッチ6の設定は以下の通りです。

```:/etc/frr/frr.conf
router ospf
 ospf router-id 0.0.0.162
 network 172.20.0.162/32 area 0.0.0.0  # 管理リーフスイッチ6自身用
 network 172.21.106.0/30 area 0.0.0.0  # 管理スパインスイッチ1用
 network 172.22.106.0/30 area 0.0.0.0  # 管理スパインスイッチ2用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
  address 172.20.0.162/32
  vxrd-src-ip 172.20.0.162
  vxrd-svcnode-ip 192.168.31.234  # サービスノードのIPを指定

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
  address 192.168.31.162/24
  gateway 192.168.31.1

auto swp47  # 管理スパインスイッチ1に接続
iface swp47
  address 172.21.106.2/30
  mtu 9216

auto swp48  # 管理スパインスイッチ2に接続
iface swp48
  address 172.22.106.2/30
  mtu 9216
```

データスパインスイッチ1の設定は以下の通りです。

```:show&nbsp;running-confの結果抜粋
router ospf
router-id 0.0.0.204
network 172.20.0.204 0.0.0.0 area 0.0.0.0  # データスパインスイッチ1自身用
network 172.21.4.0 0.0.0.255 area 0.0.0.0  # データリーフスイッチ4用
network 172.21.6.0 0.0.0.255 area 0.0.0.0  # データリーフスイッチ6用
default-metric 5
default-information originate
```

データスパインスイッチ2

```:show&nbsp;running-confの結果抜粋
router ospf
router-id 0.0.0.205
network 172.20.0.205 0.0.0.0 area 0.0.0.0  # データスパインスイッチ2自身用
network 172.22.4.0 0.0.0.255 area 0.0.0.0  # データリーフスイッチ4用
network 172.22.6.0 0.0.0.255 area 0.0.0.0  # データリーフスイッチ6用
default-metric 5
default-information originate
```

データリーフスイッチ4の設定は以下の通りです。

```:/etc/frr/frr.conf
router ospf
 ospf router-id 0.0.0.157
 network 172.20.0.157/32 area 0.0.0.0  # データリーフスイッチ4自身用
 network 172.21.4.0/30 area 0.0.0.0    # データスパインスイッチ1用
 network 172.22.4.0/30 area 0.0.0.0    # データスパインスイッチ2用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
  address 172.20.0.157/32
  vxrd-src-ip 172.20.0.157
  vxrd-svcnode-ip 192.168.31.234  # サービスノードのIPを指定

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
  address 192.168.31.157/24
  gateway 192.168.31.1

auto swp47  # データスパインスイッチ1に接続
iface swp47
  address 172.21.4.2/30
  mtu 9216

auto swp48  # データスパインスイッチ2に接続
iface swp48
  address 172.22.4.2/30
  mtu 9216
```

データリーフスイッチ6の設定は以下の通りです。

```:/etc/frr/frr.conf
router ospf
 ospf router-id 0.0.0.161
 network 172.20.0.161/32 area 0.0.0.0  # データリーフスイッチ6自身用
 network 172.21.6.0/30 area 0.0.0.0    # データスパインスイッチ1用
 network 172.22.6.0/30 area 0.0.0.0    # データスパインスイッチ2用
```

```:/etc/network/interfaces
auto lo
iface lo inet loopback
  address 172.20.0.161/32
  vxrd-src-ip 172.20.0.161
  vxrd-svcnode-ip 192.168.31.234  # サービスノードのIPを指定

auto eth0  # 基盤管理ネットワークに接続
iface eth0 inet static
  address 192.168.31.161/24
  gateway 192.168.31.1

auto swp47  # データスパインスイッチ1に接続
iface swp47
  address 172.21.6.2/30
  mtu 9216

auto swp48  # データスパインスイッチ2に接続
iface swp48
  address 172.22.6.2/30
  mtu 9216
```

### 物理サーバの追加
　前節の設定は運用中の変更はありません。ここからは、物理リソースを追加する時のVXLAN設定を説明します。以下の例ではゾーンが3つ存在し、ラック4とラック6の物理サーバが下表のように接続されています。

| ゾーン | ラック | スイッチ | ポート | サーバ |
|:-:|:-:|:-:|:-:|:-:|
| 1 | 4 | 管理/データリーフスイッチ4 | 01 | サーバ4-01 |
|   |   |   | 10 | サーバ4-10 |
|   |   |   | 12 | サーバ4-12 |
|   | 6 | 管理/データリーフスイッチ6 | 03 | サーバ6-03 |
|   |   |   | 05 | サーバ6-05 |
|   |   |   | 08 | サーバ6-08 |
| 2 | 4 | 管理/データリーフスイッチ4 | 25 | サーバ4-25 |
|   |   |   | 27 | サーバ4-27 |
|   | 6 | 管理/データリーフスイッチ6 | 32 | サーバ6-32 |
|   |   |   | 34 | サーバ6-34 |
|   |   |   | 37 | サーバ6-37 |
|   |   |   | 39 | サーバ6-39 |
| 3 | 4 | 管理/データリーフスイッチ4 | 41 | サーバ4-41 |
|   | 6 | 管理/データリーフスイッチ6 | 41 | サーバ6-41 |

また、ゾーン1にはデータネットワークVLANが2つ(VLAN番号3351、100)、ゾーン2にはデータネットワークVLANが3つ(VLAN番号3344、1000、1010)、ゾーン3にはデータネットワークVLANが1つ(VLAN番号3347)存在します。

この時の個々のスイッチの設定は以下の通りです。
まず管理リーフスイッチ4の設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp1
iface swp1
  mtu 9216

auto swp10
iface swp10
  mtu 9216

auto swp12
iface swp12
  mtu 9216

auto swp25
iface swp25
  mtu 9216

auto swp27
iface swp27
  mtu 9216

auto swp41
iface swp41
  mtu 9216

auto vni1555
iface vni1555
  mtu 9166
  vxlan-id 1555
  vxlan-local-tunnelip 172.20.0.158
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1573
iface vni1573
  mtu 9166
  vxlan-id 1573
  vxlan-local-tunnelip 172.20.0.158
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1898
iface vni1898
  mtu 9166
  vxlan-id 1898
  vxlan-local-tunnelip 172.20.0.158
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1555
iface vtep1555
  bridge-ports swp1 swp10 swp12 vni1555
  bridge-stp off

auto vtep1573
iface vtep1573
  bridge-ports swp25 swp27 vni1573
  bridge-stp off

auto vtep1898
iface vtep1898
  bridge-ports swp41 vni1898
  bridge-stp off
```

データリーフスイッチ4の設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp1
iface swp1
  mtu 9216

auto swp10
iface swp10
  mtu 9216

auto swp12
iface swp12
  mtu 9216

auto swp25
iface swp25
  mtu 9216

auto swp27
iface swp27
  mtu 9216

auto swp41
iface swp41
  mtu 9216

auto vni1140
iface vni1140
  mtu 9166
  vxlan-id 1140
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1478
iface vni1478
  mtu 9166
  vxlan-id 1478
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1676
iface vni1676
  mtu 9166
  vxlan-id 1676
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1760
iface vni1760
  mtu 9166
  vxlan-id 1760
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1824
iface vni1824
  mtu 9166
  vxlan-id 1824
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1849
iface vni1849
  mtu 9166
  vxlan-id 1849
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1140
iface vtep1140
  bridge-ports swp1.3351 swp10.3351 swp12.3351 vni1140
  bridge-stp off

auto vtep1478
iface vtep1478
  bridge-ports swp25.1010 swp27.1010 vni1478
  bridge-stp off

auto vtep1676
iface vtep1676
  bridge-ports swp41.3347 vni1676
  bridge-stp off

auto vtep1760
iface vtep1760
  bridge-ports swp25.1000 swp27.1000 vni1760
  bridge-stp off

auto vtep1824
iface vtep1824
  bridge-ports swp25.3344 swp27.3344 vni1824
  bridge-stp off

auto vtep1849
iface vtep1849
  bridge-ports swp1.100 swp10.100 swp12.100 vni1849
  bridge-stp off
```

管理データスイッチ6の設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp3
iface swp3
  mtu 9216

auto swp5
iface swp5
  mtu 9216

auto swp8
iface swp8
  mtu 9216

auto swp32
iface swp32
  mtu 9216

auto swp34
iface swp34
  mtu 9216

auto swp37
iface swp37
  mtu 9216

auto swp39
iface swp39
  mtu 9216

auto swp41
iface swp41
  mtu 9216

auto vni1555
iface vni1555
  mtu 9166
  vxlan-id 1555
  vxlan-local-tunnelip 172.20.0.162
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1573
iface vni1573
  mtu 9166
  vxlan-id 1573
  vxlan-local-tunnelip 172.20.0.162
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1898
iface vni1898
  mtu 9166
  vxlan-id 1898
  vxlan-local-tunnelip 172.20.0.162
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1555
iface vtep1555
  bridge-ports swp3 swp5 swp8 vni1555
  bridge-stp off

auto vtep1573
iface vtep1573
  bridge-ports swp32 swp34 swp37 swp39 vni1573
  bridge-stp off

auto vtep1898
iface vtep1898
  bridge-ports swp41 vni1898
  bridge-stp off
```

データリーフスイッチ6の設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp3
iface swp3
  mtu 9216

auto swp5
iface swp5
  mtu 9216

auto swp8
iface swp8
  mtu 9216

auto swp32
iface swp32
  mtu 9216

auto swp34
iface swp34
  mtu 9216

auto swp37
iface swp37
  mtu 9216

auto swp39
iface swp39
  mtu 9216

auto swp41
iface swp41
  mtu 9216

auto vni1140
iface vni1140
  mtu 9166
  vxlan-id 1140
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1478
iface vni1478
  mtu 9166
  vxlan-id 1478
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1676
iface vni1676
  mtu 9166
  vxlan-id 1676
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1760
iface vni1760
  mtu 9166
  vxlan-id 1760
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1824
iface vni1824
  mtu 9166
  vxlan-id 1824
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vni1849
iface vni1849
  mtu 9166
  vxlan-id 1849
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1140
iface vtep1140
  bridge-ports swp3.3351 swp5.3351 swp8.3351 vni1140
  bridge-stp off

auto vtep1478
iface vtep1478
  bridge-ports swp32.1010 swp34.1010 swp37.1010 swp39.1010 vni1478
  bridge-stp off

auto vtep1676
iface vtep1676
  bridge-ports swp41.3347 vni1676
  bridge-stp off

auto vtep1760
iface vtep1760
  bridge-ports swp32.1000 swp34.1000 swp37.1000 swp39.1000 vni1760
  bridge-stp off

auto vtep1824
iface vtep1824
  bridge-ports swp32.3344 swp34.3344 swp37.3344 swp39.3344 vni1824
  bridge-stp off

auto vtep1849
iface vtep1849
  bridge-ports swp3.100 swp5.100 swp8.100 vni1849
  bridge-stp off
```

ここで例えば、ラック4の管理/リーフスイッチ4のポート08に接続されているサーバ4-08をゾーン1に追加する場合、以下の設定を追加すれば良いです。追加する物理サーバが接続されているポートを、既存のVTEP設定に追加すれば良いです。削除も同様で、対応するポートを既存のVTEP設定から削除すれば良いです。

管理リーフスイッチ4の追加設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp8  # ポート08を追加
iface swp1
  mtu 9216

auto vtep1555
iface vtep1555
  bridge-ports swp1 swp8 swp10 swp12 vni1555  # ポート08を追加
  bridge-stp off
```

データリーフスイッチ4の追加設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto swp8  # ポート08を追加
iface swp1
  mtu 9216

auto vtep1140
iface vtep1140
  bridge-ports swp1.3351 swp8.3351 swp10.3351 swp12.3351 vni1140  # ポート08を追加
  bridge-stp off

auto vtep1849
iface vtep1849
  bridge-ports swp1.100 swp8.100 swp10.100 swp12.100 vni1849  # ポート08を追加
  bridge-stp off
```

また例えば、ゾーン1にVLAN200(対応するVNI1900)を追加する場合、以下の設定を追加すれば良いです。VLANに対応するVNIを決めてインタフェースを定義し、そのVNIに対応するVTEPを作成し、既存の物理サーバが接続されているポートを追加すれば良いです。削除も同様です。

データリーフスイッチ4の追加設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto vni1900
iface vni1900
  mtu 9166
  vxlan-id 1900
  vxlan-local-tunnelip 172.20.0.157
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1900
iface vtep1900
  bridge-ports swp1.200 swp8.200 swp10.200 swp12.200 vni1900
  bridge-stp off
```

データリーフスイッチ6の追加設定は以下の通りです。

```:/etc/network/interfaces(該当箇所のみ抜粋)
auto vni1900
iface vni1900
  mtu 9166
  vxlan-id 1900
  vxlan-local-tunnelip 172.20.0.161
  mstpctl-bpduguard yes
  mstpctl-portbpdufilter yes

auto vtep1900
iface vtep1900
  bridge-ports swp3.200 swp5.200 swp8.200 vni1900
  bridge-stp off
```


### 制約事項
　リーフスイッチにおいては、VLANタグの付いていない通信と付いている通信をそれぞれ異なるVXLANでカプセル化出来ると理想的です。しかし私の環境ではうまく出来ませんでした。同じスイッチ内で、VLANタグの付いていない通信のVXLANによるカプセルと、VLANタグの付いている通信のVXLANによるカプセル化を混在させることが出来ないようです。
　そこで結局、管理ネットワーク側はVLAN無し、データネットワーク側はVLANのみ、という構成にしました。

### まとめ
　以上、全体像と基本的な仕組みをご紹介しました。もちろんこのままですと、まだ外のネットワークにも繋がりませんし、物理構成とゾーン構成を踏まえて所定の物理スイッチに所定の設定を手作業で行うのは大変です。VNIのリソース管理も必要です。利用者によるサービスの利用開始から利用廃止までのライフサイクルを属人的に対応するのも大変です。
　そこで次回以降は、ゲートウェイや自動化、サービス化、応用についてご紹介します。

### 参考文献
[1] J. Kinoshita, K. Maeda, H. Yabusaki, K. Akune, M. Noumi, and N. Komoda, “Implementation and Evaluation of VXLAN Gateway-based Data Center Network Virtualization,” Studies in Informatics and Control Journal, Vol.25, No.3, pp.313-322, 2016.
[2] J. Kinoshita, K. Maeda, H. Yabusaki, K. Akune, and N. Komoda, “Virtualizing Service Infrastructure with Hardware Gateway in Data Center,” in Proc. 7th Int. Conf. on Data Communication Networking (DCNET 2016), pp.95-98, 2016.