CentOS Stream 8
Sponsored Link

Docker : Swarm クラスター2021/04/06

 
Docker Swarm を設定して、複数の Docker ホストでクラスター環境を構成します。
当例では以下の 3台の Docker ホストを使用して設定します。
Swarm クラスターではマネージャーノード [Manager nodes] とワーカーノード [Worker nodes] の 2つの役割がありますが、 いずれの役割も複数ノード設定可能ですが、当例では以下のように node01 をマネージャーノード、その他をワーカーノードとして設定します。
 -----------+---------------------------+--------------------------+------------
            |                           |                          |
        eth0|10.0.0.51              eth0|10.0.0.52             eth0|10.0.0.53
 +----------+-----------+   +-----------+----------+   +-----------+----------+
 | [ node01.srv.world ] |   | [ node02.srv.world ] |   | [ node03.srv.world ] |
 |       Manager        |   |        Worker        |   |        Worker        |
 +----------------------+   +----------------------+   +----------------------+

[1]
[2] 全ノードで Swarm モード用に設定変更しておきます。
root@node01:~#
vi /etc/docker/daemon.json
# 新規作成

# ライブリストア機能無効化 (Swarm モードではライブリストアは利用不可)

{
    "live-restore": false
}

[root@node01 ~]#
systemctl restart docker
# Firewalld 稼働中の場合はポート許可

[root@node01 ~]#
firewall-cmd --add-port={2377/tcp,7946/tcp,7946/udp,4789/udp} --permanent

success
[root@node01 ~]#
firewall-cmd --reload

success
[3] マネージャーノードで Swarm クラスターの設定をします。
root@node01:~#
docker swarm init

Swarm initialized: current node (bs01c7zj7r1bo8t7qx7nt4p34) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1crqgsg3qoy8ocft9mpav8lgo3zsjf1th2s3n7wb9t9yry6tif-9ks9ex89nxnl89bg7jrzcwi6j 10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[4] ワーカーノードから Swarm クラスターへの参加を実行します。
実行コマンドはマネージャーノードで [swarm init] した際に表示されたコマンドをそのまま実行するのみです。
root@node02:~#
docker swarm join \
--token SWMTKN-1-1crqgsg3qoy8ocft9mpav8lgo3zsjf1th2s3n7wb9t9yry6tif-9ks9ex89nxnl89bg7jrzcwi6j 10.0.0.51:2377

This node joined a swarm as a worker.
[5] ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで [node ls] するとクラスター参加ノードの一覧が表示されます。
root@node01:~#
docker node ls

ID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
bs01c7zj7r1bo8t7qx7nt4p34 *   node01.srv.world   Ready     Active         Leader           20.10.5
pu0szo4f3fr9nn5zn87n77cyp     node02.srv.world   Ready     Active                          20.10.5
x0q143322alhmukkj94b9we7b     node03.srv.world   Ready     Active                          20.10.5
[6] Swarm クラスターで提供するサービスを設定して、動作確認します。
例として、Nginx サービスを提供するコンテナーイメージを作成して設定します。
通常は、全ノードで同じ Regstry 上の同じイメージを使用しますが、当例では動作確認のため、コンテナーイメージは全ノードでそれぞれ作成して進めます。
root@node01:~#
vi Dockerfile
FROM centos
MAINTAINER ServerWorld <admin@srv.world>

RUN dnf -y install nginx
RUN echo "Nginx on node01" > /usr/share/nginx/html/index.html

EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

root@node01:~#
docker build -t nginx-server:latest .

[7] コンテナーイメージが準備できたら、マネージャーノードでサービスを定義します。
サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。
root@node01:~#
docker images

REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
nginx-server   latest    5185329f1a74   About a minute ago   289MB
centos         latest    300e315adb2f   3 months ago         209MB

# レプリカ数 2 でサービスを新規作成

root@node01:~#
docker service create --name swarm_cluster --replicas=2 -p 80:80 nginx-server:latest

64pa21potpdbq1hmxbzuu3tam
overall progress: 0 out of 2 tasks
1/2: preparing
2/2: preparing
.....
.....

# サービスの一覧を表示

root@node01:~#
docker service ls

ID             NAME            MODE         REPLICAS   IMAGE                 PORTS
64pa21potpdb   swarm_cluster   replicated   2/2        nginx-server:latest   *:80->80/tcp

# サービスの詳細

root@node01:~#
docker service inspect swarm_cluster --pretty


ID:             64pa21potpdbq1hmxbzuu3tam
Name:           swarm_cluster
Service Mode:   Replicated
 Replicas:      2
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         nginx-server:latest
 Init:          false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 80
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress

# サービスの稼働状況を表示

root@node01:~#
docker service ps swarm_cluster

ID             NAME              IMAGE                 NODE               DESIRED STATE   CURRENT STATE            ERROR     PORTS
pbjvpqru195w   swarm_cluster.1   nginx-server:latest   node02.srv.world   Running         Running 47 seconds ago
uwndpoduvpoy   swarm_cluster.2   nginx-server:latest   node01.srv.world   Running         Running 47 seconds ago

# マネージャーノードにアクセスして動作確認

# ラウンドロビン方式で各ノードへ振り分けられる

root@node01:~#
curl node01.srv.world

Nginx on node02
root@node01:~#
curl node01.srv.world

Nginx on node01
root@node01:~#
curl node01.srv.world

Nginx on node02
root@node01:~#
curl node01.srv.world

Nginx on node01
[8] 設定したサービスのレプリカ数を変更したい場合は以下のように設定します。
# レプリカ数を 3 に変更

root@node01:~#
docker service scale swarm_cluster=3

swarm_cluster scaled to 3
overall progress: 2 out of 3 tasks
1/3: running
2/3: running
3/3: preparing
.....
.....

root@node01:~#
docker service ps swarm_cluster

ID             NAME              IMAGE                 NODE               DESIRED STATE   CURRENT STATE                ERROR     PORTS
pbjvpqru195w   swarm_cluster.1   nginx-server:latest   node02.srv.world   Running         Running about a minute ago            
uwndpoduvpoy   swarm_cluster.2   nginx-server:latest   node01.srv.world   Running         Running about a minute ago            
r7lmkav7hxpt   swarm_cluster.3   nginx-server:latest   node03.srv.world   Running         Running 15 seconds ago                

# アクセスして動作確認

root@node01:~#
curl node01.srv.world

Nginx on node01
root@node01:~#
curl node01.srv.world

Nginx on node03
root@node01:~#
curl node01.srv.world

Nginx on node02
関連コンテンツ