お家で始める仮想化環境 Proxmox VE クラスタ構築・マイグレーション編

目次

環境

前提として、Proxmoxの基本的な構築が完了している必要があります。
Proxmox環境の構築方法はこちらをご覧ください。

また、今回は2台のノードでクラスタの構成を行います。

クラスタ構成時の注意点

Proxmoxのクラスタは、2台のノードから構成することが出来ます。
しかしながら、HA構成にしたい場合は3台以上のノードが必要になります。

また、一度クラスタに追加したノードの削除について、一度削除したノードを再登録することが出来ません。
Proxmoxを再インストールする必要があります。
(CLIにてProxmoxを再インストールせずに再登録する方法もあるようです)

試しにクラスタを構成する場合は、これらに対して注意が必要です。

クラスタ構成の利点

クラスタを構成すると、各ノードのWebGUIにアクセスする必要が無くなり、単一のWebGUIからクラスタ内のすべてのノードの操作が出来るようになります。
また、マイグレーションが可能になり、NFSなどの共有ストレージ上に配置されたVMであれば、ライブマイグレーションも利用可能になります。

(Proxmoxではこれらの機能はすべて無償で利用できます)

準備

管理用のネットワークとは別に、クラスタ構成に使用するネットワークを設定することが出来ますので、必要に応じてクラスタに使用するNICの設定をしておきます。

クラスタの作成

まず、元となるクラスタの作成を行います。
どのノードで作業してもよいはずですが、今回は「node1」と名のつけたノードで作業します。
この作業は、どれか1つのノードのみの作業でかまいません。

左側のメニューで「Datacenter」を選択し、「Cluster」を選び、クラスタ情報を表示します。

「Create Cluster」ボタンを押します。

クラスタ名を決め、「Cluster Name」に入力します。
この名前は後から変更することが出来ませんので、慎重に決めてください。
また、「Cluster Network」に、クラスタで使用するネットワークを設定します。
複数のリンクを使用することで、Failoverなどが可能になるようです。

入力が完了したら、「Create」を押して、操作が完了するのを待ちます。
「TASK OK」と表示されれば、閉じて問題ありません。

これで、先ほどの画面に作成したクラスタの情報が表示されているはずです。

クラスタへの参加

先ほど「Node1」で作成したクラスタに対して、別のノードを参加させる操作を行います。
今回は「Node2」を参加させます。
複数のノードを参加させる場合は、残りのすべてのノードで同様の操作を行ってください。

まずは、先ほどクラスタを作成した「Node1」上で、クラスタへの参加に必要な情報を取得します。
「Cluster Information」より「Join Information」を押すことで、必要な情報が表示されます。

以下のようなダイアログが表示されますので「Join Information」の中身をコピーします。
左下の「Copy Information」ボタンを利用してコピーが出来るようですが、うまくできない場合は手動でコピーしてみてください。

続いて、「Node2」で作業を行います。
「Datacenter」から「Cluster」より、「Join Cluster」を押します。

以下のようなダイアログが表示されますので、「Information」のところに先ほどコピーした文字列をそのまま貼り付けます。

貼り付けると、「Peer Address」や「Passowrd」などが表示されますので、「Password」にクラスタを作成したノード(今回は「Node1」)のパスワードを入力します。
また、「Cluter Network」の項目で、「Link 0」にて、クラスタに使用するネットワークを選択します。

入力が完了したら、「Join」を押します。

すると、以下のようなダイアログが出て止まってしまいますが、「Node1」の方へ戻り、「Cluster Nodes」に登録したノードが表示されているか確認します。

表示されていれば、このダイアログは閉じてかまいません。

以上で、クラスタへの参加が完了します。
複数のノードを参加させたい場合は、ノード数に応じてこの操作を繰り返してください。

マイグレーション

試しに、クラスタ内でVMのマイグレーションを行ってみます。
今回は「Node1」に存在するVM「TestVM」を「Node2」へマイグレーションしてみます。

移動させたいVMを選択肢、右上の「Migrate」ボタンを押します。

以下のように、移動先のノードを選択するダイアログが表示されますので、「Target Node」の項目で移動先のノードを選択します。

