Docker Swarm İle Container Cluster Yönetimi
13 min read

Docker Swarm İle Container Cluster Yönetimi

Docker Swarm, Docker'la birlikte gelen dağıtık ortam orkestrasyon aracıdır.
Docker Swarm İle Container Cluster Yönetimi
Photo by shawnanggg / Unsplash

Docker Swarm, Docker'ın dağıtık ortamlar için oluşturduğu bir ortam yönetim (orkestrasyon) aracıdır. Docker Swarm, birden fazla Docker host'unu ve container'larını tek bir dağıtık ortam olarak yapılandırarak, dağıtık uygulamaların kolay yönetimini, yük dengelemeyi, güncelleme ve yapılandırmayı sağlar. Docker Swarm sayesinde, birden fazla Docker host'u ve üzerinde bulunan container'ları tek bir ortamda yönetebilirsiniz. Swarm, ayrıca uygulamaların esnek ve güvenli bir şekilde çalışmasını sağlar ve dağıtık ortamlarda hata toleransı sağlar.

Docker Swarm, ayrıca container'ların dağıtılmasını da sağlar. Örneğin, web container'ının birden fazla replicasını oluşturabilir ve bu replicas'ları farklı host'lara dağıtabilirsiniz. Bu sayede, web container'ının dağıtılmış bir şekilde çalıştırılmasını sağlayabilirsiniz. Bu özelliği kullanarak, container'ların yük dağılımını optimize edebilir ve uygulamanızın performansını artırabilirsiniz.

1. Docker Swarm Kurulumu

Docker Swarm bir moddur ve Docker'a entegre edilmiştir. Docker  Swarm kullanabilmek için herhangi bir ekstra kurulum yapmanıza gerek yoktur.

2. Docker Swarm Alternatifleri Nelerdir?

Docker  Swarm, kurulumu ve yönetimi oldukça basit, production ortamında rahatlıkla kullanabileceğiniz bir orkestrasyon aracıdır. Fakat alternatiflerini bilmeniz, swarm'ı incelemeniz için de önemlidir.

Docker Swarm alternatifleri şunlardır:

  1. Kubernetes: En popüler dağıtık ortam yönetim sistemidir. Geniş bir açık kaynak topluluğu tarafından desteklenir ve büyük ölçekli uygulamalar için ideal bir seçimdir.
  2. Openshift: Red Hat tarafından geliştirilen bir açık kaynak platformu çalışma ortamıdır ve dağıtık ortamlarda uygulama yönetimi ve dağıtımını amaçlar.
  3. Apache Mesos: Dağıtık kaynak yönetimi ve ortak bir çalışma alanı sunan bir platformdur. Aynı anda birçok farklı uygulamanın çalışmasına izin verir.
  4. Nomad: Basit ve esnek bir dağıtık ortam yönetim sistemidir. Dinamik iş yükleri ve container'lar için tasarlandı.
  5. Rancher: Docker ve Kubernetes ortamlarını destekleyen bir dağıtık ortam yönetim sistemidir. Açık kaynak ve ölçeklenebilir olması sebebiyle popülerdir.
  6. DC/OS: Ölçeklenebilir ve dağıtık uygulamaları destekleyen bir platformdur. Apache Mesos tabanlıdır ve birçok farklı ortamda çalışabilir.

Bu sadece birkaç örnektir ve size en uygun olanı seçmek, ihtiyaçlarınıza, büyüklüğüne ve önceliklerinize bağlıdır.

3. Docker Swarm Bileşenleri

