Docker Swarm Orchestration
Swarm & Node & Service & Visualizer
Merhabalar,
Bu yazımda Docker Swarm Yönetim komutlarını inceliycez. Basit olarak 1 manager 2 worker cluster kurulumu yapıp swarm komutları uyguluycaz.
İlk olarak docker swarm komutları neler buna bakalım. Bunun için terminal ekranından;
docker swarm
komutunu çalıştıralım.
Not: Production ortamında 1 master 1 worker node çalıştırılması doğru değildir. Çünkü leader master çöktüğünde diğer master sunucudan birinin leader olması gerekir.Bu durumda değişik algoritma tipleri ile consensum’a karar verebilir. Bu da RAFT consensus’dur.
Note: Ufak bir araştırma yaparak RAFT ne olduğunu okuyabilirsiniz.
Swarm active olup olmadığını kontrol etmek için
docker info
komutunu kullanalım.
görüldüğü gibi swarm aktif değil. Aktifleştirmek için
docker swarm init
komutu kullanırız. Daha öncesinde
docker network ls
komutu ile networkleri listeleyelim.
görüldüğü gibi default networklerimiz docker kurulumdan sonra gelmiştir. Şimdi de docker swarm init komutundan sonra bizim için swarm overlay adında bir network oluşturacaktır. İlk önce
docker swarm init --advertise-addr IP adresi
komutunu çalıştırıyorum.
Daha sonrada
docker network ls
görüldüğü gibi swarm yapımızı aktifleştirdikten sonra birden fazla hostun kendi arasında haberleşmesi için overlay network swarm bizim için oluşturdu. Gerekirse overlay türünde kendi networkümüzde kurabiliriz. Bunun docker network başlıklı yazımı okuyabilirsiniz. Şimdi de giriş bilgileriniz öğrendiğimize göre swarm konumuza geri dönelim. Terminal ekranında
docker swarm
yazdığımızda bizim swarm ile yapabileceğimiz komutları yukarı da listelemiştik.
- docker swarm ca → Komutu ile certificate tanımlaması yapabiliriz. Geçerli swarm root ca döndürmek için - -rotate parametresi kullanılır. Kısaca bir veya daha fazla swarm root güvenliği ihlal edilmişse root ca döndürülmesi önerilir.
Not : docker swarm ca - -help komutu ile diğer parametrelere bakabilirsiniz.
- docker swarm init → ile nodemuzu swarm yapısını aktifleştiririz ve ilk çalıştırdığımız node leader node olarak atanır.
docker swarm init --advertise-addr IP_adresi
Görüldüğü gibi swarm yapımız aktifleşmiş ve diğer nodeların bu nodemuza join olabilmesi gereken token vermiştir.
Not : Swarm yayın portu 2377 dir.
docker swarm init --help
— addvertise-addr → ile yayın yapacak hostname belirtiriz.
— autolock → ile key ataması yapılır. Manager olarak kilitlenmeyi etkinleştirir.
Note: Durmuş bir manager’ı tekrar çalıştırmak için key gerekir.
— listen-addr → ile dinlecek host yada IP adresi belirtilir. Zorunlu değildir.
— avability → ile nodenun durumunu değiştirebiliriz.
- docker swarm join-token → ile manager ve worker node cluster dahil etmek için gereken token’u elde ederiz.
Bu arada,
docker swarm join-token manager -> MANAGER NODEyada docker swarm join-token worker -> WORKER NODE
komutu tek tek bakalım.
Yukarıda görüldüğü gibi Swarm Id leri aynı ama worker mu manager mı role olarak atayacağımız token bilgileri değişmektedir. En sondaki kısımda leader manager IP adresini göstermektedir.
Şimdide worker olarak tokenımızı “node2” clusterımız da çalıştırıp worker olarak dahil edelim. Bunun için
Görüldüğü gibi node2 nodemuz swarm clusterımızı eklendi. Cluster’ımızda var olan nodelar listelemek için;
docker node ls
Not: Worker cluster yönetim komutlarını çalıştırmayız. Sadece Manager cluster olan nodelar da yönetim komutlarını kullanabiliriz. Dolayısı ile worker nodemuz olan node2' de docker node ls yazdığımızda hata alırız. bunun için node1 nodemuzu yani manager node’umuzda gidip docker node ls yazdığımızda
Görüldüğü gibi worker olarak clusterımız dahil edilmiştir. Birinci satırdaki “*” işareti bizim manager nodemuz da komutu çalıştırdığımızı göstermektedir.
- docker swarm join → komutu ile nodelarımızı manager ya da worker olarak clusterımıza dahil edebiliriz. Bunun için
docker swarm join --help
Komutu ile diğer kullanabilceğimiz opsiyonlara bakalım.
--token opsiyonu kullanarak “node3” nodemuzu worker olarak clusterımıza dahil edelim.
Görüldüğü gibi node3 worker olarak cluster’ımıza dahil edildi.
docker node ls
Manager nodemuz olan “node1” komutu çalıştırdığımızda
Cluster’ımıza docker swarm join komutu ile de node eklemesi yapabiliriz.
- docker swarm leave → komutu ile nodemuzu cluster’ımızdan çıkartabiliriz. Bunun hangi node clusterdan çıkartmak istiyorsak o nodenun terminalinden
docker swarm leave --force
komutu kullanabiliriz. Bunun “node3” nodemuzu clusterımız dan çıkartalım.
Manager nodemuz olan node1 de docker node ls komutunu çalıştıralım.
Görüldüğü gibi status “down” durumunda yani clusterımızdan çıkartılmış durumda eğer bu node silmek istersek
docker node rm "id" yada docker node rm hostname_ismi
komutu kullanırız.
Swarm komutlarımızın sonuna geldik. Şimdide biraz bahsettik ama docker node komutlarını inceleyelim.
Terminal ekranından docker node komutunu çalıştırdığımızda komut listesi;
docker node
- demote → komutu ile manager olan node u worker node yapmamızı sağlar. Komut kullanımı
docker node demote hostname
- docker node inspect → Komutu ile nodemuzun detaylarını bakarız. Komut kullanımı,
docker node inspect hostname
yada - - pretty parametresini ekleyerek daha düzgün bir çıktı elde edebiliriz.
- docker node ls → ile clusterımızdaki nodeları listeleriz.
docker node ls
- docker node promote → ile worker olan bir node’u manager node yapmamızı sağlar.
docker node promote hostname_ismi
Not : Worker olan bir node update komutu ile role değişikliği yapabiliriz. Bunun için ilk önce docker node demote node3 diyerek manager olan node’u worker node olarak değiştirebiliriz.
docker node update --role=manager hostname
Yukarıdaki şekilde görüldüğü gibi node3 manager node olarak cluster’ımızda rolünü değiştirdik.
- docker node ps → ile çalışan nodelarımız listeleriz.
docker node ps
docker node ps -q ile sadece id’lerini listeleyebiliriz.
docker node komutlarını kullanımı bitirdik.
Terminalden docker service komutu çalıştırdığımız da service komutu ile yapabileceklerimiz aşağıdaki şekilde gösterilmiştir.
docker service
- docker service create → ile yeni bir servis oluşturabiliriz.
- docker service inspect → ile oluşturduğumuz servisin detayına bakabiliriz.
- docker service logs → ile servisin loglarını bakabiliriz.
- docker service ls → ile servislerimiz listeleriz.
- docker service rm → ile oluştruduğumuz bir servisi silebiliriz.
- docker service roolback →ile servisin ayarlarını değişiklik yapmamızı sağlar.
- docker service scale → ile oluşturduğumuz servisin sayısını ve başka nodelarda çalışmasını sağlarız.
- docker service update → ile service ile ilgili değişikleri yapmamızı sağlar.
Şimdi de basit bir örnek yapalım. Örneğimiz bir tane nginx service oluşturalım ve bu servis üzerinde docker service komutlarını uygulayalım. İlk olarak adı web-nginx olan bir service oluşturalım. Bunun için kullanacağımız komut;
docker service create --name web-nginx --publish 8080:80 nginx
Tarayıcımızdan localhost:8080 portuna gittiğimizde bizi nginx karşılama sayfası karşılayacaktır bu da demek oluyor ki servisimiz oluştu ve çalışıyor demektir. Buradaki replicas alanındaki 1/1 ile ilk ki toplam çalışan task sayısını ikinci ise toplam oluşturalacak task sayısını göstermektedir.
Şuan ki sistemiz;
- node1 → Manager Node
- node2 → Worker Node
- node3 → Worker Node
Yukarıdaki şekilde gözüktüğü gibi service node3'te tek bir replica olarak çalışmaktadır. Şimdide replica sayısını 6'ya çıkartalım. Bunun için
docker service scale servis_ismi=6
Yukarıdaki şekilde görüldüğü gibi servisimiz 6 kopyası oluştu ve cluster’ımız içinde çalışan node’lara eşit olarak dağıtıldı.
docker service inspect node1 --pretty
komutu ile node1 detaylarına bakalım.
Son olarak çalışan node3 down edelim ve kopya sayısı toplamda 6 olan servisimiz nasıl diğer nodelara dağıtılıyor buna bakalım. Bunun için ilk önce node3 bağlanıp
docker swarm leave --force
komutunu kullanıyorum.
ve node1 node’ umdan
docker node ls
komutunu çalıştırıyorum.
Yukarıdaki şekilde görüldüğü gibi node3 down oldu ve çalışan service diğer cluster arasında “node1” ve “node2” çalıştı. Cluster içerisindeki herhangi bir node’muz down olsa bile sistemin çalışmasına engel değildir. Ama RAFT consensus göre cluster ağı oluşturulursa.
docker info
komutu ile cluster yapımız hakkında bilgilere ulaşabiliriz.
Son olarak visualizer sistemize kurarak tarayıcı üzerinden cluster yapımızı monitör edelim. Bunun için çalıştıracağımız komut
docker service create \
--name=visualizer \
--publish=8080:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \dockersamples/visualizer
ve tarayıcımızdan IP_adresi:8080 portuna gittiğimizde
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.