RAC on Docker イメージ公開しました
RAC on Docker の手順がある程度確立できたので、Docker image と手順を公開します。
CentOS7/docker-1.5 ubuntu 14.04/docker-1.5,docker-1.6で動作確認しています
なお、コンテナ内で設定できない、RAC要件のカーネルパラメータ(net.core.rmem_default等)が存在するため、今回の手順では -ignoreSysPrereqs -ignorePrereq 付きでインストールします。(要するに動作保証されていません)
https://github.com/s4ragent/rac_on_docker
ベースはOracleLinux7です。
コンテナ番号 | コンテナ名(ホスト名) | eth0(nouse) | eth1(public) | eth2(private) |
---|---|---|---|---|
1 | node001 | 172.17.xx.xx | 192.168.0.51 | 192.168.100.51 |
2 | node002 | 172.17.xx.xx | 192.168.0.52 | 192.168.100.52 |
<手順>
・gitをインストールしておきます
(Debian/ubuntu apg-get install git、CentOS,OracleLinux yum install git)
・Oracleソフトウェアをダウンロードして/docker/mediaに配置します
#mkdir -p /docker/media
#unzip linuxamd64_12102_database_1of2.zip -d /docker/media
#unzip linuxamd64_12102_database_2of2.zip -d /docker/media
#unzip linuxamd64_12102_grid_1of2.zip -d /docker/media
#unzip linuxamd64_12102_grid_2of2.zip -d /docker/media
#ls -al /docker/media
total 16
drwxr-xr-x 4 root root 4096 May 1 21:56 .
drwxr-xr-x 3 root root 4096 May 1 21:53 ..
drwxr-xr-x 7 root root 4096 Jul 7 2014 database
drwxr-xr-x 7 root root 4096 Jul 7 2014 grid
・create_racbase.sh を実行します(必要に応じてパッケージ(docker含む)がインストールされます)
#git clone http://github.com/s4ragent/rac_on_docker/
#cd rac_on_docker
#bash create_racbase.sh all_in_one
これだけで、とりあえず Oracle RAC on Dockerが動きます。
※5/3 追記
インストール後、コンテナ1を停止したい場合
#bash create_racbase.sh stopnode 1
その後、コンテナ1を起動したい場合、
#bash create_racbase.sh startnode 1
ホストをリブート後、再度すべてのコンテナを起動したい場合
#bash create_racbase.sh startall
詳しい解説は後日
(EC2) vxlanを使ったDockerコンテナ仮想ネットワークオーバーレイ
SoftLayer Summitにて
「DockerとOpenVNetを用いたSoftLayer VLAN上への仮想ネットワークオーバーレイ」
http://www.slideshare.net/cloudconductor/softlayer-summit-2015
を見て、Dockerの仮想ネットワークオーバーレイに興味を持ちました。
似たようなことをvxlan使ってできないかなーと思っていたところに
「Connecting Docker containers between VMs with VXLAN」
http://blog.thestateofme.com/2014/06/08/connecting-docker-containers-between-vms-with-vxlan/
という記事を見つけたので、unicast vxlanを使ってEC2上でDockerコンテナのオーバーレイネットワーク
を実現してみます。
今回の構成は以下の通りです。
(後で自分で使いそうなAmazon Linux/ubuntu/CentOSを網羅する為に、以下の構成になってます)
ホスト名 | OS(カーネル) | ローカルIP | 実インターフェース | brigde用IP | コンテナ用IP |
---|---|---|---|---|---|
A | Amazon linux 2014.09.2.x86_64(3.14.27-25.47.amzn1.x86_64) | 172.31.2.203 | eth0 | 192.168.0.11 | 192.168.0.101 |
B | ubuntu-trusty-14.04-amd64-server-20150123 (3.13.0-44-generic) | 172.31.15.69 | eth0 | 192.168.0.12 | 192.168.0.102 |
C | CentOS 7 x86_64 (2014_09_29) EBS (3.10.0-123.8.1.el7.x86_64) | 172.31.4.212 | eth0 | 192.168.0.13 | 192.168.0.103 |
ハマりどころとして、brigde fdb append にて自ホストIPアドレスを追加してしまうと
コンテナが他ホスト/コンテナと上手く通信できなくなりますので注意をしてください。
★ブリッジ+vxlanインターフェース作成
###nodeA 172.31.2.203 amazon linux###
sudo su - yum -y install git bison flex libdb-devel db4-devel gcc docker bridge-utils git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git cd iproute2 ./configure make make DESTDIR=/usr/share install service docker start chkconfig docker on #delete docker0,vxlan10 if exists /usr/share/sbin/ip link set docker0 down brctl delbr docker0 /usr/share/sbin/ip link del vxlan10 #add docker brigde interface brctl addbr docker0 #create virtual mac addr ref by http://d.ballade.jp/2008/03/vif-and-mac-address.html vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` /usr/share/sbin/ip link set docker0 address $vmac /usr/share/sbin/ip address add 192.168.0.11/24 dev docker0 #add vxlan interface /usr/share/sbin/ip link add vxlan10 type vxlan id 10 ttl 4 dev eth0 #get unique mac addr vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` /usr/share/sbin/ip link set vxlan10 address $vmac brctl addif docker0 vxlan10 /usr/share/sbin/ip link set vxlan10 up /usr/share/sbin/ip link set docker0 up #add other hosts VTEP /usr/share/sbin/bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.15.69 /usr/share/sbin/bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.4.212
###nodeB 172.31.15.69 ubuntu###
sudo su - apt-get -y install docker.io bridge-utils #delete docker0,vxlan10 if exists ip link set docker0 down brctl delbr docker0 ip link del vxlan10 brctl addbr docker0 #create virtual mac addr ref by http://d.ballade.jp/2008/03/vif-and-mac-address.html vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip link set docker0 address $vmac ip address add 192.168.0.12/24 dev docker0 ip link add vxlan10 type vxlan id 10 ttl 4 dev eth0 vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip link set vxlan10 address $vmac brctl addif docker0 vxlan10 ip link set vxlan10 up ip link set docker0 up bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.2.203 bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.4.212
###nodeC 172.31.4.212 centos ###
sudo su - #kernel 3.10.0-123.8.1.el7.x86_64では、unicast vxlan使うとカーネルパニック起こすのでupdate yum -y update kernel yum -y install git bison flex libdb-devel db4-devel gcc docker bridge-utils reboot #リブート後再ログイン sudo su - service docker start chkconfig docker on #delete docker0,vxlan10 if exists ip link set docker0 down brctl delbr docker0 ip link del vxlan10 brctl addbr docker0 #create virtual mac addr ref by http://d.ballade.jp/2008/03/vif-and-mac-address.html vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip link set docker0 address $vmac ip address add 192.168.0.13/24 dev docker0 ip link add vxlan10 type vxlan id 10 ttl 4 dev eth0 vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip link set vxlan10 address $vmac brctl addif docker0 vxlan10 ip link set vxlan10 up ip link set docker0 up bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.2.203 bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 172.31.15.69
★コンテナ作成+IPアドレスの割り当て
##nodeA 172.31.2.203 amazon###
gateway=`ip addr show docker0 | grep "inet " | awk -F '[/ ]' '{print $6}'` id=`sudo docker run -i -t -d --net=none centos /bin/bash` pid=`docker inspect --format {{.State.Pid}} ${id}` # 起動したDockerコンテナのprocをnetnsにリンク mkdir -p /var/run/netns ln -s /proc/${pid}/ns/net /var/run/netns/${pid} # vethペアを作成 ip link add veth1b type veth peer name veth1c # vethペアの一方をovsBridgenに設定し起動 brctl addif docker0 veth1b ip link set veth1b up # vethペアの残りの一方をDockerコンテナにセットして起動 ip link set veth1c netns ${pid} ip netns exec ${pid} ip link set dev veth1c name eth0 ip netns exec ${pid} ip link set eth0 up #uniqueなMACアドレスをコンテナ内のeth0に割り当て vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip netns exec ${pid} ip link set eth0 address $vmac #IPアドレスの設定 ip netns exec ${pid} ip addr add 192.168.0.101/24 dev eth0 #ゲートウェイの設定 ip netns exec ${pid} ip route add default via $gateway
###nodeB 172.31.15.69 ubuntu###
gateway=`ip addr show docker0 | grep "inet " | awk -F '[/ ]' '{print $6}'` id=`sudo docker run -i -t -d --net=none centos /bin/bash` pid=`docker inspect --format {{.State.Pid}} ${id}` # 起動したDockerコンテナのprocをnetnsにリンク mkdir -p /var/run/netns ln -s /proc/${pid}/ns/net /var/run/netns/${pid} # vethペアを作成 ip link add veth1b type veth peer name veth1c # vethペアの一方をovsBridgenに設定し起動 brctl addif docker0 veth1b ip link set veth1b up # vethペアの残りの一方をDockerコンテナにセットして起動 ip link set veth1c netns ${pid} ip netns exec ${pid} ip link set dev veth1c name eth0 ip netns exec ${pid} ip link set eth0 up vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip netns exec ${pid} ip link set eth0 address $vmac ip netns exec ${pid} ip addr add 192.168.0.102/24 dev eth0 ip netns exec ${pid} ip route add default via $gateway
###nodeC 172.31.4.212 centos ###
gateway=`ip addr show docker0 | grep "inet " | awk -F '[/ ]' '{print $6}'` id=`sudo docker run -i -t -d --net=none centos /bin/bash` pid=`docker inspect --format {{.State.Pid}} ${id}` # 起動したDockerコンテナのprocをnetnsにリンク mkdir -p /var/run/netns ln -s /proc/${pid}/ns/net /var/run/netns/${pid} # vethペアを作成 ip link add veth1b type veth peer name veth1c # vethペアの一方をovsBridgenに設定し起動 brctl addif docker0 veth1b ip link set veth1b up # vethペアの残りの一方をDockerコンテナにセットして起動 ip link set veth1c netns ${pid} ip netns exec ${pid} ip link set dev veth1c name eth0 ip netns exec ${pid} ip link set eth0 up vmac=`perl -e 'print sprintf("00:16:3e:%2.2x:%2.2x:%2.2x", rand()*255, rand()*255, rand()*255)'` ip netns exec ${pid} ip link set eth0 address $vmac ip netns exec ${pid} ip addr add 192.168.0.103/24 dev eth0 ip netns exec ${pid} ip route add default via $gateway
動作確認
docker attach XX後、、、
[root@6653ad538420 /]# ping 192.168.0.101 PING 192.168.0.101 (192.168.0.101) 56(84) bytes of data. 64 bytes from 192.168.0.101: icmp_seq=1 ttl=64 time=0.023 ms 64 bytes from 192.168.0.101: icmp_seq=2 ttl=64 time=0.034 ms 64 bytes from 192.168.0.101: icmp_seq=3 ttl=64 time=0.032 ms ^C --- 192.168.0.101 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.023/0.029/0.034/0.007 ms [root@6653ad538420 /]# ping 192.168.0.102 PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data. 64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.760 ms 64 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.809 ms 64 bytes from 192.168.0.102: icmp_seq=3 ttl=64 time=0.899 ms 64 bytes from 192.168.0.102: icmp_seq=4 ttl=64 time=0.656 ms ^C --- 192.168.0.102 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.656/0.781/0.899/0.087 ms [root@6653ad538420 /]# ping 192.168.0.103 PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data. 64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=0.969 ms 64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.536 ms 64 bytes from 192.168.0.103: icmp_seq=3 ttl=64 time=0.596 ms 64 bytes from 192.168.0.103: icmp_seq=4 ttl=64 time=0.606 ms ^C --- 192.168.0.103 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3001ms rtt min/avg/max/mdev = 0.536/0.676/0.969/0.173 ms
参考URL
https://docs.docker.com/articles/networking/
http://blog.thestateofme.com/2014/06/08/connecting-docker-containers-between-vms-with-vxlan/
http://qiita.com/nmatsui/items/2fee1d4a526a6ba3c887
http://www.slideshare.net/cloudconductor/softlayer-summit-2015
AWSとSoftLayerをvxlanで繋いでみる
Japan SoftLayer Summit 2015があり、ちょっとSoftLayerに興味を持ったので、
触って見ました。
いつもならOracle RAC構築に走るのですが、
SoftLayerでのOracle RAC構築は以下のURLで紹介されていますので、今回は個人的にアツイvxlanを使って
AWSとSoftLayerをvxlanで繋いでみます。
Oracle RAC+Softlayerの記事はこちら
http://dba-ha.blogspot.jp/2014/07/softlayer-oracle-rac.html
なお、EC2 with vxlanについては、こちらのエントリで紹介していますので、vxlanについて解説はしません。
http://d.hatena.ne.jp/KNOPP/20141210/1418224473
今回の構成は以下の通りです。
AWS/SoftLayer | ホスト名 | OS(カーネル) | PublicIP | 実インターフェース | vxlan用IP | vxlan用インターフェース |
---|---|---|---|---|---|---|
AWS | A | Amazon linux 2014.09.2.x86_64(3.14.27-25.47.amzn1.x86_64) | 54.200.xx.xx | eth0 | 192.168.1.1 | vxlan0 |
SoftLayer | B | CentOS7(3.10.0-123.20.1.el7.x86_64) | 158.85.xx.xx | eth1 | 192.168.1.2 | vxlan0 |
・事前準備
EC2側、SoftLayer側双方でUDP通信ができるようにしておく。
(ポート番号の指定方法が今のところ不明なので、UDP ALLということで、、、)
・EC2側
###Amazon Linuxにインストールされているiproute2はvxlan(unicast)に対応していないので、 ###最新版をソースから入手しインストール sudo su - yum -y install git bison flex libdb-devel db4-devel gcc git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git cd iproute2 ./configure make make DESTDIR=/usr/share install ###vxlanの構成 #仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る /usr/share/sbin/ip addr add 192.168.1.1/24 broadcast 192.168.1.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストBを登録 /usr/share/sbin/bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 158.85.xx.xx
SoftLayer側
###CentOS7ではiproute2がvxlan(unicast)に対応しているので、iproute2のインストールの必要はありません。 ###ただし、kernel 3.10.0-123.20.1.el7未満だとvxlanをunicastで使おうとするとKernelパニックが起きるので注意(kernel updateが必要) ###softlayerのCentOS7は2/14現在kernelは3.10.0-123.20.1.el7なので、問題無し。 ###vxlanの構成 #仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth1(public) ip link add vxlan0 type vxlan id 10 dev eth1 #vxlan0にipアドレスを振る ip addr add 192.168.1.2/24 broadcast 192.168.1.255 dev vxlan0 #vxlanインターフェースをアップさせる。 ip link set vxlan0 up #ホストAを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 54.200.xx.xx
動作確認 ping ホストB→A
[root@centos ~]# ping 192.168.1.1 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=44.1 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=21.7 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=21.6 ms 64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=21.7 ms 64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=21.8 ms
動作確認 ping ホストA→B
[root@ip-172-31-39-175 iproute2]# ping 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=22.0 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=21.8 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=21.9 ms 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=21.9 ms 64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=21.9 ms
動作確認 ホストBへ追加でIP(192.168.1.3/24)付与
[root@centos ~]#ip addr add 192.168.1.3/24 broadcast 192.168.1.255 dev vxlan0
動作確認 ping ホストA→B (追加したIP)
[root@ip-172-31-39-175 iproute2]# ping 192.168.1.3 PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=45.3 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=22.6 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=22.7 ms 64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=22.6 ms 64 bytes from 192.168.1.3: icmp_seq=5 ttl=64 time=22.7 ms
こんな感じでSoftLayer、AWS間で仮想L2ができました。
なお、SoftLayer、AWS間の通信は暗号化されていませんので、ご利用は計画的に。
RHEL7/CentOS7/OEL7でvxlanを使うときの注意点
ここらへんの記事でvxlanを紹介していますが、
RHEL7/CentOS7/OEL7で使用する場合は注意点があります。
kernel 3.10.0-123.20.1.el7未満ですと、以下の不具合に該当し、ユニキャストモードでvxlanを使おうとするとカーネルパニックが発生するようです。
If the vxlan interface is created without explicit group definition,there are corner cases which may cause kernel panic.
https://lkml.org/lkml/2014/4/18/172 *
RHEL7/CentOS7/OEL7でvxlanを使いたい場合は最新のカーネルまでアップデートして使うのが無難です。
*kernel 3.12となっていますが、RHEL7/CentOS7/OEL7ではkernel 3.10にバックポートされており該当します。
また自分でハマりそうなので、ここに記録しておきます。
EC2 with vxlan (Oracle RAC on EC2)
JPOUG Advent Calender 2014(http://jpoug.doorkeeper.jp/events/17313) の11日目
AWS Advent Calendar 2014 (http://qiita.com/advent-calendar/2014/aws) の11日目
のクロスエントリです。
AWSはとても便利ですごく好きなのですが、一つだけ不満な点があります。
それが、VPC上でmulticast/broadcastがサポートされていない点です。
multicast/broadcastをなんとか実現する為に、GREやOpenVPN、tinc等のトンネリング技術が使われたり
するのですが、ここで紹介するvxlanもまた、そのトンネリング技術のひとつです。
vxlanについて、詳細は以下の@ITの記事を参照ください。
VXLANが登場した理由、他の実装との違い、特徴を整理しよう (1/3)
http://www.atmarkit.co.jp/ait/articles/1412/03/news009.html
Linuxでvxlanが実装された当初はマルチキャストが必要だったのですが、
kernel 3.10ではユニキャストでノード間の接続ができます(Allow setting destination to unicast address)。(それ以前はマルチキャストが必要)
なんと、 このユニキャストで接続できるモードは、kernel 2.6.32-431(RHEL/CentOS/OEL 6.5)以降バックポートされているのです!!このvxlan、個人で確認するかぎりでは、物理インターフェースよりも若干スループットが落ちる程度で非常にパフォーマンスが良いです。(OpenVPNやtincよりもスループットがでます!)
これはEC2で使わない手はありませんね。
というわけで、RHEL/CentOS/OEL 6.5でのEC2 with vxlanの使い方をさらっとここで説明します。
(たぶん、kernel 3.10以降でも手順は同じハズ、、、、、)
○準備
RHEL/CentOS/OEL 6.5のkernel(2.6.32-431 否uek)はvxlanに対応していますが、ipコマンド(iproute2)が対応していませんので、
最新版を取得し、インストールします。
なお、従来のバージョンはそのまま残しておいて、最新バージョンを別ディレクトリ(/usr/share)にインストールします。
yum -y install git bison flex db4-devel git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git cd iproute2 ./configure make make DESTDIR=/usr/share install
○使い方
以下の構成とします
ホスト名 | 実IP | vxlan0 |
---|---|---|
ホストA | 172.31.10.100 | 172.16.1.1 |
ホストB | 172.31.10.101 | 172.16.1.2 |
ホストC | 172.31.10.102 | 172.16.1.3 |
仮装ネットワークは 172.16.0.0/20 vxlan0はvxlanid 10
以下のコマンドを実行します。
ホストA
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.1/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.1/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストB、Cを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101
ホストB
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.2/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.2/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストA、Cを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.100 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.102
ホストC
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.3/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.3/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストA、Bを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.100 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101
スループットの確認
(検証の都合上、実IPは上記IPとは異なりますので雰囲気だけ。 SR-IOVを有効にしています。)
m3.medium 実IP [root@db002 ~]# iperf -c 172.31.14.159 ------------------------------------------------------------ Client connecting to 172.31.14.159, TCP port 5001 TCP window size: 92.6 KByte (default) ------------------------------------------------------------ [ 3] local 172.31.6.190 port 60109 connected with 172.31.14.159 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 463 MBytes 388 Mbits/sec vxlan [root@db002 ~]# iperf -c 172.16.1.1 ------------------------------------------------------------ Client connecting to 172.16.1.1, TCP port 5001 TCP window size: 92.1 KByte (default) ------------------------------------------------------------ [ 3] local 172.16.1.2 port 48250 connected with 172.16.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 460 MBytes 386 Mbits/sec m3.large 実IP [root@db002 ~]# iperf -c 172.31.11.88 ------------------------------------------------------------ Client connecting to 172.31.11.88, TCP port 5001 TCP window size: 92.6 KByte (default) ------------------------------------------------------------ [ 3] local 172.31.15.237 port 20624 connected with 172.31.11.88 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 853 MBytes 715 Mbits/sec vxlan [root@db002 ~]# iperf -c 172.16.1.1 ------------------------------------------------------------ Client connecting to 172.16.1.1, TCP port 5001 TCP window size: 92.1 KByte (default) ------------------------------------------------------------ [ 3] local 172.16.1.2 port 62692 connected with 172.16.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 848 MBytes 711 Mbits/sec
→物理インターフェースよりも若干スループットが落ちる程度です。
最後にvxlanを使うとこんなことができる一例です
Oracle Linux 6.5(HVM SRIOV有効化済み) Oracle Database oracle 12.1.0.1 での64ノードクラスタ
参考文献
http://diary.atzm.org/20140416.html
http://www.atmarkit.co.jp/ait/articles/1412/03/news009.html
追記:
vxlanを使う場合に、OS起動と同時にvxlanインターフェース有効化する方法ないですかね?
( ifcfg-xxxx を使うイメージで )
みつからないんで、今回はinit script書いちゃいましたけど。
openvswitch on EC2 その2
まずは、宣伝から
まだ席に余裕がありますので、興味ある方は是非
JPOUG> SET EVNETS 20140907
詳細は、こちら
JPOUG> SET EVNETS 20140907
前回公開したエントリでは、以下の問題がありました
・通信が不安定になることがある
→ブリッジインターフェースを二つに分ける必要がある
・EC2メタデータ(169.254.169.254)にアクセスできない
→br0から169.254.169.254にアクセスするrouteを低メトリックで登録
・インターネットにアクセスできない
→デフォルトゲートウェイの指定が必要
前回分も含めて設定をやってくれるスクリプトを作成しましたので、公開します。
https://gist.github.com/s4ragent/c73655fbf6b75096c250
CentOS/RHEL限定です。(Oracle LinuxはUEKだと動かないと思います)
使い方
OVSのダウンロード/インストール
sh ec2openvswitch ovsinstall
ブリッジインターフェイスの作成/初期化
sh ec2openvswitch ovsinit
トンネルの作成
sh ec2openvswitch ovssetgre リモートIP1 リモートIP2 ・・・・
内部インターフェースの作成
sh ec2openvswitch ovscreateint 作成するデバイス名 IPアドレス NETMASK
*デバイス名は 英字+数字(0以外) 数字は vlan-idになります
例 sh ec2openvswitch ovscreateint vlan10 192.168.0.11 255.255.255.0