Docker Swarm, birçok Docker node'unun bir arada çalışmasını sağlayan bir dağıtık ortam yapısıdır. Bu yapının ana bileşenleri şunlardır:

  1. Manager Nodes: Docker Swarm'da, Manager node, Swarm cluster'ının yapılandırmasını ve durumunu yöneten ve kararları alan yönetici node'lardır. Manager node'lar, Swarm cluster'ındaki servislerin dağıtımını, kapasitesini ve durumunu izler ve gerektiğinde bu servisleri günceller, yeniden dağıtır ve gerektiğinde node ekleme veya çıkarma işlemlerini yapar. Manager node'lar, Swarm cluster'ının sağlıklı ve çalışan hale gelmesi için önemlidir ve yedekli Manager node'ları bulunabilir. Swarm cluster'ındaki Manager node'lar, leader manager node ve follower manager node'lar olarak iki türde bulunabilir.
  2. Leader Manager: Docker Swarm'da, leader manager, Swarm cluster'ını yöneten ve kararları alan node'udur. Swarm cluster'ındaki diğer manager node'ların görevi, leader node'a istek ve verileri toplamak ve uygulamaktır. Leader node, Swarm cluster'ındaki servislerin durumunu ve yapılandırmasını yönetir ve gerektiğinde bu servisleri günceller veya yeniden dağıtır. Ayrıca, Swarm cluster'ındaki node'ların durumunu ve kapasitesini izler ve gerektiğinde node ekleme veya çıkarma işlemlerini yapar. Leader manager node, Swarm cluster'ının sağlıklı ve çalışan hale gelmesi için önemlidir ve yedekli leader node'ları bulunabilir.
  3. Follower Manager: Follower manager node, leader manager node'un yapılandırmasını ve kararlarını uygulayan ve yedek olarak görev yapan bir node'dur. Swarm cluster'ındaki leader node arızalandığında, en yakın follower manager node otomatik olarak leader manager node olarak atanır. Follower manager node'lar, Swarm cluster'ındaki servis durumunu ve yapılandırmasını izler ve leader manager node tarafından verilen komutları uygular. Follower manager node'lar, Swarm cluster'ının güvenliğini ve hızını artırmak için önemlidir. Follower manager node'ların sayısı, Swarm cluster'ın güvenliği ve performansı için artırılabilir.
  4. Worker Nodes: Worker node, Swarm cluster'ındaki servisleri çalıştıran ve verileri işleyen node'lardır. Worker node'lar, Swarm cluster'daki Manager node'lar tarafından dağıtılan ve yapılandırılan servisleri çalıştırır ve bu servislerin verilerini işler. Worker node'lar, Swarm cluster'ındaki Manager node'lar tarafından verilen komutları uygular ve Swarm cluster'ındaki diğer node'larla etkileşim kurar. Ayrıca servis yükünün büyük bir kısmını taşır ve Swarm cluster'ının performansını arttırırlar. Worker node'lar, Swarm cluster'ının güvenliğini ve hızını artırmak için önemlidir ve istenirse çok sayıda Worker node eklenerek Swarm cluster'ının performansı arttırılabilir.
  5. Task: Swarm'ın yapması gereken bir görevdir. Her servis en az bir task içerir ve Manager node'lar tarafından Worker node'lara dağıtılır.
  6. Services: Docker Swarm'ın barındırdığı ve yönettiği uygulamalardır. Servisler, belirli bir görev seti ve yapılandırma gerekliliklerini tanımlar.
  7. Load Balancing: Swarm, yük dengeleme fonksiyonları ile servislerin isteklerini dağıtmak için tasarlanmıştır. Bu, uygulamaların kesintisiz ve adil bir şekilde çalışmasını sağlar.

Bu bileşenler bir arada çalışarak, Docker Swarm'ı güvenli, esnek ve genişletilebilir bir dağıtık ortam olarak tanımlar. Diğer tüm bileşenleri aşağıdaki görselden daha detaylı görebilirsiniz.

4. Neden Docker Swarm Kullanmalıyız?

Docker Swarm kullanmak için birkaç neden vardır:

  1. Dağıtık ortamlar: Docker Swarm, birden fazla node'u tek bir dağıtık ortam olarak yapılandırarak, dağıtık uygulamaların kolay yönetimini sağlar.
  2. Yük dengeleme: Swarm, yük dengeleme fonksiyonları ile servislerin isteklerini adil bir şekilde dağıtır ve uygulamaların düzgün çalışmasını sağlar.
  3. Güncelleme ve Yapılandırma: Swarm, manager node'lar tarafından servislerin güncellenmesi ve yapılandırmasının otomatik olarak yapılmasını sağlar.
  4. Esneklik: Swarm, farklı node'lar üzerinde farklı uygulamaların aynı anda çalışmasını ve dinamik iş yükleri için esneklik sunmasını sağlar.

Eğer Docker Swarm kullanmazsanız, dağıtık uygulamaları yönetmek için manual olarak yapılandırma ve yük dengeleme işlemleri gerekir. Ayrıca, güncelleme ve bakım işlemleri de manuel olarak yapılması gerekir. Bu tür işlemler zaman alıcı ve hata riski taşır, bu nedenle Docker Swarm kullanmak, dağıtık ortamları daha kolay, esnek ve güvenli hale getirir.

Örneğin, 4 farklı node ve her node'da 10 container'dan oluşan bir web servisiniz olsun. Eğer swarm kullanmazsanız, her güncellemede her birini manual olarak güncellemeniz (eski sürüm container'ı durdurup yenisini başlatmak) ve her container'ın sağlık durumunu düzenli olarak kontrol etmeniz gerekir. Bu işleri ise  bir orkestrasyon aracı olmadan yapmak işkence gibidir.

5. Docker Swarm Nasıl Aktif Edilir?

Docker Swarm hazır kurulu gelen bir  moddur ve ekstra  kurulum yapmaya gerek yoktur. Tek yapmanız gereken swarm modunu aktif etmek ve cluster'a node'ları eklemektir.

Aşağıdaki adımları izleyerek ilk Docker Swarm cluster'ınızı oluşturabilirsiniz.

Docker Swarm'ı modunu aktif  edin. Docker Swarm modu aktif etmek için aşağıdaki komutu çalıştırabilirsiniz:

docker swarm init

Bu komut, Docker Swarm'ı kuracak ve Swarm leader manager olarak komutu çalıştırdığınız host'u seçecektir.

Eğer host cihazda birden fazla NIC varsa, swarm ile kullanacağınız NIC'in ip adresini özellikle belirtmelisiniz.

docker swarm init --advertise-addr <IP_ADDRESS>

Aksi halde şu hatayı alırsınız:

🛑
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (IP_ADDRESS on eth0 and IP_ADDRESS on eth1) - specify one with --advertise-addr

Bu komut ile, <IP_ADDRESS> parametresi ile belirtilen IP adresi leader swarm manager olarak seçilecektir.

6. Docker Swarm Cluster'a Manager ve Worker Node Nasıl Eklenir ve Çıkarılır?

Swarm cluster'a manager ve worker ekleyebilmek için ilk olarak gerekli tokenları öğrenmeliyiz.

Manager eklemede kullanılacak token kodunu öğrenmek için:

docker swarm join-token manager

Worker eklemede kullanılacak token kodunu öğrenmek için:

docker swarm join-token worker

Örnek çıktı şu şekilde olacaktır:

docker swarm join --token SWMTKN-1-4h84xgaxwyaz0dr1xmd7szg97van2e14oru1ps1iczhdj9ypmk-eo2rbhpeinwwjyprx6talxge1 192.168.0.8:2377

Üstteki çalıştırdığınız komutun çıktısını direkt ilgili node'da çalıştırabilirsiniz. Yukarıdaki komutun örnek çıktısı şu formatta olmalıdır:

docker swarm join --token <TOKEN> <IP_ADDRESS>:<PORT>

Bu komut ile, <TOKEN> parametresi ile belirtilen token ile kayıt olunacak ve <IP_ADDRESS>:<PORT> parametresi ile belirtilen Swarm manager'a bağlanılacaktır. Bu sayede, managervbeya worker node Swarm cluster'ına eklenecektir.

Bir node'u swarm cluster'dan çıkarmak için  ilgili hostta şu komutu çalıştırabilirsiniz:

docker swarm leave

7. Docker Swarm Cluster Node İşlemleri

Docker cluster'ınız üzerinde yer alan tüm node'ları ve durumlarını görme için ls komutunu çalıştırabilirsiniz.

docker node ls

Örnek çıktı şu şekilde olacaktır:

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
bkpuss0e0tfgjkhatcwyhjww8     manager1   Ready     Active         Leader           20.10.17
cdkb0fqz7wsx1td4ewrdl3bsc *   manager2   Ready     Active         Reachable        20.10.17
we56sq7lp5qt87xz2spx6c0fg     manager3   Ready     Active         Reachable        20.10.17
17kuxe1kuh9t7352wqw64vuqt     worker1    Ready     Active                          20.10.17
z5c9sbqmnpafsvs24zr7yhxdc     worker2    Ready     Active                          20.10.17

* ile işaretlenen node leader manager'dır.

Bir  worker node'u manager node yapmak için promote komutunu kullanabilirsiniz.

docker node promote [NODE_ID]

Bir  manager node'u worker node yapmak için demote komutunu kullanabilirsiniz.

docker node demote [NODE_ID]

Bir node'u cluster'dan kaldırmak için  rm komutunu kullanabilirsiniz.

docker node rm [NODE_ID]

Bir node'un detaylarını görmek için  inspect komutunu kullanabilirsiniz.

docker node inspect [NODE_ID]

Bir node'un üzerinde çalışan servisleri ve durumlarını görmek için  ps komutunu kullanabilirsiniz.

docker node ps [NODE_ID]

8. Docker Swarm Cluster Service İşlemleri

Docker Swarm Cluster Service, Docker Swarm cluster'ında çalıştırılan ve yapılandırılan bir uygulama veya servislerin bir grup olarak adlandırılan bir yapısıdır.

Swarm Service'ler, uygulama veya servislerin Swarm cluster'ındaki node'lar arasında dağıtılmasını, yapılandırılmasını ve yönetilmesini kolaylaştırır.

Swarm cluster'da yeni bir servis oluşturmak için create, aşağıdaki komutu çalıştırabilirsiniz:

docker service create --name <SERVICE_NAME> <IMAGE>

Bu komut ile, <SERVICE_NAME> parametresi ile belirtilen isim ile bir servis oluşturulacak ve <IMAGE> parametresi ile belirtilen Docker imajı kullanılarak servisin container içeriği belirlenecektir. Oluşturulan bu container, Swarm cluster'ına eklenecek ve Swarm manager tarafından yönetilecektir.

Örneğin nginx imajından bir web isimli servis oluşturmak için  aşağıdaki komutu çalıştırabilirsiniz:

docker service create --name web nginx

Üstelik container parametrelerini servis  oluştururken tüm container'lara uygulanması için bu aşamada ayarlayabiliriz.

docker service create --name web --publish 8080:80 nginx

Eğer load  balancer kullanarak performansı artırmak adına bu serviste birden fazla container çalıştırmak istiyorsanız --replicas parametresini kullanabilirsiniz.

docker service create --name web --replicas 3 nginx

Yukarıdaki komut ile web servisi altında 3 adet nginx container oluşturulacak ve cluster'daki node'lara dağıtılacaktır. Böylece swarm load balancer özelliği ile  gelen  trafiği bu üç node arasında paylaştıracaktır.

Docker üzerinde 2 tip servis modu vardır. Bunlar: global ve replicated modudur.

  • Global mod, cluster'da yer alan tüm node'lara, oluşturulan servisin birer container'ını koyar. Manager node'larda bu container'lara sahiptir.
  • Replicated mod, varsayılan servis modudur ve --replicas parametresi ile belirtildiği kadar container'ı node'lara paylaştırır. Eğer sayı belirtmezseniz varsayılan olarak 1 adet container oluşturulur.

Servis oluştururken --mode ile kullanacağınız modu belirtebilirsiniz.

docker service create --name web --mode global nginx

Eğer container'ların belirli bir node üzerinde  çalışmasını istersek şu şekilde kısıtlama ekleyebiliriz:

docker service create --name web --replicas 3 --constraint "node.hostname==node_name" nginx

Eğer container'ların belirli bir node üzerinde çalışmamasını istersek şu şekilde kısıtlama ekleyebiliriz:

docker service create --name web --replicas 3 --constraint "node.hostname!=node_name" nginx

Eğer container'ların manager node'lar üzerinde çalışmamasını istersek şu şekilde kısıtlama ekleyebiliriz:

docker service create --name web --replicas 3 --constraint "node.role!=manager" nginx

Şimdi service'ler  ile kullanacabileceğimiz komutları inceleyelim:

  • docker service ls: Bu komut ile Swarm cluster'ında bulunan tüm container'ları görebilirsiniz. Yukarıdaki örneğimizin çıktısı şu şekilde gözükecektir:
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
scvuh7ohf668   web       replicated   3/3        nginx:latest
  • docker service ps <SERVICE_NAME>: Bu komut ile <SERVICE_NAME> parametresi ile belirtilen container'ın bilgilerini görebilirsiniz. Bu bilgiler arasında container'ın çalıştığı host, replicas sayısı ve durumu gibi bilgiler bulunur. Yine  aynı şekilde yukarıdaki örneğin çıktısı şu şekilde olacaktır:
ID             NAME      IMAGE          NODE       DESIRED STATE   CURRENT STATE                ERROR     PORTS
jgbut76c945p   web.1     nginx:latest   manager2   Running         Running about a minute ago             
i7iav35c37a2   web.2     nginx:latest   manager1   Running         Running about a minute ago             
knxihcpylgl3   web.3     nginx:latest   worker1    Running         Running about a minute ago
  • docker service scale <SERVICE_NAME>=<REPLICAS>: Bu komut ile <SERVICE_NAME> parametresi ile belirtilen container'ın replicas sayısı <REPLICAS> parametresi ile belirtilen sayıya ayarlanır. Örneğin, docker service scale web=5 komutu ile web isimli container'ın replicas sayısı 5'e ayarlanır ve bu container 5 tane olarak çalıştırılır.

9. Docker Swarm Network Yapısı

Docker swarm, birden fazla host'u, yani node'u, aynı cluster içinde yönetebilmek için overlay network driver'ını kullanır.

Docker swarm, init komutunu kullandığınızda ingress  isimli bir overlay driver networku sizin için otomatik olarak oluşturur ve tüm servisleri bu network'e ekler.

Yeni bir swarm overlay network oluşturmak için aşağıdaki komutu kullanabilirsiniz:

docker network create --driver overlay network_name

Artık servislerinizi oluştururken --network parametresi ile  overlay network'ümüzü belirtebiliriz.

docker service create --network over_net --name web --publish 8080:80 nginx

Docker network tipleriyle ilgili şu yazımıza da göz atabilirsiniz:

Docker Network Driver Tipleri
Docker Network, containerlar arasında haberleşmeyi sağlamak için kullanılan önemli bir araçtır.

10. Docker Swarm Routing Mesh Nedir?

Docker Swarm Routing Mesh, Docker Swarm ortamında servisler arasında yönlendirme yapmak için kullanılan bir özelliktir. Routing Mesh, tüm node'lar üzerinden tüm servislere erişimi kolaylaştırarak, güvenli ve esnek bir yönlendirme yapmanıza olanak tanır.

Routing Mesh, Docker Swarm'daki tüm servislerin tüm node'lar üzerinden erişilebilir olmasını sağlar. Routing Mesh, servislere erişmek isteyen istemcilerin tüm düğümlere yönlendirilmesini sağlar ve servisin mevcut olduğu düğüme yönlendirir.

Örneğin, node1:8080 adresini ziyaret ettiğinizde load balancer eğer node1 uygun değilse size node2 üzerindeki aynı servisin container'ından hizmet verebilir.

Routing Mesh'i bileşeni node'lar üzerinde otomatik olarak aktif gelir. Fakat kullanabilmeniz için

  • Servisleri publish modunda tanımlamanız gerekir. Örneğin --publish 8080:80
  • Node'ların overlay network kullanması gerekir.

11. Docker Swarm Servislerin Güncellenmesi

Docker swarm cluster'ınızda yer alan servislerinizle ilgili bir güncelleme yapacağınız zaman update komutunu kullanabilirsiniz. Böylece manual olarak ve service ve container kaldırıp tekrar kurmadan swarm'ın otomatik olarak güncelleme işlerini yapmasını sağlayabilirsiniz.

1. Service güncellemesi: Docker Swarm'da bir servisi güncellemek için aşağıdaki komut kullanılır. Örnek olarak, "web" isimli hizmeti güncellemek isteyelim.

docker service update --image <new_image> web

Örnek olarak kullandığınız image'in yeni versiyonunu update komutunu kullanarak servisinizi upgrade etmiş olursunuz. Diğer türlü servisi kaldırıp baştan kurmanız gerekecekti.

Docker Swarm update komutu ile bir servisi güncellerken kullanabileceğiniz bazı parametreler ve açıklamaları şunlardır:

  1. --image: Servisi güncellemek için kullanılacak olan yeni görüntüyü belirler.
  2. --args: Servisi çalışması için gereken argümanları belirler.
  3. --env-add: Servis için yeni bir ortam değişkeni ekler.
  4. --env-rm: Servis içindeki bir ortam değişkenini siler.
  5. --replicas: Servisin çalışması için gereken örnek sayısını belirler.
  6. --limit-cpu: Servis için kullanılabilir olan maksimum CPU miktarını belirler.
  7. --limit-memory: Servis için kullanılabilir olan maksimum bellek miktarını belirler.
  8. --constraint-add: Servis için bir kısıtlama ekler.
  9. --constraint-rm: Servis içindeki bir kısıtlama siler.
  10. --update-parallelism: Servis güncellemesi sırasında aynı anda güncellenebilecek örnek sayısını belirler. Örneğin --update-parallelism 2 komutu ile güncelleme işlemi aynı anda 2 container üzerinde  gerçekleşir. Varsayılan değeri 1'dir.
  11. --update-delay: Servis güncellemesi sırasında güncelleme taskları arasındaki ne kadar bekleneceğini belirtir. S saniye, m dakika, h saat olarak tipini belirtebiliriz. Örneğin --update-delay 10s

Eğer güncellemeyi geri almak isterseniz rollback komutunu kullanabilirsiniz. Bu komut son çalıştırılan update komutunu geri alır.

docker service rollback

12. Docker Swarm Yönetim Arayüzü

Docker swarm yönetimini CLI üzerinden yapabileceğiniz gibi bir arayüz üzerinden de yapabilirsiniz. Swarmpit isimli proje ile swarm yönetimini arayüz aracılığıyla yapmak için aşağıdaki bağlantıyı ziyaret edebilirsiniz.

Swarmpit
Lightweight Docker Swarm Management UI

Ayrıca sadece altyapınızı görselleştirmek için Docker Swarm Visualizer projesine de göz atabilirsiniz.

GitHub - dockersamples/docker-swarm-visualizer: A visualizer for Docker Swarm Mode using the Docker Remote API, Node.JS, and D3
A visualizer for Docker Swarm Mode using the Docker Remote API, Node.JS, and D3 - GitHub - dockersamples/docker-swarm-visualizer: A visualizer for Docker Swarm Mode using the Docker Remote API, Nod...

Docker serimizin sıradaki yazısı için aşağıdaki bağlantıyla devam edebilirsiniz.

Docker Stack Nedir? Nasıl Kullanılır?
Docker Stack, Swarm altyapınızı compose aracılığıyla yönetmenizi sağlar.