Openstack Networking Ogrenmeden once bilinmesi gerekenler …

Openstack networking’i anlamadan once asagidaki konulari anlamak gerekiyor;

  • cgroup / namespace
  • Linux Networking Namespace
  • ip ve iproute2 paketi
  • Networking Namespace Yaratma
  • veth ve veth pair
  • tun/tap interface
  • Patch port

Cgroup (resource management) / Namespace (process isolation)

Cgroup / Namespace kavramlari benim container’larla beraber duymaya basladigim (ozellikle LXC , Docker ile) bir Linux Kernel ozelligi.
Cgroup konumuz ile cok alakali degil ama kisaca bilmekte fayda var, cgroup hardware kaynagini task ve kullanicilara paylastirmaya yariyor, bunu yaparkende kaynagin tahsisi, onceliklendirmesi, erisimin engellenmesi, yonetimi ve monitor edilmesini sagliyor.

Namespace ise bizim icin su an daha onemli olan process isolation’i sagliyor (tum processler sistem processlerinde ayri , sanki overlay networkler gibi 192.168.0.0/24 u tum tenantlar tarafindan kullanilabilmesi gibi ) veya baska bir deyisle basit anlamda process sanallastirma . 5,6 tip namespace var PID (process), Network (network katmani), UTS (hostname) , Mount (Disk Erisimleri) , user (UIDs) ve IPC . Muhtemelen farkli namespace lerde mevcut fakat uygulanmis degiller gibi .

Linux Networking Namespace

Mantiksal olarak var olan “network stack” kopyasi , snapshot’i , sag tus -> copy ‘ siūüôā . Birbirinden bagimsiz route , firewall ve network device’lar (mesela loopback) . SNMP , socket , /procfs , /sysfs.

Daha gercek dunyadan dusunmek¬† gerekir ise boot etmis bir linux isletim sistemi uzerinde , eth0/em1/lo gibi interface’leri olan meseal veth0(sanal ethernet karti) gibi , sanki birden fazla container/sanal makine kosuyorda her birinin kendi ip adresi varmis gibi , iptables -L -v -n yapinca ana isletim sisteminden farkli kurallari olan , netstat -an yapildiginda yine¬† ana isletim sisteminden farkli socket lerin oldugunu dusunun.

Networking Namespace overlay networking kullanimini olagan kilar.

ip ve iproute2 paketi

iproute2 paketi bize network namespace yaratmada , interface leri up/down etmede , ip atamada kullanacagimiz ip tool unu sagliyor.

Bizim icin onemli olan komut “ip netns” olacak.

noroot@kvm-ovs-server2:~$ ip netns help
Usage: ip netns list
ip netns add NAME
ip netns delete NAME
ip netns identify PID
ip netns pids NAME
ip netns exec NAME cmd …
ip netns monitor

Networking Namespace Yaratma

Yaratalim

noroot@kvm-ovs-server2:~$ sudo ip netns add netnamespace1
[sudo] password for noroot:
noroot@kvm-ovs-server2:~$ sudo ip netns add netnamespace2

Listeleyelim

noroot@kvm-ovs-server2:~$ ip netns list
netnamespace2
netnamespace1

Host isletim sistemi uzerinde degisiklikler

noroot@kvm-ovs-server2:~$ ls -al /var/run/netns/
total 0
drwxr-xr-x  2 root root  80 Dec  8 17:41 .
drwxr-xr-x 19 root root 660 Dec  8 17:41 ..
-r–r–r–¬† 1 root root¬†¬† 0 Dec¬† 8 17:41 netnamespace1
-r–r–r–¬† 1 root root¬†¬† 0 Dec¬† 8 17:41 netnamespace2

Silelim

noroot@kvm-ovs-server2:~$ sudo ip netns del netnamespace3

Monitor ederlim, bu enteresan console da dinliyor ne yaparsaniz onlari bir cikti halinde size veriyor

noroot@kvm-ovs-server2:~$ sudo ip netns monitor