選択したら、「Migrate」ボタンを押します。
すると、マイグレーション処理が開始され、しばらく待つと「TASK OK」と表示されますので、ダイアログを閉じます。

「TestVM」が「Node2」に移動していることが確認できます。

このように、停止中のVMを移動させるマイグレーションは、非常に簡単に行うことが出来ます。

100GbEをテストしてみる。計測編 Mellanox ConnectX-5

Mellanox ConnectX-5 (MCX555A-ECAT)

今回、検証に当たって以下のマシンを2台お借りしたので、100GbEにおいて性能測定ツールが帯域を使用しきれるのか、調べてみました。

詳細
CPU AMD EPYC 7232P 8-Core Processor
Memory DDR4 ECC RDIMM 64GB
NIC Mellanox ConnectX-5 100Gb(InfiniBand/Ethernet) MCX555A-ECAT

目次

準備

今回は、Ubuntu 20.04.1 を使用しました。
Ubuntuに最初から入っているドライバは使用せず、Mellanox公式から取得したドライバを使用することにします。
今回は、MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgzを使用しました。

取得したファイルを解凍します。

1
2
$ tar zxvf MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgz
$ cd MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64/

解凍されたディレクトリの中にある、mlnxofedinstallを実行します。

1
2
3
4
5
$ ls
common_installers.pl DEBS LICENSE RPM-GPG-KEY-Mellanox
common.pl distro mlnx_add_kernel_support.sh src
create_mlnx_ofed_installers.pl docs mlnxofedinstall uninstall.sh
$ ./mlnxofedinstall

実行後、新しいドライバを使用するにはopenibdの再起動が必要な旨のメッセージが表示されますので、指示に従います。

1
2
3
4
Installation passed successfully
To load the new driver, run:
/etc/init.d/openibd restart
$ sudo /etc/init.d/openibd restart

IPアドレスについて、今回は10.0.0.1/2410.0.0.2/24を使用し、以下のように直結することにします。

10.0.0.1/24 ---------- 10.0.0.2/24

OSインストール時にIPアドレスの設定はしていませんので、 Interface は Down な状態になっています。
そこで Interface を Up にしますが、設定を保存しておく必要はないので今回はipコマンドを使用しました。

1
$ sudo ip link set enp65s0 up

Inteface にIPアドレスの割り当てを行います。(この場合、該当のインタフェースはenp65s0です)

1
$ sudo ip addr add <ip> dev enp65s0

DACを接続し100Gbpsでリンクしているか確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ ethtool enp65s0
Settings for enp65s0:
Supported ports: [ Backplane ]
Supported link modes: 1000baseKX/Full
10000baseKR/Full
40000baseKR4/Full
40000baseCR4/Full
40000baseSR4/Full
40000baseLR4/Full
25000baseCR/Full
25000baseKR/Full
25000baseSR/Full
50000baseCR2/Full
50000baseKR2/Full
100000baseKR4/Full
100000baseSR4/Full
100000baseCR4/Full
100000baseLR4_ER4/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Supported FEC modes: None BaseR RS
Advertised link modes: 1000baseKX/Full
10000baseKR/Full
40000baseKR4/Full
40000baseCR4/Full
40000baseSR4/Full
40000baseLR4/Full
25000baseCR/Full
25000baseKR/Full
25000baseSR/Full
50000baseCR2/Full
50000baseKR2/Full
100000baseKR4/Full
100000baseSR4/Full
100000baseCR4/Full
100000baseLR4_ER4/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: RS
Link partner advertised link modes: Not reported
Link partner advertised pause frame use: No
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 100000Mb/s
Duplex: Full
Port: Direct Attach Copper
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Cannot get wake-on-lan settings: Operation not permitted
Current message level: 0x00000004 (4)
link
Link detected: yes

Speed: 100000Mb/sとなっているので、100Gbpsで正しくリンクアップしていることが確認できました。

計測(MTU1500)

まずは、MTU1500で計測してみます。

