Yeni Baslayanlar Icin Docker Swarm Multi-Host Networking

Docker Swarm , Docker 1.12/1.13 ve simdi 17.03 ile bambaska , aslinda daha onceden bakasim vardi ama iyiki bakmamisim : ) Bu makale direkt docker swarm ile ilgili degil , docker swarm ile gelen networking kismina goz atiyor olacagiz.

Oncelikle herseyin basi SwarmKit . Bu dokumani donup donup okumak lazim.

Dedigim gibi konumuz “multi-host networking“.

Baslamadan once eger burada yazili olanlari test etmek icin elinizde bir donanim, sanal makine, dorukcloud, azure, digitalocean gibi bir cloud ortaminiz yok ise direkt http://www.play-with-docker.com adresinden sorunsuz , hizli bir sekilde docker ortamina sahip olabilir ve test yapabilirsiniz.

Elimizde bir master ve iki slave’den (Node’lar sanal ve Ubuntu 16.04 Xenial kurulu) olusmus Swarm Cluster mevcut.

Ufak bir snapshot alalim neler var neler yok. Asagida gordugunuz gibi 3 adet toplamda node mevcut , biri swam master diger ikisi swarm worker nodelari. Burada dikkat etmeniz gereken bir durum var , bazi komutlar sadece ve sadece docker swarm manager uzerinden calistirilabilir, eger hata alirsaniz yanlis node uzerinde olmalisiniz veya ilgili node’u manager rolune yukseltebilirsiniz 😀 Alicaginiz hata asagidaki gibi olacaktir.

Error response from daemon: This node is not a swarm manager. Worker nodes can’t be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

Node’lari listeleyerek baslayalim

noroot@swarmmaster:~$ sudo docker node ls


ID                           HOSTNAME     STATUS  AVAILABILITY  MANAGER STATUS

esabe22n1ka5yfbwh3ubuve2c    swarmslave2  Ready   Active

o9gti52bwb5iki4cbvhgwb7th    swarmslave1  Ready   Active

uez4ty48aphxsx5wjyl38de5g *  swarmmaster  Ready   Active        Leader

Simdi bakalim hangi networkler var

noroot@swarmmaster:~$ sudo docker network ls


NETWORK ID          NAME                DRIVER              SCOPE

8c6b95c4bd70        bridge              bridge              local

2810aa28fd10        docker_gwbridge     bridge              local

c11c3d05a3a1        host                host                local

5gq03jfs0mr7        ingress             overlay             swarm

45bf85b84dae        none                null                local

Eger burada tek bir docker node’undan bahsediyor olsa idik muhtemelen uc adet ciktimiz olacakti, bunlardan biri host , digeri none ve bridge ama docker swarm kurdugumuz icin iki adet farkli network olusmus durumda , biri ingress digeri docker_gwbridge . Bunla docker swarm kurdugunuzda otomatik olarak sistem tarafindan yaratilmis networkler, ne ise yaradigini birazdan anlatacagim fakat bunla beraber birde kullanici tarafindan yaratilan/tanimlanan overlay networkler olacak. Yani docker swarm ile artik ek uc farkli networkden bahsediyor olacagiz.

Varsayili olarak gelen networkler, bridge bizim docker0 diye bildigimiz ve containerlarin varsayili olarak baglandigi network , none ise tamamen izole kimsenin erisemeyecegi , host ise docker node’un buludugu network’u belirtmektedir.

Bu yeni yaratilan networklerin biri bridge diger ise overlay network . Overlay network deyince aklimiza vxlan, gre, NSX , NVGRE gibi seyler gelecektir , amacimiz yaratacagimiz servislerin icersindeki task/containerlarin izole, programlanabilir ve birbirini tekrarlayabilir sekilde kullanmak.

Docker uzerinden bunu bir ornekle belirmek gerekir ise ; Diyelim elimizde uc adet servis var, bunlar servis1 , servis2 ve servis 3 olsun. Her bir servis icin 30 adet container kossun , bu containerlar farkli docker swarm worker nodelara yayilmis ve yuksek erilebilirlik saglanmis fakat birbirleri arasindada konusabilir olsun , her bir servis kendisini disariya sadece bir endpoint/load balancer ile acmis ve hicbir sekilde farkli servislerin kostugu ip bloklarina dahil olmasin , fakat senaryo bu ya her servis icinde 192.168.0.0/24 ip blogunu kullansin, ip dagitimi otomatik olsun , hatta abartalim infoblox gibi bir IPAM olsun dedigimizde alin size overlay network ve swarm mode multi host networking.

Docker 1.12 oncesinde overlay networkleri desteklemek icin ucuncu parti key-value store kullanmak gerekiyordu, ornegin etcd , consule veya zookeeper (aslinda su anda isterseniz yine ayni sekilde kullanabilirsiniz). Docker 1.12 ile beraber artik libkv kutuphanesi ile docker built-in key-value store’a kavusmus durumda. libkv ayni zamanda diger kv cozumleri icinde bir abstraction layer halinde altinda etcd , consule veya zookeeper kullanabiliyor.

Docker swarm uzerinde tum networing islerini yapan kutuphane libnetwork.

Openstack bilgisi olanlar icin belki neden OpenvSwitch (OVS) kullanilmamis diyebilirsiniz , burada Docker ek farkli yazilim katmanlari ile ugrasarak islemleri kompleks kilmamak icin daha onceden SDN isleri ile ugrasan bir firma socketplane-io almis ve libnetwork boylece olusmus,

Ornek kullanici tarafindan tanimlanmis overlay network yaratma ;

Asagida iki adet overlay network yaratilmis durumda, anlasilacagi gibi belli bir subnetde yaratilmislar, biri digerine gore ek bir parametre ile ayrilmis durumda, bunun nedenini docker_gwbridge anlattigimizda goreceksiniz.

noroot@swarmmaster:~$ sudo docker network create -d overlay –subnet 10.0.0.0/24 OverlayNetwork11

zlp142sao6383gogu7uhps3op

noroot@swarmmaster:~$ sudo docker network create -d overlay –internal –subnet 10.0.0.0/24 OverlayNetwork22

z87bf0xu857y4mtwe5tmoxo4t

Docker kullanirken inspect komutu bizim icin ayrintilar saglayacaktir, inspect network ile container ile yani her tur bilesen icin ayrinti saglayacaktir bize. Asagidaki komutta dikkat edilmesi gerekenler ; Driver , Gateway , Internal ve vxlanid.

Network bilgisi olan arkadaslar bileceklerdir , normalde overlay networklere ihtiyac duymamizdaki sebep switchler uzerinde izolasyon icin kullandigimiz vlan sayisinin en fazla 4096 olmasi ve bu yapilarin programlanabilir olmamasi idi (APIsi olan veya DevOps, scripting ile ayarlanabilen switchler var tabi). vxlan ile beraber 16 milyon adet birbirinden izole network yaratabiliyoruz, Docker’da 4097 den baslatmis siralamayi 🙂

–attachable diye bir parametre var , bu aslinda simdilik onemsiz ama anlami docker run ile container yarattiginizda ilgili container’i bu network atayabileceginizi belirler, cunku docker swarm ile overlay network uzerinde container calistirmanin tek yolu docker service create komutudur.

Isteseydik –label parametresi ile bu network’e bir metadata ekleyebilirdik , bilginiz olsun nasil SSD diskli bir docker node uzerinde container kosturmak icin label/constraint kullaniliyor ise bu tip bir islem veya sadece etiketleme icin kullanilabilir. Daha fazla komut yardimi icin –> docker network create –help <–

noroot@swarmmaster:~$ sudo docker network inspect OverlayNetwork11

</pre>
[

{

"Name": "OverlayNetwork11",

"Id": "zlp142sao6383gogu7uhps3op",

"Created": "0001-01-01T00:00:00Z",

"Scope": "swarm",

"<strong>Driver</strong>": "overlay",

"EnableIPv6": false,

"IPAM": {

"Driver": "default",

"Options": null,

"Config": [

{

"Subnet": "10.0.0.0/24",

"Gateway": "10.0.0.1"

}

]

},

"Internal": false,

"Attachable": false,

"Containers": null,

"Options": {

"com.docker.network.driver.overlay.vxlanid_list": "4097"

},

"Labels": null

}

]
<pre>

Simdi servis yaratalim , service yaratmak aslinda bildigimiz docker run demenin swarm’casi , tabi ek bir suru seyi kapsiyor fakat basitce docker swarm uzerinde bir adet container bile yaratmak isterseniz docker service create komutunu kullanarak. Dikkat ederseniz biri OverlayNetwork11 , digeri ise OverlayNetwork22 de.

noroot@swarmmaster:~$ docker service create –name Service11 –network OverlayNetwork11 busybox sleep 3600

noroot@swarmmaster:~$ docker service create –name Service22 –network OverlayNetwork22 busybox sleep 3600

