Swarm, iş yükü dağıtmak ve uygun servislerin replikalarını oluşturmak için ölçeklemede kullanılabilecek basit ve güçlü bir mimaridir.

Swarm, Docker üzerinde çalışan konteynerlerin bir cluster içinde yönetilmesi amacıyla geliştirilmiştir. Bu yazıda, iki Worker ve iki Manager Node’dan oluşan bir Docker Swarm dağıtımının Pardus sunucu üzerine kurulması anlatılacaktır.

Yönergeler hazırlanırken, Docker tarafından resmi olarak yayınlanmış olan kurulum belgelerinden yararlanılmıştır. Tipik bir Swarm kurulumunda iki ana grupta birden fazla sunucu yer alır. En temel kurulumlar için bile geçerli olan bu durum aşağıdaki şekilde gösterilmiştir;

Docker Swarm genel yapı
Şekil 1: Docker Swarm Genel Yapı

Şekilden görüleceği üzere Swarm iki ana grupta çalışan sunuculardan oluşmaktadır. Bir grup yönetsel faaliyetleri üstlenmişken, diğer grup iş yüklerini çalıştırma işini üstlenmiştir. Bu belgenin bundan sonraki bölümlerinde, minimum bir kurulum için yeterli olan aşağıdaki bileşenlerin kurulumu anlatılacaktır.

Şekil 2: Bu Çalışmada Kurulacak Bileşenler

Docker ve Swarm kurulumuna hazırlık

Bu kurulumda bir DNS sunucusu kullanılmayacak, buna bağlı olarak da yerel hosts dosyasında makine adı / IP ilişkileri oluşturulacaktır. Kurulumda kullanılacak sunucuların (fiziksel ya da sanal olabilir, ya da başka IP adresleri kullanılabilir) aşağıdaki şekilde yapılandırılmış olduğu varsayılmaktadır;

IP Adresi Makine İsmi

192.168.100.10 manager01
192.168.100.11 manager02
192.168.100.12 worker01
192.168.100.13 worker02

Eğer makine isimlerinin sonradan değiştirilmesi gerekli olacak olursa, aşağıdaki komutla isim değiştirilebilir:

user@machine:~$ sudo hostnamectl set-hostname <makine adi>

Bu aşamada /etc/hosts dosyası içinde de yeni verilen ismin makinenin IP adresi ile eşleştirilmesi önemlidir. Ardından makinenin üzerinde çalışan servislere bağlı olarak yeniden başlatılması gerekebilir. Bu aşamadan sonra swarm içinde kullanılacak makinelerin birbirlerini isimden çözebilecek şekilde yapılandırılmaları gereklidir. Bunun için her bir sunucuda ayrı ayrı /etc/hosts dosyalarını düzenlemek gerekmektedir. Bu amaçla;

user@machine:~$ sudo vi /etc/hosts

komutu kullanılarak açılan dosya aşağıdaki şekilde düzenlenmelidir.

127.0.0.1 localhost
192.168.100.10 manager01.swarm manager01
192.168.100.11 manager02.swarm manager02
192.168.100.12 worker01.swarm worker01
192.168.100.13 worker02.swarm worker02

Bu işlem için vi düzenleyicisi kullanılmıştır. İstendiği takdirde bir başka düzenleyici kullanılabilir. Linux’a yeni başlayanların genellikle nano düzenleyicisi kullandıkları gözlenmektedir. Bu aşamada tüm makineler birbirlerini isimleri ile bulabilir duruma getirilmiş durumdadır. Bu swarm node ları arasındaki haberleşme için gerekli bir durumdur.

Docker-CE kurulumu

Öncelikle üzerinde çalışılan makinenin güncel olmasından ve Docker tarafından kullanılan bazı kütüphanelerin kurulu olduğundan emin olunmalıdır. Docker kurulumunu daha geniş bir şekilde şurada anlatmış olsak da, tekrardan zarar gelmez. Kurulum için;

user@machine:~$ sudo apt update
user@machine:~$ sudo apt install ca-certificates curl gnupg lsb-release

komutları kullanılabilir. Bu işlemin ardından, mevcut sunucularda çalışan dağıtım tarafından sağlanan paketler yüklü ise bunların kaldırılması gerekmektedir. Bu işlem için;

user@machine:~$ sudo apt-get remove docker docker-engine docker.io containerd runc

komutunu kullanmak yeterli olacaktır. Ardından Docker tarafından sağlanan paket deposunun GPG anahtarlarını sunucuya tanıtmak gereklidir. Bu işlem; 

user@machine:~$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

komutları kullanılarak çok hızlı bir şekilde yapılabilir. Docker deposunun sisteme tanıtılması artık mümkün hale gelmiştir. Bunun için;  

user@machine:~$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

komutu kullanılabilir. Artık sunucu Docker kurulumuna hazır hale getirilmiştir. Bu aşamada yeniden repoları güncelleyerek paket bilgilerini tazelemek, Docker paketlerinin repodan geldiğinin kontrol edilmesi yararlı olacaktır. Bunun için;

user@machine:~$ sudo apt-get update
user@machine:~$ apt-cache policy docker-ce

komutları kullanılabilir. Docker repo adresi Docker sitesini gösteriyorsa yapılandırma doğru yapılmış demektir. Docker-CE kurulumuna devam etmek için;

user@machine:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io
user@machine:~$ sudo usermod -aG docker ${USER}

komutları kullanılabilir. Bu aşamada Docker kurulmuş ve geçerli kullanıcı docker grubuna eklenerek sistemde işlem yapabilir hale getirilmiştir. Buraya kadar anlatılan işlemler tüm makinelerde yapılmalıdır.

Swarm yapılandırması

İlk yapılandırılacak makine manager01 olacaktır. Swarm, ilk manager sunucusu ile kurulmaya başlanmaktadır. SSH ile bir bağlantı alınıp (doğrudan konsol da kullanılabilir) sırası ile aşağıdaki işlemler yapılmalıdır;

user@manager01:~$ sudo docker swarm init --advertise-addr 192.168.100.10
user@manager01:~$ 
user@manager01:~$ docker swarm join-token manager

Bu Swarm’a manager eklemek için aşağıdaki konutu uyguluyoruz:

docker swarm join --token SWMTKN-1-5ia7cvius1ms788g1rjn7nvlzjt8sllnbgm0rgo6mffkxjvyb0-d9n5m4meb6gfrs8ittxs2zsi6 192.168.100.10:2377
user@manager01:~$ docker swarm join-token worker

Şimdi worker ekliyoruz:

docker swarm join --token SWMTKN-1-5ia7cvius1ms788g1rjn7nvlzjt8sllnbgm0rgo6mffkxjvyb0-9ltqct33tewcw8hqsf68mtu71 192.168.100.10:2377

Görüleceği üzere ilk manager sunucusu Swarm’ı ilklendirmiş, ardından oluşan bu yeni yapıya diğer manager ve worker sunucuları eklemek için gerekli işlemler tamamlanmıştır. Bu aşamada manager02 sunucusuna bağlanıp;

user@manager02:~$ docker swarm join --token SWMTKN-1-5ia7cvius1ms788g1rjn7nvlzjt8sllnbgm0rgo6mffkxjvyb0-d9n5m4meb6gfrs8ittxs2zsi6 192.168.100.10:2377

komutuyla sistemdeki ikincil manager sunucu da dâhil edilmiştir. Worker sunucularında da sırasıyla aşağıdaki işlemler gerçekleştirilerek, iş yüklerinin çalıştırılacağı sistem bileşenleri de sisteme eklenmiş olacaktır;

user@worker01:~$ docker swarm join --token SWMTKN-1-5ia7cvius1ms788g1rjn7nvlzjt8sllnbgm0rgo6mffkxjvyb0-9ltqct33tewcw8hqsf68mtu71 192.168.100.10:2377
user@worker02:~$ docker swarm join --token SWMTKN-1-5ia7cvius1ms788g1rjn7nvlzjt8sllnbgm0rgo6mffkxjvyb0-9ltqct33tewcw8hqsf68mtu71 192.168.100.10:2377

Bu şekilde kurulum tamamlanmıştır. Bu aşamada loadbalancer, paylaşılmış disk alanı gibi detay yapılandırmalar da gerekli olacaktır ve fakat bunlar bu makalenin konusu olmadığı için bu belge kapsamına alınmamıştır. Sistemin düzgün şekilde yapılandırıldığını kontrol etmek için tekrar manager01 sunucusuna bağlanıp;

user@manager01:~$ docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
h00bd7pqahxoz2hu8zqzg73y3 *   manager01   Ready     Active         Leader           20.10.12
zckfz7r1ou7k8ao9vq3brdviy     manager02   Ready     Active         Reachable        20.10.12
p7ke2f97bhwmpgj098e1xaw5p     worker01    Ready     Active                          20.10.12
1gwvqwqqmqv4te4oy7cym5o3p     worker02    Ready     Active                          20.10.12

komutuyla da Swarm sunucularının aktif durumlarını görmek mümkündür.

Sonuç

Swarm, iş yükü dağıtmak ve uygun servislerin replikalarını oluşturmak için ölçekleme amacıyla kullanılabilecek basit ve bir o kadar da güçlü bir mimari olarak karşımıza çıkmaktadır. Kendi içinde kapalı çalışma ekipleri tarafından kullanılmak için güvenli ve esnek bir yapıdır.