add netnamespace3
delete netnamespace3

Sanal Network Namespace inde interface leri gorelim

Burada “exec” e dikkat , netnamespace1 alaninda “ip link” komutu calistiriyoruz ….

noroot@kvm-ovs-server2:~$ sudo ip netns exec netnamespace1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

Container’a baglaniyormus gibi network namespace lerden birinin icersine girelimūüôā . Prompt a dikkat ….

noroot@kvm-ovs-server2:~$ sudo ip netns exec netnamespace1 bash
root@kvm-ovs-server2:~# ifconfig -a
lo        Link encap:Local Loopback
LOOPBACK  MTU:65536  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@kvm-ovs-server2:~# exit
exit
noroot@kvm-ovs-server2:~$

Not : exec [ns] bash ile cli> dustugunuz durumlarda¬† – export PS1=“ilgili namespace >” – yazarsaniz , prompt degisecektir ve takip etmede kolaylik olacaktir.

Simdi fiziksel makinemiz ve uzerinde isletim sistemi kurulu makinemizi default namespace olarak adlandiralim ve bir adet ethernet kartini yeni namespace’e aktaralim

Bu halihazirda calisan makinemiz …

noroot@kvm-ovs-server2:~$ ifconfig
em1       Link encap:Ethernet  HWaddr 00:17:a4:77:0c:14
inet addr:10.111.21.151  Bcast:10.111.21.255  Mask:255.255.255.0
inet6 addr: fe80::217:a4ff:fe77:c14/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:278142 errors:0 dropped:0 overruns:0 frame:0
TX packets:6880 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:38483614 (38.4 MB)  TX bytes:701883 (701.8 KB)