iperf3 Single Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ iperf3 -c 10.0.0.1
Connecting to host 10.0.0.1, port 5201
[ 5] local 10.0.0.2 port 41020 connected to 10.0.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 2.24 GBytes 19.2 Gbits/sec 0 1.05 MBytes
[ 5] 1.00-2.00 sec 2.25 GBytes 19.3 Gbits/sec 0 1.05 MBytes
[ 5] 2.00-3.00 sec 3.47 GBytes 29.8 Gbits/sec 371 1.01 MBytes
[ 5] 3.00-4.00 sec 3.44 GBytes 29.5 Gbits/sec 1 1.01 MBytes
[ 5] 4.00-5.00 sec 2.82 GBytes 24.3 Gbits/sec 3 1.01 MBytes
[ 5] 5.00-6.00 sec 2.68 GBytes 23.0 Gbits/sec 2 1.01 MBytes
[ 5] 6.00-7.00 sec 2.65 GBytes 22.8 Gbits/sec 1 1.01 MBytes
[ 5] 7.00-8.00 sec 2.65 GBytes 22.8 Gbits/sec 0 1.01 MBytes
[ 5] 8.00-9.00 sec 2.65 GBytes 22.8 Gbits/sec 0 1.01 MBytes
[ 5] 9.00-10.00 sec 2.65 GBytes 22.8 Gbits/sec 0 1.23 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 27.5 GBytes 23.6 Gbits/sec 378 sender
[ 5] 0.00-10.00 sec 27.5 GBytes 23.6 Gbits/sec receiver

iperf Done.

23.6 Gbits/sec

iperf3 10 Threads.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ iperf3 -P 10 -c 10.0.0.1
--<中略>--
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 181 sender
[ 5] 0.00-10.00 sec 3.10 GBytes 2.67 Gbits/sec receiver
[ 7] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 17 sender
[ 7] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 9] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 36 sender
[ 9] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 11] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 185 sender
[ 11] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 13] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 0 sender
[ 13] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 15] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 13 sender
[ 15] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 17] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 0 sender
[ 17] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 19] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 24 sender
[ 19] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 21] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 45 sender
[ 21] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[ 23] 0.00-10.00 sec 3.11 GBytes 2.67 Gbits/sec 4 sender
[ 23] 0.00-10.00 sec 3.10 GBytes 2.66 Gbits/sec receiver
[SUM] 0.00-10.00 sec 31.1 GBytes 26.7 Gbits/sec 505 sender
[SUM] 0.00-10.00 sec 31.0 GBytes 26.6 Gbits/sec receiver

iperf Done.

26.6 Gbits/sec

iperf2 Single Thread.

1
2
3
4
5
6
7
8
$ iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.2 port 46778 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 26.5 GBytes 22.8 Gbits/sec

22.8 Gbits/sec

iperf2 10 Threads.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ iperf -c 10.0.0.1 -P 10
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 1.80 MByte (default)
------------------------------------------------------------
[ 12] local 10.0.0.2 port 46800 connected with 10.0.0.1 port 5001
[ 7] local 10.0.0.2 port 46794 connected with 10.0.0.1 port 5001
[ 9] local 10.0.0.2 port 46792 connected with 10.0.0.1 port 5001
[ 10] local 10.0.0.2 port 46796 connected with 10.0.0.1 port 5001
[ 4] local 10.0.0.2 port 46784 connected with 10.0.0.1 port 5001
[ 6] local 10.0.0.2 port 46786 connected with 10.0.0.1 port 5001
[ 3] local 10.0.0.2 port 46782 connected with 10.0.0.1 port 5001
[ 8] local 10.0.0.2 port 46790 connected with 10.0.0.1 port 5001
[ 5] local 10.0.0.2 port 46788 connected with 10.0.0.1 port 5001
[ 11] local 10.0.0.2 port 46798 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 12] 0.0-10.0 sec 11.6 GBytes 9.92 Gbits/sec
[ 7] 0.0-10.0 sec 7.99 GBytes 6.86 Gbits/sec
[ 9] 0.0-10.0 sec 7.15 GBytes 6.14 Gbits/sec
[ 10] 0.0-10.0 sec 11.1 GBytes 9.53 Gbits/sec
[ 4] 0.0-10.0 sec 10.8 GBytes 9.26 Gbits/sec
[ 6] 0.0-10.0 sec 13.5 GBytes 11.6 Gbits/sec
[ 3] 0.0-10.0 sec 7.58 GBytes 6.51 Gbits/sec
[ 8] 0.0-10.0 sec 10.1 GBytes 8.63 Gbits/sec
[ 5] 0.0-10.0 sec 13.4 GBytes 11.5 Gbits/sec
[ 11] 0.0-10.0 sec 6.85 GBytes 5.88 Gbits/sec
[SUM] 0.0-10.0 sec 99.9 GBytes 85.8 Gbits/sec