Yarattigimiz servislere bir bakalim , baslangicta herhangi bir adet belirtmedigimiz icin her iki serviste sadece bir adet container/task/instance ile ayaga kalkmis ve calisiyor.

root@swarmmaster:/home/noroot# docker service ls

ID            NAME       MODE        REPLICAS  IMAGE

9asxwrvjiat8  Service11  replicated  1/1       busybox:latest

ojlddp0ia3v8  Service22  replicated  1/1       busybox:latest

Burada bir guzel komut daha var, bir sonraki karsilastirmamiz icin onemli, yaratilan service altindaki container/task/instance hangi swarm node altinda yaratilmis.

root@swarmmaster:/home/noroot# docker service ps Service11

ID            NAME         IMAGE           NODE         DESIRED STATE  CURRENT STATE           ERROR  PORTS

yac809xs8a88  Service11.1  busybox:latest  swarmslave2  Running        Running 29 minutes ago

root@swarmmaster:/home/noroot# docker service ps Service22

ID            NAME         IMAGE           NODE         DESIRED STATE  CURRENT STATE           ERROR  PORTS

vsuf0n3pdeos  Service22.1  busybox:latest  swarmslave1  Running        Running 27 minutes ago

Ilgili komutlari calistirdiktan sonra tum swarm slave node’lari gezin , goreceksiniz ki ilgili task/container calistigi nodelarda sadece ilgili vxlan tanimlari yapilmis olacak.

Asagida goreceginiz gibi Service11 –> swarmslave2 ,  Service 22 –> swarmslave1 uzerinde ve bu nodelar uzerinde networklere baktigimizda master haric swarmslave2 uzerinde sadece OverlayNetwork11 yaratilmis.

root@swarmmaster:/home/noroot# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

b7llakvb7djb        OverlayNetwork11    overlay             swarm

77cljd7zrdvo        OverlayNetwork22    overlay             swarm

8c6b95c4bd70        bridge              bridge              local

2810aa28fd10        docker_gwbridge     bridge              local

c11c3d05a3a1        host                host                local

5gq03jfs0mr7        ingress             overlay             swarm

45bf85b84dae        none                null                local

root@swarmslave1:/home/noroot# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

77cljd7zrdvo        OverlayNetwork22    overlay             swarm

137fd97bfbf1        bridge              bridge              local

749d4fe0814e        docker_gwbridge     bridge              local

14254872e5e1        host                host                local

5gq03jfs0mr7        ingress             overlay             swarm

75f14e07ba43        none                null                local

root@swarmslave2:/home/noroot# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

b7llakvb7djb        OverlayNetwork11    overlay             swarm

d0654cb24718        bridge              bridge              local

eb5b96ba7531        docker_gwbridge     bridge              local

937a00f01f99        host                host                local

5gq03jfs0mr7        ingress             overlay             swarm

41364a08dda6        none                null                local

Simdi servisin diger bir guzel ozelligi scale’i gorelim

root@swarmmaster:/home/noroot# docker service scale Service22=3

Service22 scaled to 3

root@swarmmaster:/home/noroot# docker service ps Service22

ID            NAME         IMAGE           NODE         DESIRED STATE  CURRENT STATE           ERROR  PORTS

vsuf0n3pdeos  Service22.1  busybox:latest  swarmslave1  Running        Running 33 minutes ago

w28guglkfp54  Service22.2  busybox:latest  swarmmaster  Running        Running 40 seconds ago

mwgtydzxclsh  Service22.3  busybox:latest  swarmslave2  Running        Running 6 minutes ago

Gordugunuz gibi bir anda ik tane data ek busybox container’imiz calismaya basladi Service22 altinda ve her biri farkli swarm node uzerinde (master dahil) , yukardaki komutun aynisini calistirarark kontrol edin, networkler olmayan nodelarda yaratildi mi ?

Simdi harbiden iki farki node uzerindeki ayni servis icersinde calisan container’in birbirlerine erisip erismedigini test edelim. Yapmamiz gereken sey once iki farkli node uzerinde calisan container’lari bulup (docker node lar uzerinde docker ps veya master uzerinde docker service ps <servis_adi> yaparak elde edebilirsiniz) ilgili nodelardan biri uzerinde docker exec komutu ile ping calistirmak (ornegin –> docker exec cd090647e076 ping 10.0.0.8) ve diger node uzerindende tcpdump ile 4789 numarali portu dinlemek.