em2       Link encap:Ethernet  HWaddr 00:17:a4:77:0c:16
inet6 addr: fe80::217:a4ff:fe77:c16/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:4424 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:267662 (267.6 KB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Simdi ise em2 i transfer edelim , WOW !

noroot@kvm-ovs-server2:~$ sudo ip link set em2 netns netnamespace1
noroot@kvm-ovs-server2:~$ ifconfig
em1       Link encap:Ethernet  HWaddr 00:17:a4:77:0c:14
inet addr:10.111.21.151  Bcast:10.111.21.255  Mask:255.255.255.0
inet6 addr: fe80::217:a4ff:fe77:c14/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:278374 errors:0 dropped:0 overruns:0 frame:0
TX packets:6998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:38501844 (38.5 MB)  TX bytes:719101 (719.1 KB)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

noroot@kvm-ovs-server2:~$ sudo ip netns exec netnamespace1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: em2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:17:a4:77:0c:16 brd ff:ff:ff:ff:ff:ff

Simdi “netnamespace1” i sildigimizde “em2” default namespace’e geri donecegini bekliyoruz

noroot@kvm-ovs-server2:~$ sudo ip netns del netnamespace1

noroot@kvm-ovs-server2:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:17:a4:77:0c:14 brd ff:ff:ff:ff:ff:ff
3: em2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:17:a4:77:0c:16 brd ff:ff:ff:ff:ff:ff

Not : em2’i geri almak icin “ip link set em2 netns 1” denebilir.

Farkli bir namespace’e tasinabilir veya tasinamaz olan interface leri gormek . On tasinamaz, Off tasinabilir

noroot@kvm-ovs-server2:~$ sudo ethtool -k lo | grep netns-local
netns-local: on [fixed]
noroot@kvm-ovs-server2:~$ sudo ethtool -k em2 | grep netns-local
netns-local: off [fixed]

Diger Komutlar

ip netns pids -Namespace name-
ip netns identifiy #pid

Birde /etc/netns/*ilgili namespace*/hosts -> icersine bir kayit girdiginde ping lemeniz gerekiyormus ki ben bunu denemedim , pek ilgilenmedimde dogrusu.

veth ve veth pair

Elimizde iki adet namespace var diye dusunelim (netnamespace1) ve (netnamespace2) ve bunlar 192.168.10.0/24¬† ip subnetlerinin atanmis . Bu iki namespace’i birbiriyle haberlestirmek istiyoruz.

veth aslinda bir pipe/boru/tunel/link gibi , unix socket kullaniyor yani IPC ayni host uzerinde IP olmadan iki process arasinda iletisime gecmeye yarayan sanal ethernet interface leri. Cift yaratiliyor …

Asagida gordugunuz gibi veth0 ve veth1 adinda iki interface yaratiliyor ikiside default namespace de . Bu arada isim “veth” gibi olmak zorunda degil bacak1 , bacak2 de olabilir

noroot@kvm-ovs-server2:~$ sudo ip link add veth0 type veth peer name veth1
noroot@kvm-ovs-server2:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:17:a4:77:0c:14 brd ff:ff:ff:ff:ff:ff
3: em2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:17:a4:77:0c:16 brd ff:ff:ff:ff:ff:ff
4: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 86:1b:cf:ed:3c:74 brd ff:ff:ff:ff:ff:ff
5: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether fe:0f:c6:9d:6f:94 brd ff:ff:ff:ff:ff:ff

Simdi interface leri dagitalim

noroot@kvm-ovs-server2:~$ sudo ip link set veth0 netns netnamespace1
noroot@kvm-ovs-server2:~$ sudo ip link set veth1 netns netnamespace2

Resim olarak bunu cizecek olsa idik iki tane kutuyu birbirine bir iple bagladik ipin bagli oldugu bir taraf veth0 digeri ise veth1

Screen Shot 2015-12-08 at 19.10.41

noroot@kvm-ovs-server2:~$ sudo ip netns exec netnamespace1 ifconfig veth0 192.168.10.1/24 up
noroot@kvm-ovs-server2:~$ sudo ip netns exec netnamespace2 ifconfig veth1 192.168.10.2/24 up

Sirasiyla kontrol edin lutfen ,

  • default namespace de veth0 ve veth1 gorebiliyormusunuz ?
  • netnamespace1 de hangi interface ve ip adresini gorebiliyorsunuz ?
  • netnamespace2 de hangi interface ve ip adresini gorebiliyorsunuz ?
  • bir namespace den diger namespace deki ip adresini ping leyin.

veth pair Docker Container’larin HOST ile konusmasindan tutun , Neutron OVS Bridge’lerin birbirleriyle baglanmasina kadar kulanilmaktadir.

Tun/Tap Interface

Tun ve Tap sanal network kernel device lara verilen isim.. Baska bir deyisle sanal network karti vNIC, tap0 , tun0 diye web de ararken gordugunuz.

Tun derken akla L3 , Tap derken L2¬† aklimiza gelmeli , mesela Linux Bridge ve OVS Bridge lerden bahsediyoruz , sanal makinelerin bridge’e baglandigi noktaya tap interface diyoruz veya fiziksel switch port’u.

Patch Port

Iki bridge’i birbirine baglamak icin kullaniliyor, aslinda tek bir bridge’den farkli degil , patch kablo ile iki switch’i birbirine baglamak tek bir switch yaratmak gibi.

veth pair vs patch port 

Gordugum makalelerde belirtilen performans icin patch port kullanilmasi http://www.opencloudblog.com/?p=386

Guzel Linkler

Cgroup / Namespace

https://access.redhat.com/sites/default/files/pages/attachment/rhel_containers_tech_brief_12077347_v2_0414cd_web_0.pdf
http://www.haifux.org/lectures/299/netLec7.pdf

Namespace ve ip link

http://www.opencloudblog.com/?p=130

https://github.com/openvswitch/ovs/blob/master/FAQ.md (Mutlaka bastan sona gozden gecirilmeli)
Patch olayini system boot ederken otomatik yapmak http://superuser.com/questions/925270/openvswitch-multiple-virtual-bridges-over-one-bonding-interface

Posted on 14/12/2015, in OVS and tagged , , , , , , , , , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: