7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CentOS7でOpenVNetを動作させよう

Last updated at Posted at 2014年12月18日

この記事は、Wakame-vdc / OpenVNet Advent Calendar 2014の19日目です。

OpenVNetのInstall Guideを見る限り、OpenVNetが動作保証されているOSは下記のようにかなり限定されています。

OS Kernel
RHEL 6.4 Kernel 2.6.32-358.6.2.el6.x86_64

RHEL6系(CentOS6系)は2020年11月30日までメンテナンスされるとしても、最新OSで動作するに越したことはありません。そこでCentOS7にOpenVNetをインストールしてみました。

Vagrant Box

下記手順を一つずつ実施するには、かなり手間と時間がかかります。そこでchef/centos-7.0のbox上にOpenVNetをインストール(下記手順の1.〜7.まで実施)した、openvnet-centos7 boxをVagrant Cloudで公開しました。

$ vagrant init nmatsui/openvnet-centos7で試してみてください。

もしvagrant cloudからうまくboxを取得できない場合は、ココから直接boxをダウンロードしてvagrant box add nmatsui/openvnet-centos7 openvnet-centos7.boxとしてください。

検証した環境

HOST

OS Kernel
CentOS Linux release 7.0.1406 Kernel 3.10.0-123.9.3.el7.x86_64

GUEST

OS Kernel
CentOS Linux release 7.0.1406 Kernel 3.10.0-123.13.1.el7.x86_64

1. OpenVNetとepelリポジトリ登録

OpenVNetとepelのリポジトリを登録します。
Install Guideではaxshが準備したepelを用いることになっていますが、CentOSのextrasリポジトリのepelをそのまま利用します。

[vagrant@centos7 ~]$ sudo su -
[root@centos7 ~]# curl -o /etc/yum.repos.d/openvnet.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet.repo
[root@centos7 ~]# curl -o /etc/yum.repos.d/openvnet-third-party.repo -R https://raw.githubusercontent.com/axsh/openvnet/master/deployment/yum_repositories/stable/openvnet-third-party.repo
[root@centos7 ~]# yum install epel-release -y
[root@centos7 ~]# yum update -y

2. Open vSwitchのインストール

CentOS6の手順と同様にこの段階でyum install openvnetを実行すると、依存関係にあるopenvswitch-1.10.0をインストールしようとします。しかしKernel 3.10系はopenvswitch 1.10には対応していないため、Dependency ResolutionでErrorとなります。
Q: What Linux kernel versions does each Open vSwitch release work with?

そのためKernel 3.10に対応したOpen vSwitchを事前にインストールします。

RDOからOpen vSwitchインストール

簡単なのは、RDOリポジトリからOpen vSwitchをインストールする手順です。

[root@centos7 ~]# yum install https://rdo.fedorapeople.org/rdo-release.rpm -y
[root@centos7 ~]# yum install openvswitch -y
[root@centos7 ~]# systemctl start openvswitch
[root@centos7 ~]# ovs-vsctl show
7cc3a436-f943-4bb9-be1f-17294b4ca194
 ovs_version: "2.1.3"

ソースコードからOpen vSwitchインストール

RDOはOpenStack用の巨大なパッケージなため、その導入を避けてOpen vSwitchのソースコードをrpm-buildしてピンポイントにlocalinstallしても良いでしょう。

[root@centos7 ~]# yum install gcc make automake rpm-build redhat-rpm-config python-devel openssl-devel kernel-devel kernel-debug-devel -y
[root@centos7 ~]# adduser ovswitch
[root@centos7 ~]# su - ovswitch
[ovswitch@centos7 ~]$ mkdir -p ~/rpmbuild/SOURCES
[ovswitch@centos7 ~]$ cd ~/rpmbuild/SOURCES/
[ovswitch@centos7 SOURCES]$ wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
[ovswitch@centos7 SOURCES]$ tar xfz openvswitch-2.3.0.tar.gz 
[ovswitch@centos7 SOURCES]$ cd openvswitch-2.3.0
[ovswitch@centos7 openvswitch-2.3.0]$ sed -i.org -e 's/openvswitch-kmod, //g' rhel/openvswitch.spec
[ovswitch@centos7 openvswitch-2.3.0]$ rpmbuild -bb --without check rhel/openvswitch.spec
[ovswitch@centos7 openvswitch-2.3.0]$ exit
[root@centos7 ~]# yum install /home/ovswitch/rpmbuild/RPMS/x86_64/openvswitch-2.3.0-1.x86_64.rpm -y
[root@centos7 ~]# systemctl start openvswitch
[root@centos7 ~]# ovs-vsctl show
39139eae-0747-4a26-8bf0-66747b2c522e
 ovs_version: "2.3.0"

