OVN (Open Virtual Network) を用いる事により、OVS (Open vSwitch)が動作する複数のサーバー(Hypervisor/Chassis)を横断する仮想ネットワークを構築する事ができます。
本スライドはOVNを用いた論理ネットワークの構成と設定サンプルのメモとなります。
Using OVN, you can build logical network among multiple servers (Hypervisor/Chassis) running OVS (Open vSwitch).
This slide is describes HOW TO example of OVN configuration to create 2 logical switch connecting 4 VMs running on 2 chassis.
14. Server ovn02,ovn03: ovs-vswitchd, ovn-controller設定・開始
Open Virtual Network : OVN Config example | 2015/12/27 14
3) Start ovs-vswitchd
$ sudo ovs-vswitchd --pidfile --detach --log-file
4) Set external-ids on conf.db:Open_vSwitch Table
• conf.db:Open_vSwitch Table にexternal-idsを設定。(”set open” は “set Open_vSwitch” の略)
• ovn-controller 起動時に external-idsを元に ovn-controller は Chassis (Hypervisor/Server) を ovnsb.db: Chassis table に登録。
• Bridge “br-int” はovn-controller 起動時に自動生成(br-int = integration bridge)
Server: ovn02
$ sudo ovs-vsctl set open . external-ids:system-id=56b18105-5706-46ef-80c4-ff20979ab002
$ sudo ovs-vsctl set open . external-ids:ovn-remote=tcp:172.16.0.10:6632
$ sudo ovs-vsctl set open . external-ids:ovn-encap-type=geneve
$ sudo ovs-vsctl set open . external-ids:ovn-encap-ip=172.16.0.20
Server: ovn03
$ sudo ovs-vsctl set open . external-ids:system-id=56b18105-5706-46ef-80c4-ff20979ab003
$ sudo ovs-vsctl set open . external-ids:ovn-remote=tcp:172.16.0.10:6632
$ sudo ovs-vsctl set open . external-ids:ovn-encap-type=geneve
$ sudo ovs-vsctl set open . external-ids:ovn-encap-ip=172.16.0.30
5) Start ovn-controller(8), ovn-controller-vtep(8)
$ sudo ovn-controller --pidfile --detach --log-file
bridge: br-int
ovn-
controller
172.16.0.20,30/24
server: ovn02,03
OVS DB
(conf.db, vtep.db)
15. Server ovn02,ovn03: namespace (VM) host1 / host2 の設定
Open Virtual Network : OVN Config example | 2015/12/27 15
1) vtap / veth の作成
Server: ovn02
$ sudo ip link add veth1 type veth peer name vtap1
$ sudo ip link add veth2 type veth peer name vtap2
Server: ovn03
$ sudo ip link add veth3 type veth peer name vtap3
$ sudo ip link add veth4 type veth peer name vtap4
2) create namespace and attach veth
• namespaceを作成しvethを紐付け。
• これにより vethX は各namespace(hostY)からのみ参照可能となる。
Server: ovn02
$ sudo ip netns add host1
$ sudo ip netns add host2
$ sudo ip link set veth1 netns host1
$ sudo ip link set veth2 netns host2
Server: ovn03
$ sudo ip netns add host3
$ sudo ip netns add host4
$ sudo ip link set veth3 netns host3
$ sudo ip link set veth4 netns host4
vtap1
veth1
ns: host1
vtap2
veth2
ns: host2
bridge: br-int
ovn-
controller
172.16.0.20,30/24
server: ovn02,03
OVS DB
(conf.db, vtep.db)
16. Server ovn02,ovn03: namespace (VM) host1 / host2 の設定
Open Virtual Network : OVN Config example | 2015/12/27 16
3) change interface status to “up” and assign IP address
Server: ovn02
$ sudo ip link set dev vtap1 up
$ sudo ip link set dev vtap2 up
$ sudo ip netns exec host1 ip link set veth1 up
$ sudo ip netns exec host2 ip link set veth2 up
$ sudo ip netns exec host1 ifconfig lo up
$ sudo ip netns exec host2 ifconfig lo up
$ sudo ip netns exec host1 ip addr add 172.16.2.1/24 dev veth1
$ sudo ip netns exec host2 ip addr add 172.16.2.2/24 dev veth2
Server: ovn03
$ sudo ip link set dev vtap3 up
$ sudo ip link set dev vtap4 up
$ sudo ip netns exec host3 ip link set veth3 up
$ sudo ip netns exec host4 ip link set veth4 up
$ sudo ip netns exec host3 ifconfig lo up
$ sudo ip netns exec host4 ifconfig lo up
$ sudo ip netns exec host3 ip addr add 172.16.2.3/24 dev veth3
$ sudo ip netns exec host4 ip addr add 172.16.2.4/24 dev veth4
vtap1
veth1
172.16.2.1/24
ns: host1
vtap2
veth2
172.16.2.2/24
ns: host2
bridge: br-int
ovn-
controller
172.16.0.20,30/24
server: ovn02,03
OVS DB
(conf.db, vtep.db)
17. 3) Set MAC address to each logical ports
• “2)” で確認したMAC address を各論理ポートに設定
Server: ovn01
$ sudo ovn-nbctl lport-set-addresses sw-port1 62:1a:d6:91:49:3d
$ sudo ovn-nbctl lport-set-addresses sw-port2 ae:de:c6:a4:f9:e4
$ sudo ovn-nbctl lport-set-addresses sw-port3 c2:5b:26:02:7f:87
$ sudo ovn-nbctl lport-set-addresses sw-port4 92:89:78:df:69:c9
OVN Logical Network の設定
Open Virtual Network : OVN Config example | 2015/12/27 17
1) Create a logical switch named "sw0“ and 4 logical ports on "sw0"
• ovn01 にて2つの論理スイッチ(sw0, sw1)と4つの論理ポートを作成
Server: ovn01
$ sudo -i
# ovn-nbctl lswitch-add sw0
# ovn-nbctl lswitch-add sw1
# ovn-nbctl lport-add sw0 sw-port1
# ovn-nbctl lport-add sw1 sw-port2
# ovn-nbctl lport-add sw1 sw-port3
# ovn-nbctl lport-add sw0 sw-port4
2) Check MAC address of veth1,2,3,4 on Server: ovn02, 03
• veth1,2,3,4 の MAC address を確認。以下はovn02: veth1の例。
root@ovn02:~$ sudo ip netns exec host1 ip a
…
9: veth1@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UP group default qlen 1000
link/ether 62:1a:d6:91:49:3d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.2.1/24 scope global veth1
valid_lft forever preferred_lft forever
inet6 fe80::601a:d6ff:fe91:493d/64 scope link
valid_lft forever preferred_lft forever
18. OVN Logical Network の設定
Open Virtual Network : OVN Config example | 2015/12/27 18
4) Bind Logical ports (sw-portX) and Physical ports (vtapX)
• 論理ポート(sw-portX)と物理ポート(vtapX)の紐づけ
Server: ovn02
$ sudo ovs-vsctl add-port br-int vtap1 -- set Interface vtap1 external_ids:iface-id=sw-port1
sudo ovs-vsctl add-port br-int vtap2 -- set Interface vtap2 external_ids:iface-id=sw-port2
Server: ovn03
$ sudo ovs-vsctl add-port br-int vtap3 -- set Interface vtap3 external_ids:iface-id=sw-port3
$ sudo ovs-vsctl add-port br-int vtap4 -- set Interface vtap4 external_ids:iface-id=sw-port4
5) ping による疎通確認
Server: ovn02
• host1-> host2, host3 :異なる論理スイッチ上のため ping 不可
$ sudo ip netns exec host1 ping 172.16.2.2
PING 172.16.2.2 (172.16.2.2) 56(84) bytes of data.
From 172.16.2.1 icmp_seq=1 Destination Host Unreachable
$ sudo ip netns exec host1 ping 172.16.2.3
PING 172.16.2.3 (172.16.2.3) 56(84) bytes of data.
From 172.16.2.1 icmp_seq=1 Destination Host Unreachable
• OK: host1 -> host4 : 同じ論理スイッチ上のため ping 可能
$ sudo ip netns exec host1 ping 172.16.2.4
PING 172.16.2.4 (172.16.2.4) 56(84) bytes of data.
64 bytes from 172.16.2.4: icmp_seq=1 ttl=64 time=1.58 ms