85.8 Gbits/sec

表にしてみると以下のようになりました。

計測方法 実測値
iperf3 Single Thread 23.6 Gbits/sec
iperf3 10 Threads 26.6 Gbits/sec
iperf2 Single Thread 22.8 Gbits/sec
iperf2 10 Threads 85.8 Gbits/sec

iperf3よりもiperf2の方が計測時に速度が出ていることが分かります。
この結果は、CRS326-24S+2Q+RMでの40GbEのスループットをテストしてみた!でも同様の傾向がみられました。

計測(MTU9000)

続いて、MTUを9000にして再度計測を行ってみます。

1
$ sudo ip link set dev enp65s0 mtu 9000

iperf3 Single Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ iperf3 -c 10.0.0.1
Connecting to host 10.0.0.1, port 5201
[ 5] local 10.0.0.2 port 41070 connected to 10.0.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 4.29 GBytes 36.8 Gbits/sec 42 1.71 MBytes
[ 5] 1.00-2.00 sec 3.49 GBytes 30.0 Gbits/sec 4 1.71 MBytes
[ 5] 2.00-3.00 sec 3.56 GBytes 30.6 Gbits/sec 3 1.71 MBytes
[ 5] 3.00-4.00 sec 3.57 GBytes 30.7 Gbits/sec 1 1.71 MBytes
[ 5] 4.00-5.00 sec 3.57 GBytes 30.7 Gbits/sec 1 1.72 MBytes
[ 5] 5.00-6.00 sec 3.29 GBytes 28.3 Gbits/sec 6 1.72 MBytes
[ 5] 6.00-7.00 sec 3.39 GBytes 29.1 Gbits/sec 3 1.72 MBytes
[ 5] 7.00-8.00 sec 3.39 GBytes 29.1 Gbits/sec 18 1.08 MBytes
[ 5] 8.00-9.00 sec 3.33 GBytes 28.6 Gbits/sec 0 1.08 MBytes
[ 5] 9.00-10.00 sec 3.37 GBytes 28.9 Gbits/sec 2 1.08 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 35.2 GBytes 30.3 Gbits/sec 80 sender
[ 5] 0.00-10.00 sec 35.2 GBytes 30.3 Gbits/sec receiver

iperf Done.

30.3 Gbits/sec

iperf3 10 Threads.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ iperf3 -P 10 -c 10.0.0.1
--<中略>--
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 41 sender
[ 5] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 7] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 24 sender
[ 7] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 9] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 70 sender
[ 9] 0.00-10.00 sec 4.24 GBytes 3.64 Gbits/sec receiver
[ 11] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 30 sender
[ 11] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 13] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 65 sender
[ 13] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 15] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 44 sender
[ 15] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 17] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 34 sender
[ 17] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 19] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 75 sender
[ 19] 0.00-10.00 sec 4.24 GBytes 3.65 Gbits/sec receiver
[ 21] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 72 sender
[ 21] 0.00-10.00 sec 4.24 GBytes 3.64 Gbits/sec receiver
[ 23] 0.00-10.00 sec 4.25 GBytes 3.65 Gbits/sec 45 sender
[ 23] 0.00-10.00 sec 4.24 GBytes 3.64 Gbits/sec receiver
[SUM] 0.00-10.00 sec 42.5 GBytes 36.5 Gbits/sec 500 sender
[SUM] 0.00-10.00 sec 42.4 GBytes 36.4 Gbits/sec receiver

iperf Done.

36.4 Gbits/sec

iperf2 Single Thread.

1
2
3
4
5
6
7
8
$ iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 2.13 MByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.2 port 46828 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 40.0 GBytes 34.4 Gbits/sec

34.4 Gbits/sec

iperf2 10 Threads.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ iperf -c 10.0.0.1 -P 10
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 1.90 MByte (default)
------------------------------------------------------------
[ 12] local 10.0.0.2 port 46848 connected with 10.0.0.1 port 5001
[ 8] local 10.0.0.2 port 46838 connected with 10.0.0.1 port 5001
[ 7] local 10.0.0.2 port 46840 connected with 10.0.0.1 port 5001
[ 11] local 10.0.0.2 port 46846 connected with 10.0.0.1 port 5001
[ 5] local 10.0.0.2 port 46834 connected with 10.0.0.1 port 5001
[ 6] local 10.0.0.2 port 46836 connected with 10.0.0.1 port 5001
[ 10] local 10.0.0.2 port 46842 connected with 10.0.0.1 port 5001
[ 4] local 10.0.0.2 port 46832 connected with 10.0.0.1 port 5001
[ 9] local 10.0.0.2 port 46844 connected with 10.0.0.1 port 5001
[ 3] local 10.0.0.2 port 46830 connected with 10.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 12] 0.0-10.0 sec 8.39 GBytes 7.21 Gbits/sec
[ 8] 0.0-10.0 sec 8.72 GBytes 7.49 Gbits/sec
[ 7] 0.0-10.0 sec 22.3 GBytes 19.1 Gbits/sec
[ 11] 0.0-10.0 sec 8.59 GBytes 7.38 Gbits/sec
[ 5] 0.0-10.0 sec 9.57 GBytes 8.22 Gbits/sec
[ 6] 0.0-10.0 sec 21.7 GBytes 18.6 Gbits/sec
[ 10] 0.0-10.0 sec 8.56 GBytes 7.35 Gbits/sec
[ 4] 0.0-10.0 sec 9.24 GBytes 7.93 Gbits/sec
[ 9] 0.0-10.0 sec 8.87 GBytes 7.62 Gbits/sec
[ 3] 0.0-10.0 sec 9.19 GBytes 7.90 Gbits/sec
[SUM] 0.0-10.0 sec 115 GBytes 98.8 Gbits/sec

98.8 Gbits/sec

表にしてみると以下のようになりました。

計測方法 実測値
iperf3 Single Thread 30.3 Gbits/sec
iperf3 10 Threads 36.4 Gbits/sec
iperf2 Single Thread 34.4 Gbits/sec
iperf2 10 Threads 98.8 Gbits/sec

先ほどと同様に、こちらもiperf3よりiperf2の方が計測時に速度が出ていることが分かります。

まとめ

先ほどの結果をまとめて表にしてみると以下のようになりました。

計測方法 MTU 1500 MTU 9000
iperf3 Single Thread 23.6 Gbits/sec 30.3 Gbits/sec
iperf3 10 Threads 26.6 Gbits/sec 36.4 Gbits/sec
iperf2 Single Thread 22.8 Gbits/sec 34.4 Gbits/sec
iperf2 10 Threads 85.8 Gbits/sec 98.8 Gbits/sec

これらの結果を踏まえると、それぞれの計測方法においてMTU9000の方が計測値が速いことから、ジャンボフレームはある程度の効果があると考えられます。
また、iperf2において-Pオプションを使用して並列実行することで、98.8 Gbits/secと100Gbps近い数値が出ています。

iperf2-Pオプションを使用して計測することでソフトウェア側のボトルネックをある程度解消できることは、以前計測を行った際の結果から予想していましたが、せいぜい40Gbps程度が限界だろうと思っていたので、100Gbpsという理論値に近い数値が出たことは予想外でした。

テスト結果が信頼できるかどうかという点については不明ですが、正しい結果であるとすれば、100GbEにおいてもiperf2-Pオプションと併用することで帯域テストを行うことは十分可能なのではないでしょうか。

今回は 100GbE 環境をマシンごと利用できる機会があったので、検証を行ってみました。
本環境で100Gbps出せるという事が確認できました。

40GbE環境や100GbE環境でiperf2iperf3を使用して帯域テストを行う際には、ソフトウェア側がボトルネックになる可能性を考慮する必要があります。

参考になれば幸いです。

オンプレKubernetes(Rancher)環境でCD環境を組んでみた

CD環境を構成したい!

と、突然書いてみたわけですが、経緯を少し振り返ってみます。
経緯なんてどうでもいいという場合は読み飛ばしてください。

こちらで紹介したように、弊宅のオンプレ環境ではKubernetesのクラスタが動いています。
こちらのブログやポートフォリオが乗っている本番環境には、Rancherを使用していますが、更新のたびにデプロイ処理を行っていました。
また、コードはGithubで管理していますので、GithubへPush後、コンテナイメージを作成しローカルのコンテナレジストリにPushしたのち、Rancher側でのPodの更新が必要な状態でした。

そこで、今回は、GithubへPushした後の、コンテナイメージの作成・レジストリへのPush・デプロイまでを自動化してみます。

構成

ざっくり図にしてみると、こんな感じになりました。

Github上のmasterブランチへの変更の検知には、Webhookを使用しています。
当然、Webhookを使用していますので、Rancher自体にグローバルから到達可能である必要があります。
(Githubとの連携作業は、ローカルIPアドレスのみでも行うことが出来ますが、Webhookが機能しなくなります。その場合、Githubのリポジトリ設定からWebhookの宛先を修正してください。)
筆者は、少し変なことをしてWebhookのみグローバルからRancherに到達可能にしています。

コンテナイメージのビルドなどのフローは、Rancher自体が持つPipelineと呼ばれる仕組みを利用し、設定を行っています。
この設定は、RancherのWebGUI上から行うことが出来ます。
作成された設定ファイルは、(今回の場合はGithubに)pushされます。
なお、Pipelineの仕組み自体に、DockerRegistryをホストする機能がありますが、今回はすでにオンプレ環境でレジストリが存在するため、そちらを使用するようにしました。
もちろん、DockerHubなどのレジストリも設定可能です。
このPipelineとしての設定を記したファイルは、.rancher-pipeline.ymlとして保存されます。

デプロイでは、ワークロードの設定を記述したYAMLファイルを用意しておく必要があります。
すでにワークロードがデプロイされている場合には、Rancher上からこのYAMLファイルを取得する事が可能です。
しかし、デプロイ自体には不必要な情報が多く含まれているため、編集を行う必要があります。
内容自体は、当たり前ですが通常デプロイする際に記述するYAMLファイルと同様です。

なお、Kubernetesでは、コンテナイメージのタグが同一のまま(latestなど)configを更新しても、Podは更新されません。
そのため、 ${CICD_EXECUTION_SEQUENCE} などの変数を使用してコンテナイメージのタグを変化させる必要がある点、注意が必要です。
このタグは、クラスタにapplyされる前に置換が行われるため、クラスタにデプロイする際に使用するYAMLファイルにも記述することが出来ます。
つまり、コンテナイメージをビルドする際のタグと、クラスタへのデプロイに使用するYAMLファイル上のイメージタグに変数を使用することで、Podの更新を行うことが出来ます。

Rancher公式のサンプルをいくつか列挙しておきます。
pipeline-example-php
pipeline-example-maven
pipeline-example-go

例えば、ポートフォリオ.rancher-pipeline.ymlはこのような形になっています。
(レジストリのURLが混ざっているため、一部伏せています。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
stages:
- name: DockerBuild
steps:
- publishImageConfig:
dockerfilePath: ./Dockerfile
buildContext: .
tag: <レジストリのアドレスやパス>/production/portfolio:${CICD_EXECUTION_SEQUENCE}
pushRemote: true
registry: <Rancher上で登録したRegistryの名称>
when:
event: {}
- name: Deploy
steps:
- applyYamlConfig:
path: ./deployment.yaml
timeout: 60
notification: {}

.rancher-pipeline.ymlにあるように、フローに失敗した場合や成功した場合に通知を行うこともできるようです。
これにより、デプロイまでのフローを自動化することが出来ました。

余談

そもそも自動化しようとしたきっかけは、業務でGithub Actionsを使用した自動化作業を行ったことでした。
そこで、手元でも本題にあるフローを自動化しようと思い立ったわけです。。
(結局Github Actionsを使用することなく構築しましたが…)

CI/CDについては今後、勉強して行きたいと思います。