3. MySQL 5.5系のインストール

この段階でyum install openvnetを実行すると、今度はmysql-serverの依存関係が解決できないと言われて止まります。
CentOS7からは標準リポジトリでmysqlが提供されなくなりましたので、RPMを取得してMySQLをインストールします。

(注記)注意
最新版のMySQL 5.6をインストールしてはいけません!
MySQL 5.6からはsql_modeのデフォルト値がSTRICT_TRANS_TABLEに変更されており、OpenVNetのいくつかのSQLがエラーを起こします

[root@centos7 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-shared-compat-5.5.41-1.el7.x86_64.rpm
[root@centos7 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-devel-5.5.41-1.el7.x86_64.rpm
[root@centos7 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-client-5.5.41-1.el7.x86_64.rpm
[root@centos7 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-server-5.5.41-1.el7.x86_64.rpm
[root@centos7 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-shared-5.5.41-1.el7.x86_64.rpm
[root@centos7 ~]# yum localinstall MySQL-shared-5.5.41-1.el7.x86_64.rpm -y
[root@centos7 ~]# yum localinstall MySQL-shared-compat-5.5.41-1.el7.x86_64.rpm -y
[root@centos7 ~]# yum localinstall MySQL-devel-5.5.41-1.el7.x86_64.rpm -y
[root@centos7 ~]# yum localinstall MySQL-server-5.5.41-1.el7.x86_64.rpm -y
[root@centos7 ~]# yum localinstall MySQL-client-5.5.41-1.el7.x86_64.rpm -y
[root@centos7 ~]# systemctl start mysql
[root@centos7 ~]# mysqladmin -uroot version
mysqladmin Ver 8.42 Distrib 5.5.41, for Linux on x86_64
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.5.41
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 31 sec
Threads: 1 Questions: 2 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.064

4. OpenVNetのインストール

Open vSwitchとMySQLを事前にインストールしておけば、OpenVNetのインストールが成功します。

[root@centos7 ~]# yum install openvnet -y
...
Complete!
[root@centos7 ~]# yum info openvnet
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
Installed Packages
Name : openvnet
Arch : noarch
Version : 20141028112732gitc45f717.fpm0
Release : 1
Size : 0.0 
Repo : installed
From repo : openvnet
Summary : Virtual network agent for OpenVNet
URL : https://github.com/axsh/openvnet/ 
License : unknown 
Description : Virtual network agent for OpenVNet

5. ruby 2.1.1のインストール

OpenVNetのパッケージに内包されるrubyはCentOS6系用ですので、rubyをソースコードからビルドしてインストールします。

ruby自身のインストール

公式から2.1.1のソースコードを取得し、ビルドします。

(注記)注意
最新版のruby 2.1.5をインストールしてはいけません!
OpenVNetのWebAPIが依存するsinatra/namespaceは、内部でbackportsという過去のrubyのfeatureを最新のrubyで利用可能にするgemを利用していますが、このbackportsが最新版のruby 2.1.5ではエラーを起こしてしまうようです

[root@centos7 ~]# yum install gcc make automake sqlite-devel openssl-devel git -y
[root@centos7 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
[root@centos7 ~]# tar xfz ruby-2.1.1.tar.gz 
[root@centos7 ~]# cd ruby-2.1.1
[root@centos7 ruby-2.1.1]# ./configure
[root@centos7 ruby-2.1.1]# make
[root@centos7 ruby-2.1.1]# make install
[root@centos7 ruby-2.1.1]# ruby -v
ruby 2.1.1p76 (2014年02月24日 revision 45161) [x86_64-linux]
[root@centos7 ruby-2.1.1]# gem -v
2.2.2

bundlerのインストール

次にbundlerをインストールします。

[root@centos7 ruby-2.1.1]# gem install bundler
[root@centos7 ruby-2.1.1]# bundle -v
Bundler version 1.7.9

もしgemが遅い場合、echo 'options single-request-reopen' >> /etc/resolv.confで名前解決の挙動を変更すると高速化するかもしれません。

OpenVNetが依存するgemの再インストール

各種gemを再取得し、mysql2などC extentionを含んだgemをCentOS7用にビルドしなおします。この作業を怠ると、よくわからないエラーに悩まされることになります。

[root@centos7 ruby-2.1.1]# cd /opt/axsh/openvnet/vnet/
[root@centos7 vnet]# rm -rf vendor/
[root@centos7 vnet]# bundle install
...
Your bundle is complete!

OpenVNetのCLIの依存ライブラリの取得

OpenVNetのREST APIにcurlでコマンドを送信しても良いのですが、必要とするパラメータがわかりづらいため、helpが充実しているOpenVNetのCLI(vnctl)を使えるようにします。

[root@centos7 vnet]# cd /opt/axsh/openvnet/vnctl/
[root@centos7 vnctl]# bundle install
...
Your bundle is complete!

/opt/axsh/openvnet/vnctlディレクトリでbin/vnctl helpと実行すれば、利用可能なコマンドが参照できます。

[root@centos7 vnctl]# bin/vnctl help
Commands:
 vnctl datapaths # Operations for datapaths.
 vnctl dns_services # Operations for dns_services.
...

またbin/vnctl datapaths help add等と実行すれば、コマンドのオプションが参照できます。

[root@centos7 vnctl]# bin/vnctl datapaths help add
Usage:
 vnctl datapaths add [OPTIONS] --display-name=DISPLAY_NAME --dpid=DPID --node-id=NODE_ID
Options:
 [--uuid=UUID] # Unique UUID for the datapaths.
...

6. OpenVNetの起動スクリプトの作成

CentOS7からはUpStartが使えなくなり、サービスの起動管理はsystemdに一本化されました。そこでsystemd経由でOpenVNetの起動・停止を行えるようにします。

環境設定ファイルの変更

CentOS7用にrubyをインストールしましたので、OpenVNetに同梱されているrubyを使わないように環境設定ファイルを変更します。

[root@centos7 vnet]# sed -i.org -e 's/^RUBY_PATH=/#RUBY_PATH=/g' /etc/default/openvnet
[root@centos7 vnet]# sed -i -e 's/^PATH=/#PATH=/g' /etc/default/openvnet

サービス起動スクリプトの作成

Virtual NetwrokのManager(vnmgr)、API(webapi)、Agent(vna)の起動スクリプトを/opt/axsh/openvnet/vnet/binへ作成し、実行権を与えます。

[root@centos7 vnctl]# cd /opt/axsh/openvnet/vnet/
[root@centos7 vnet]# vi bin/vnet-vnmgr
[root@centos7 vnet]# vi bin/vnet-webapi
[root@centos7 vnet]# vi bin/vnet-vna
[root@centos7 vnet]# chmod +x bin/vnet-*
bin/vnet-vnmgr
# !/bin/bash
NAME=vnmgr
[ -f /etc/default/vnet-${NAME} ] && . /etc/default/vnet-${NAME}
export LOG_DIRECTORY
[ -d "${LOG_DIRECTORY}" ] || {
 mkdir ${LOG_DIRECTORY}
}
[ -d "${VNET_ROOT}" ] || {
 logger "no such directory: ${VNET_ROOT}"
 exit 1
}
cd ${VNET_ROOT}/vnet/
bundle exec ./bin/${NAME} \
 >> ${LOG_DIRECTORY}/${NAME}.log 2>&1 
bin/vnet-webapi
# !/bin/bash
NAME=webapi
[ -f /etc/default/vnet-${NAME} ] && . /etc/default/vnet-${NAME}
export LOG_DIRECTORY
[ -d "${LOG_DIRECTORY}" ] || {
 mkdir ${LOG_DIRECTORY}
}
[ -d "${VNET_ROOT}" ] || {
 logger "no such directory: ${VNET_ROOT}"
 exit 1
}
cd ${VNET_ROOT}/vnet/
bundle exec unicorn \
 -o ${BIND_ADDR:-0.0.0.0} \
 -p ${PORT:-9090} \
 ./rack/config-${NAME}.ru \
 >> ${LOG_DIRECTORY}/${NAME}.log 2>&1
bin/vnet-vna
# !/bin/bash
NAME=vna
[ -f /etc/default/vnet-${NAME} ] && . /etc/default/vnet-${NAME}
export LOG_DIRECTORY
[ -d "${LOG_DIRECTORY}" ] || {
 mkdir ${LOG_DIRECTORY}
}
[ -d "${VNET_ROOT}" ] || {
 logger "no such directory: ${VNET_ROOT}"
 exit 1
}
cd ${VNET_ROOT}/vnet/
bundle exec ./bin/${NAME} \
 >> ${LOG_DIRECTORY}/${NAME}.log 2>&1

Unit作成

systemctlから起動するためにUnitを作成します。

[root@centos7 vnet]# vi /etc/systemd/system/vnet-vnmgr.service
[root@centos7 vnet]# vi /etc/systemd/system/vnet-webapi.service
[root@centos7 vnet]# vi /etc/systemd/system/vnet-vna.service
/etc/systemd/system/vnet-vnmgr.service
[Unit]
Description=OpenVNet Manager Service
After=openvswitch.service redis.service mysql.service
Requires=openvswitch.service redis.service mysql.service
[Service]
Type=simple
ExecStart=/opt/axsh/openvnet/vnet/bin/vnet-vnmgr
[Install]
WantedBy=multi-user.target
/etc/systemd/system/vnet-webapi.service
[Unit]
Description=OpenVNet WebAPI Service
After=openvswitch.service redis.service mysql.service
Requires=openvswitch.service redis.service mysql.service
[Service]
Type=simple
ExecStart=/opt/axsh/openvnet/vnet/bin/vnet-webapi
[Install]
WantedBy=multi-user.target
/etc/systemd/system/vnet-vna.service
[Unit]
Description=OpenVNet Agent Service
After=openvswitch.service redis.service mysql.service
Requires=openvswitch.service redis.service mysql.service
[Service]
Type=simple
ExecStart=/opt/axsh/openvnet/vnet/bin/vnet-vna
[Install]
WantedBy=multi-user.target

7. OpenVNet用DB作成

MySQLにOpenVNetの初期DBを作成します。

[root@centos7 vnet]# systemctl restart mysql
[root@centos7 vnet]# mysqladmin -uroot create vnet
[root@centos7 vnet]# bundle exec rake db:init

openvnet-centos7のVagrant boxでは、この7.までの手順が実施されています。

8. OpenVNetの起動状態確認

OpenVNetの各サービス(vnmgr、webapi、vna)を起動し、状態を確認します。
(Unitの依存関係定義に従い、Open vSwitchやRedis、MySQLは停止していても自動起動します)
Active: active (running) と表示されていれば、起動成功です。もし Active: failed と表示されている場合、これまでのインストール作業のどこかで失敗していることになります。

vnet-vnmgr
[root@centos7 vnet]# systemctl start vnet-vnmgr
[root@centos7 vnet]# systemctl start vnet-webapi
[root@centos7 vnet]# systemctl start vnet-vna
[root@centos7 vnet]# systemctl status vnet-vnmgr
vnet-vnmgr.service - OpenVNet VNManager Service
 Loaded: loaded (/etc/systemd/system/vnet-vnmgr.service; disabled)
 Active: active (running) since Fri 2014年12月12日 08:11:53 UTC; 4s ago
 Main PID: 4797 (vnet-vnmgr)
 CGroup: /system.slice/vnet-vnmgr.service
 ├─4797 /bin/sh /opt/axsh/openvnet/vnet/bin/vnet-vnmgr
 └─4798 ruby ./bin/vnmgr
Dec 12 08:11:53 localhost.localdomain systemd[1]: Starting OpenVNet VNManager...
Dec 12 08:11:53 localhost.localdomain systemd[1]: Started OpenVNet VNManager ...
Hint: Some lines were ellipsized, use -l to show in full.
vnet-webapi
[root@centos7 vnet]# systemctl status vnet-webapi
vnet-webapi.service - OpenVNet WebAPI Service
 Loaded: loaded (/etc/systemd/system/vnet-webapi.service; disabled)
 Active: active (running) since Fri 2014年12月12日 08:12:03 UTC; 4s ago
 Main PID: 4830 (vnet-webapi)
 CGroup: /system.slice/vnet-webapi.service
 ├─4830 /bin/bash /opt/axsh/openvnet/vnet/bin/vnet-webapi
 ├─4831 unicorn master -o 0.0.0.0 -p 9090 ./rack/config-webapi.ru
 └─4834 unicorn worker[0] -o 0.0.0.0 -p 9090 ./rack/config-webapi.r...
Dec 12 08:12:03 localhost.localdomain systemd[1]: Starting OpenVNet WebAPI Se...
Dec 12 08:12:03 localhost.localdomain systemd[1]: Started OpenVNet WebAPI Ser...
Hint: Some lines were ellipsized, use -l to show in full.
vnet-vna
[root@centos7 vnet]# systemctl status vnet-vna
vnet-vna.service - OpenVNet Agent Service
 Loaded: loaded (/etc/systemd/system/vnet-vna.service; disabled)
 Active: active (running) since Fri 2014年12月12日 08:12:13 UTC; 3s ago
 Main PID: 4856 (vnet-vna)
 CGroup: /system.slice/vnet-vna.service
 ├─4856 /bin/bash /opt/axsh/openvnet/vnet/bin/vnet-vna
 ├─4857 Controller
 └─4865 /opt/axsh/openvnet/vnet/vendor/bundle/ruby/2.1.0/bundler/ge...
Dec 12 08:12:13 localhost.localdomain systemd[1]: Started OpenVNet Agent Serv...
Hint: Some lines were ellipsized, use -l to show in full.

ついでにOpenVNetが出力するログにERRORが出力されていないことも確認します。

/var/log/openvnet/vnmgr.log
[root@centos7 vnet]# tail /var/log/openvnet/vnmgr.log 
I, [2014年12月12日T08:11:56.232326 #4798] INFO -- : Rpc initalized.
I, [2014年12月12日T08:11:56.963914 #4798] INFO -- : vdc_vnet_plugin initialized...
/var/log/openvnet/webapi.log
[root@centos7 vnet]# tail /var/log/openvnet/webapi.log 
I, [2014年12月12日T08:12:04.986618 #4831] INFO -- : listening on addr=0.0.0.0:9090 fd=9
I, [2014年12月12日T08:12:04.986959 #4831] INFO -- : worker=0 spawning...
I, [2014年12月12日T08:12:04.988864 #4831] INFO -- : master process ready
I, [2014年12月12日T08:12:04.989695 #4834] INFO -- : worker=0 spawned pid=4834
I, [2014年12月12日T08:12:04.989993 #4834] INFO -- : Refreshing Gem list
I, [2014年12月12日T08:12:08.787527 #4834] INFO -- : worker=0 ready
/var/log/openvnet/vna.log
[root@centos7 vnet]# tail /var/log/openvnet/vna.log 
I, [2014年12月12日T08:12:16.044798 #4857] INFO -- : trema: pid_directory:'/var/run/openvnet/pid'.
I, [2014年12月12日T08:12:16.047938 #4857] INFO -- : starting OpenFlow controller.

9. OpenVNetの動作確認

12/11のAdvent Calendarで書かれているOpenVNetとDockerを組み合わせてみるデモを参考に、OpenVNet配下で2つの仮想ネットワークを動作させ、重複したIPアドレスを持つ「container1 ⇔ container3」「container2 ⇔ container4」が問題なく通信できることを確認しました。

[root@centos7 vnet]# cd
[root@centos7 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@centos7 ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0
[root@centos7 ~]# shutdown -r now
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br0
BOOTPROTO=none
ONBOOT=yes
HOTPLUG=no
/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
DEVICETYPE=ovs
TYPE=OVSBridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.16.20.41
NETMASK=255.255.255.0
HOTPLUG=no
OVS_EXTRA="
 set bridge ${DEVICE} protocols=OpenFlow10,OpenFlow12,OpenFlow13 --
 set bridge ${DEVICE} other_config:disable-in-band=true --
 set bridge ${DEVICE} other-config:datapath-id=00004e6d2b508f4c --
 set bridge ${DEVICE} other-config:hwaddr=02:01:00:00:00:01 --
 set-fail-mode ${DEVICE} standalone --
 set-controller ${DEVICE} tcp:127.0.0.1:6633
"
[vagrant@centos7 ~]$ sudo su -
[root@centos7 ~]# systemctl start vnet-vnmgr
[root@centos7 ~]# systemctl start vnet-webapi
[root@centos7 ~]# systemctl start vnet-vna
[root@centos7 ~]# mkdir vnet-docker
[root@centos7 ~]# cd vnet-docker/
[root@centos7 vnet-docker]# yum install docker -y
[root@centos7 vnet-docker]# systemctl start docker
[root@centos7 vnet-docker]# vi Dockerfile
[root@centos7 vnet-docker]# vi sshd.sh
[root@centos7 vnet-docker]# vi docker-init.sh
[root@centos7 vnet-docker]# vi docker-stop.sh
[root@centos7 vnet-docker]# vi docker-vnet.sh
[root@centos7 vnet-docker]# chmod +x docker*sh
[root@centos7 vnet-docker]# docker build -t centos_sshd .
[root@centos7 vnet-docker]# ./docker-init.sh
[root@centos7 vnet-docker]# ./docker-vnet.sh
[root@centos7 vnet-docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ad9a8e072b4 centos_sshd:latest "/bin/bash" 15 seconds ago Up 15 seconds romantic_goldstine 
7efc3d3f23c7 centos_sshd:latest "/bin/bash" 16 seconds ago Up 15 seconds distracted_wright 
3b3e2efd816d centos_sshd:latest "/bin/bash" 17 seconds ago Up 16 seconds backstabbing_hypatia 
b4d6125fc11a centos_sshd:latest "/bin/bash" 17 seconds ago Up 17 seconds lonely_brattain 
container1⇔container3
[root@centos7 vnet-docker]# docker attach b4d6125fc11a
[root@container1 /]# ssh 10.102.0.11
[root@container3 ~]# ip addr show veth3-2
46: veth3-2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether f2:9e:ec:82:a3:a3 brd ff:ff:ff:ff:ff:ff
 inet 10.102.0.11/24 scope global veth3-2
 valid_lft forever preferred_lft forever
 inet6 fe80::f09e:ecff:fe82:a3a3/64 scope link 
 valid_lft forever preferred_lft forever
container2⇔container4
[root@localhost ~]# docker attach 3b3e2efd816d
[root@container2 /]# ssh 10.102.0.11
[root@container4 ~]# ip addr show veth4-2
48: veth4-2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether b6:af:03:a7:6c:05 brd ff:ff:ff:ff:ff:ff
 inet 10.102.0.11/24 scope global veth4-2
 valid_lft forever preferred_lft forever
 inet6 fe80::b4af:3ff:fea7:6c05/64 scope link 
 valid_lft forever preferred_lft forever
Dockerfile
FROM centos:centos6
MAINTAINER nobuyuki.matsui <nobuyuki.matsui@gmail.com>
RUN yum -y update
RUN yum -y install openssh-server openssh-clients
RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config
RUN passwd -d root
ADD sshd.sh /etc/profile.d/
sshd.sh
# !/bin/sh
service sshd start
docker-init.sh
# !/bin/sh
BRIDGE=br0
DOCKER_PID=`ps -ef | grep docker | grep -v grep | awk '{print 2ドル}'`
DOCKER_IMAGE="centos_sshd"
IP_ADDRESSES=("10.102.0.10/24" "10.102.0.10/24" "10.102.0.11/24" "10.102.0.11/24")
rm -f ./netconfig.env
mkdir -p /var/run/netns/
for i in `seq 1 ${#IP_ADDRESSES[@]}`; do
 let address_index=$i-1
 CONTAINER_ID=`docker run --hostname="container${i}" --net="none" -i -t -d ${DOCKER_IMAGE} /bin/bash`
 BASH_PID=`docker inspect --format {{.State.Pid}} ${CONTAINER_ID}`
 ln -s /proc/${BASH_PID}/ns/net /var/run/netns/${BASH_PID}
 ip link add veth${i}-1 type veth peer name veth${i}-2
 ip link set veth${i}-1 up
 ip link set veth${i}-2 netns ${BASH_PID}
 ip netns exec ${BASH_PID} ip link set veth${i}-2 up
 ip netns exec ${BASH_PID} ip addr add ${IP_ADDRESSES[${address_index}]} dev veth${i}-2
 ovs-vsctl add-port ${BRIDGE} veth${i}-1
 hwaddr=`ip netns exec ${BASH_PID} ip link show veth${i}-2 | awk 'NR==2' | awk '{print 2ドル}'`
 ipaddr=`echo "${IP_ADDRESSES[${address_index}]}" | awk -F/ '{print 1ドル}'`
 netmask=`echo "${IP_ADDRESSES[${address_index}]}" | awk -F/ '{print 2ドル}'`
 echo "veth${i}-2 ${IP_ADDRESSES[${address_index}]}${hwaddr}"
 echo "export mac_veth${i}2=${hwaddr}" >> ./netconfig.env
 echo "export ip_veth${i}2=${ipaddr}" >> ./netconfig.env
 echo "export netmask_veth${i}2=${netmask}" >> ./netconfig.env
done
docker-stop.sh
# !/bin/sh
BRIDGE=br0
ovs-vsctl show | grep "Port \"veth" | awk '{print 2ドル}' | sed -e 's/"//g' | while read port; do
 ovs-vsctl del-port ${BRIDGE} ${port}
done
docker ps | awk '{print 1ドル}' | grep -v grep | grep -v CONTAINER | while read container_id; do
 docker kill ${container_id}
done
rm -rf /var/run/netns/*
docker-vnet.sh
# !/bin/sh
set -e
set -x
BASE="/opt/axsh/openvnet"
VNETPATH="${BASE}/vnet"
VNCTLPATH="${BASE}/vnctl"
mysqladmin -f -uroot drop vnet
mysqladmin -uroot create vnet
(cd ${VNETPATH}; bundle exec rake db:init)
. ./netconfig.env
cd ${VNCTLPATH}
# datapaths
bin/vnctl datapaths add \
 --uuid="dp-node1" \
 --display-name="node1" \
 --dpid="0x00004e6d2b508f4c" \
 --node-id="node1"
# networks
bin/vnctl networks add \
 --uuid="nw-vnet1" \
 --display-name="nw-vnet1" \
 --ipv4-network="10.100.0.0" \
 --ipv4-prefix="24" \
 --network-mode="virtual"
bin/vnctl networks add \
 --uuid="nw-vnet2" \
 --display-name="nw-vnet2" \
 --ipv4-network="10.100.0.0" \
 --ipv4-prefix="24" \
 --network-mode="virtual"
# interfaces
bin/vnctl interfaces add \
 --uuid="if-veth1" \
 --owner-datapath-uuid="dp-node1" \
 --network-uuid="nw-vnet1" \
 --mac-address="${mac_veth12}" \
 --ipv4-address="${ip_veth12}" \
 --port-name="veth1-1"
bin/vnctl interfaces add \
 --uuid="if-veth2" \
 --owner-datapath-uuid="dp-node1" \
 --network-uuid="nw-vnet2" \
 --mac-address="${mac_veth22}" \
 --ipv4-address="${ip_veth22}" \
 --port-name="veth2-1"
bin/vnctl interfaces add \
 --uuid="if-veth3" \
 --owner-datapath-uuid="dp-node1" \
 --network-uuid="nw-vnet1" \
 --mac-address="${mac_veth32}" \
 --ipv4-address="${ip_veth32}" \
 --port-name="veth3-1"
bin/vnctl interfaces add \
 --uuid="if-veth4" \
 --owner-datapath-uuid="dp-node1" \
 --network-uuid="nw-vnet2" \
 --mac-address="${mac_veth42}" \
 --ipv4-address="${ip_veth42}" \
 --port-name="veth4-1"
systemctl restart vnet-vna

最後に

何度も地雷を踏み抜き、やっとここまでたどり着きました。CentOS7でもOpenVNetは無事に動作するようです。これでOpenVNetの利用シーンが広がると良いですね。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AltStyle によって変換されたページ (->オリジナル) /