Docker Swarm İle Container Cluster Yönetimi
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:
- 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.
- 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.
- 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.
- Nomad: Basit ve esnek bir dağıtık ortam yönetim sistemidir. Dinamik iş yükleri ve container'lar için tasarlandı.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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:
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 ileweb
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:
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:
--image
: Servisi güncellemek için kullanılacak olan yeni görüntüyü belirler.--args
: Servisi çalışması için gereken argümanları belirler.--env-add
: Servis için yeni bir ortam değişkeni ekler.--env-rm
: Servis içindeki bir ortam değişkenini siler.--replicas
: Servisin çalışması için gereken örnek sayısını belirler.--limit-cpu
: Servis için kullanılabilir olan maksimum CPU miktarını belirler.--limit-memory
: Servis için kullanılabilir olan maksimum bellek miktarını belirler.--constraint-add
: Servis için bir kısıtlama ekler.--constraint-rm
: Servis içindeki bir kısıtlama siler.--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.--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.
Ayrıca sadece altyapınızı görselleştirmek için Docker Swarm Visualizer projesine de göz atabilirsiniz.
Docker serimizin sıradaki yazısı için aşağıdaki bağlantıyla devam edebilirsiniz.