どこかに向かうらしい話

迷走エンジニアの放浪記

CentOS7でOpen vSwitchブリッジ化

Open vSwitchのブリッジのポートにIPアドレスを割り振る方法について備忘録。
備忘録のため、ざっくりしか書いていませんことはご了承願います。
また、作業中ネットワークの寸断がなんども起きるため、sshなどによるリモートの設定ではなく、ローカルでの設定を行ってください。

Open vSwitchの導入

Open vSwitchをインストールする。 ここではOpenStackのPackStackを利用してインストールする。

# yum install https://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-7/rdo-release-icehouse-4.noarch.rpm
# yum install openvswitch

Open vSwitchを起動する。

# systemctl start openvswitch.service
# systemctl enable openvswitch.service

ブリッジの構成

ブリッジbr-exを作成する。

# ovs-vsctl add-br br-ex

ブリッジbr-exにたいしてポートenp3s0を付与する。

# ovs-vsctl add-port br-ex enp3s0

ネットワーク関連の設定

ifcfg-enp3s0を編集する。

# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0

以下の通り編集する。

DEVICE=enp3s0
NAME=enp3s0
BOOTPROTO=none
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
NM_CONTROLLED=no
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex

ifcfg-br-exを編集する。

# vi /etc/sysconfig/network-scripts/ifcfg-br-ex

以下の通り編集する。

DEVICE=br-ex
NAME=br-ex
BOOTPROTO=none
IPADDR0=10.1.0.1
PREFIX0=8
GATEWAY0=10.255.0.1
DNS1=10.255.0.1
DEFROUTE=yes
NM_CONTROLLED=no
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge

NetworkManagerの停止、無効化とnetworkの起動、有効化を行う。

# systemctl stop NetworkManager.service
# systemctl disable NetworkManager.service
# systemctl start network.service
# systemctl enable network.service

ちょっとしたTips

この状態でrebootを行うと、br-exにIPアドレスが割り振られない状態で起動される。
原因はSystemdによる起動順序の指定がnetwork.service→openvswitch.serviceの順序になっているために、ブリッジが構成される前にIPの割り振りが行われてしまうことに起因する(と思われる)。

この現象に対する対応の1つとして、br-exインターフェイスの停止→起動を行うことでも対応は可能。
そのため、br-exに対してIPアドレスが割り振られているかをチェックし、割り振られていなければbr-exインターフェイスの停止→起動を行うという処理をcronにて毎分行うという方法で一時的に回避を試みる。
(この方法による回避が妥当かどうかは現段階ではまったく考慮しません)

インターフェイスへのIP割り振りのチェックと再起動のスクリプトを作成する。

# vi /shell/if_check.sh

以下の通り編集する。

#!/bin/bash

INTERFACE_NAME=br-ex
INTERFACE_IP=10.1.0.1

if [[ -z $(/sbin/ip addr show ${INTERFACE_NAME} | grep "inet ${INTERFACE_IP}") ]]; then
        /sbin/ifdown ${INTERFACE_NAME}
        /sbin/ifup ${INTERFACE_NAME}
fi

crontabを編集する。

# crontab -e

以下の通り編集する。

* * * * * /shell/if_check.sh

参考サイト

この記事の内容を構成するにあたって参考にさせていただいたサイトを以下に挙げておきます。

また、参考になるし有益ではあるが、自分の状況と照らし合わせて採用しなかったサイトの情報も挙げておきます。