root@swarmslave2:/home/noroot# tcpdump -i ens160 port 4789

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes

14:41:45.410924 IP 213.xxx.yyy.zzz.35364 > swarmslave2.4789: VXLAN, flags [I] (0x08), vni 4098

IP 10.0.0.6 > 10.0.0.8: ICMP echo request, id 2816, seq 14, length 64

14:41:45.411006 IP swarmslave2.55449 > 213.xxx.yyy.zzz.4789: VXLAN, flags [I] (0x08), vni 4098

IP 10.0.0.8 > 10.0.0.6: ICMP echo reply, id 2816, seq 14, length 64

14:41:46.411014 IP 213.xxx.yyy.zzz.35364 > swarmslave2.4789: VXLAN, flags [I] (0x08), vni 4098

Dilerseniz bu tcpdump komutuna ek olarak udp parametresi ekleyebilir , ciktiyida bir dosyaya yazdirabilirsiniz.

Guzel , demekki erisim farkli docker node’lar uzerinde mevcut. Bu simdilik multi-host networking icin yeterli.

Gelelim docker_gwbridge’e :

Hatirlarsaniz OverlayNetwork22’i internal , OverlayNetwork11 ise internal parametresi kullanmadan yaratmistik. Farkini simdi gorecegiz.

Elimde iki adet docker container var farkli servislere atanmis

root@swarmmaster:/home/noroot# docker ps

CONTAINER ID        IMAGE                                                                             COMMAND             CREATED             STATUS              PORTS               NAMES

77b4c2f91714        busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f   “sleep 3600”        27 minutes ago      Up 27 minutes                           Service11.2.q60s34e1sp1iequr3yrgf3ixa

e7c79bcf142f        busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f   “sleep 3600”        31 minutes ago      Up 31 minutes                           Service22.2.259pus89nfgp502q0s3vd9w7p

ilk container uzerindeki interface ve ip adresi configrasyonuna baktigimizda , iki adet ethernet ve iki farkli ip mevcut. Eth0 ve Eth1 , Eth0 bizim yarattigimiz overlay networkten bir ip almis , Eth1 de 172.18.0.0/16 dan ip blogundan ip amis. 172.17.0.0/16 biliyordukda , 172.18.0.0/16 nereden cikti ?

root@swarmmaster:/home/noroot# docker exec 77b4c2f91714 ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:09

inet addr:10.0.0.9  Bcast:0.0.0.0  Mask:255.255.255.0

inet6 addr: fe80::42:aff:fe00:9/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

RX packets:15 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1206 (1.1 KiB)  TX bytes:648 (648.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:03

inet addr:172.18.0.3  Bcast:0.0.0.0  Mask:255.255.0.0

inet6 addr: fe80::42:acff:fe12:3/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:8 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:648 (648.0 B)  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:1

RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Diger container’a bakalim , sadece eth0 mevcut.

root@swarmmaster:/home/noroot# docker exec e7c79bcf142f ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:07

inet addr:10.0.0.7  Bcast:0.0.0.0  Mask:255.255.255.0

inet6 addr: fe80::42:aff:fe00:7/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1

RX packets:15 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1206 (1.1 KiB)  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:1

RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Her iki container’inda routing tablolarina bakalim , internal olan network e atanmis makine sadece ve sadece 10.0.0.0 network’u ile konusabilirken ve hicbir internet’e cikabilme yolu yokken diger container default gw’i docker_gwbridge’i gosteriyor boylece internete cikiyor, iste size docker0 bridge’inden sonra docker swarm networking ile beraber gelen docker servisler altinda calisan container’larin internete erismesini saglayan yeni bridge’in oykusu.

root@swarmslave1:/home/noroot# docker exec f28603457670 route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0

root@swarmslave1:/home/noroot# docker exec a7ead6b343ae route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth1

10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0

172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth1

Routing Table

Chain POSTROUTING (policy ACCEPT 82915 packets, 5001K bytes)

pkts bytes target     prot opt in     out     source               destination

  0     0 MASQUERADE  all  —  *      docker_gwbridge  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL

0     0 MASQUERADE  all  —  *      !docker_gwbridge  172.18.0.0/16        0.0.0.0/0

0     0 MASQUERADE  all  —  *      !docker0  172.17.0.0/16        0.0.0.0/0

Gordugunuz gibi docker_bridge networkunden gelen herkes disariya masquerade edilerek cikacak.

VM

 

Advertisements

Posted on 17/03/2017, in Networking 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: