Container Orkestrasyon için Docker Swarm

Yayınlanan: 2019-08-08

Docker Swarm ve bir kümedeki tüm kapsayıcıları nasıl yönettiği ve düzenlediği hakkında her şey.

Docker Swarm nedir?

Docker sürüsü, bir Docker Motorları kümesini işleme modudur, dolayısıyla Swarm adı. Docker ana bilgisayarları kümesi, yöneticiler ve işçilerden oluşan sürü modunda çalışır. Sürüye katılan liman işçisi motoru örneklerine düğüm denir.

Üretim düzeyinde bir sürü dağıtımı, birden çok sunucuya yayılmış liman işçisi düğümlerinden oluşur.

Neden kullanalım? – Konteyner Orkestrasyon

Bir üretim ortamında çalışırken, 100'lerce liman işçisi konteyneri, içinde birden çok uygulama çalıştırıyor olacaktır. Tüm bu kapsayıcıları yönetmek, tüm DevOps mühendisleri için büyük bir acı olabilir; Docker Swarm'ın size yardımcı olduğu yer burasıdır. Birden çok liman işçisi konteyneri çalıştıran kümeyi kolaylıkla yönetir ve düzenler.

Aşağıda bazı özellikleri verilmiştir:

  • Yüksek Kullanılabilirlik – hiçbir kesinti veya kesinti sunmamayı amaçlar.
  • Yük Dengeleme – herhangi bir düğüm başarısız olursa, kümedeki diğer düğümlere kaynakları ve istekleri otomatik olarak tahsis edin.
  • Merkezi olmayan – bir üretim ortamında çalışan birden çok yönetici düğümü; dolayısıyla küme hiçbir zaman tek bir yönetici düğümüne bağımlı değildir.
  • Ölçeklenebilirlik – tek bir liman işçisi sürü komutu kullanarak kümedeki kapsayıcıları kolayca büyütebilir veya küçültebilirsiniz.

Docker Konteynerlerini Düzenleyin

Artık Docker Swarm'ın temellerini bildiğinize göre, onun uygulanmasına ilişkin bir örneğe bakalım.

Bu örnekte, aşağıdaki ayrıntılara sahip bir kümede çalışan üç makinem var:

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

Docker'da swarm modunu başlatmak için yönetici düğümünde aşağıdaki komutu çalıştırın. --advertise-addr bayrağı, kümeye katılabilecek düğümlere kendisini tanıtmak için kullanılır.

 geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Yukarıdaki komut, bu kümeye katılmak için diğer düğümler tarafından kullanılacak bir belirteç üretecektir. Komutu oluşturulan belirteçle kopyalayın ve çalışan düğümlerde çalıştırın.

Belirteci işçi1 düğümünde çalıştırma.

 geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Belirteci işçi2 düğümünde çalıştırma.

 geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Artık yönetici düğümünde, kümede hangi düğümlerin çalıştığını kontrol edebilirsiniz.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Dockerfile Tutorial'da kullandığımız geekflare_mongodb docker imajını oluşturalım.

 docker build -t geekflare_mongodb .

Bir sürü hizmeti oluşturarak MongoDB liman işçisi görüntüsünün bir kapsayıcısını çalıştırın. 27017, MongoDB'nin maruz kaldığı bağlantı noktası numarasıdır.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged

Liman işçisi sürü hizmetinin başlatılıp başlatılmadığını kontrol edin. MODE çoğaltılmış , kapsayıcının kümedeki tüm düğümlerde çoğaltıldığı anlamına gelir ve REPLICAS 1/1, şu anda yalnızca bir sürü hizmetinin çalıştığı anlamına gelir.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp

Bu tek hizmetin kümedeki hangi düğümde çalıştığını kontrol edelim. manager1 düğümünde çalışıyor.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago

Bu sürü hizmetini çalıştıran kapsayıcı hakkında daha fazla ayrıntı almak için docker ps komutunu çalıştırın.

 geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

Sürü hizmetini varsayılan “replicated” modu yerine “global” modda da çalıştırabilirsiniz. Global mod, kümedeki tüm düğümlerde sürü hizmetinin bir görevini çalıştırır.

Hizmeti global modda çalıştırmadan önce, mevcut çalışan kapsayıcıyı kaldırmama izin verin.

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Sürü hizmetini, –mode bayrağını kullanarak global modda bir liman işçisi kapsayıcısının içinde başlatın.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged

Sürü hizmetinin global modda başlayıp başlamadığını kontrol edin. Kümede üç düğüm (1 yönetici, 2 işçi) çalıştığından, replika sayısı 3'tür.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp

3 hizmet şu anda 3 düğümde çalışıyor, aşağıdaki komutu çalıştırarak kontrol edin.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago

Şimdi, replika sayısını nasıl tanımlayabileceğinizi göstereyim. Ondan önce, çalışmakta olan mevcut kabı kaldıracağım.

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Komutta –replicas bayrağını kullanın ve sürü hizmetinin istediğiniz kopya sayısını belirtin. Örneğin, sürü hizmetinin iki kopyasına sahip olmak istiyorum:

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged

Şu anda çalışan sürü hizmetlerini kontrol edin. Bir çoğaltmanın manager1 düğümünde, diğerinin ise işçi1 düğümünde çalıştığını görebilirsiniz.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago

işçi1 düğümüne gidin ve liman işçisi konteynerinin sürü hizmetini çalıştırıp çalıştırmadığını kontrol edin.

 geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

Bu kapsayıcıyı durdurmak için aşağıdaki komutu çalıştırın.

 geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb

Şimdi manager1 düğümünden hangi tüm düğümlerin hizmeti çalıştırdığını kontrol ederseniz, yönetici1 düğümü ve işçi2 düğümünde çalıştığını göreceksiniz. işçi1 düğümünün CURRENT STATE'si Shutdown'dur (hizmeti çalıştıran konteyneri durdurduğumuz için). Ancak bu hizmetin iki kopyasının çalışması gerektiğinden, işçi 2'de başka bir hizmet başlatıldı.

Docker swarm kullanarak yüksek kullanılabilirliği bu şekilde elde edersiniz.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago

Liman işçisi konteynerlerini büyütmek veya küçültmek çok kolaydır. Aşağıdaki komut, mongo kapsayıcısını 5'e yükseltecektir.

 geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged

Şu anda kaç tane mongo konteyner kopyası çalıştığını kontrol edin, 5 olmalı.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp

Bu 5 çoğaltmanın kümede nerede çalıştığını kontrol edin. Yönetici1 düğümünde 1 çoğaltma ve her iki çalışan düğümde de 2 çoğaltma çalışıyor.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago

Kümenizde, hizmetlerinizin yönetici düğüm(ler)inde çalışmasını istemiyorsanız ve bunu yalnızca düğümleri yönetmek için tutmak istiyorsanız, yönetici düğümünü boşaltabilirsiniz.

 geekflare@manager1:~$ docker node update --availability drain manager1 manager1

Yönetici düğümünün kullanılabilirliğini kontrol edin.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Hizmetlerin artık yönetici düğümünde çalışmadığını göreceksiniz; kümedeki çalışan düğümlere yayılırlar.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago

Bu tamamen Docker Swarm ve konteynerlerin docker swarm modunda nasıl düzenleneceği ile ilgiliydi. Nasıl çalıştığı hakkında bir fikir edinmek için bunları üretim dışı ortamınızda deneyin.