Docker : Swarm クラスター2020/12/14 |
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 (5ppfq0d835mo90i08pafj0ea9) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-57l8znvne9idgyz1rqcxz7dzygkooczkj620w0nxucqfhsf2yg-ab02zzdriy79ikpyln54g2rai 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-57l8znvne9idgyz1rqcxz7dzygkooczkj620w0nxucqfhsf2yg-ab02zzdriy79ikpyln54g2rai 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 5ppfq0d835mo90i08pafj0ea9 * node01.srv.world Ready Active Leader 20.10.0 hwh271dh9yhxhmslmjcbdkmuz node02.srv.world Ready Active 20.10.0 tgoba7x0119q8ni86uiimyxs7 node03.srv.world Ready Active 20.10.0 |
[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;"] docker build -t nginx-server:latest . |
[7] | コンテナーイメージが準備できたら、マネージャーノードでサービスを定義します。 サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Dockerノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。 |
root@node01:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-server latest 577ff92c6d2f 2 minutes ago 285MB centos latest 300e315adb2f 6 days ago 209MB # レプリカ数 2 でサービスを新規作成 root@node01:~# docker service create --name swarm_cluster --replicas=2 -p 80:80 nginx-server:latest tueyg31ego32qw4d1k1j0lpq0 overall progress: 0 out of 2 tasks 1/2: ready 2/2: ready ..... ..... # サービスの一覧を表示 root@node01:~# docker service ls ID NAME MODE REPLICAS IMAGE PORTS tueyg31ego32 swarm_cluster replicated 2/2 nginx-server:latest *:80->80/tcp # サービスの詳細 root@node01:~# docker service inspect swarm_cluster --pretty ID: tueyg31ego32qw4d1k1j0lpq0 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 3hdstee9bvd8 swarm_cluster.1 nginx-server:latest node02.srv.world Running Running about a minute ago vrl83n20k8nn swarm_cluster.2 nginx-server:latest node01.srv.world Running Running about a minute 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: 3 out of 3 tasks 1/3: running 2/3: running 3/3: running verify: Service convergedroot@node01:~# docker service ps swarm_cluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 3hdstee9bvd8 swarm_cluster.1 nginx-server:latest node02.srv.world Running Running 2 minutes ago vrl83n20k8nn swarm_cluster.2 nginx-server:latest node01.srv.world Running Running 2 minutes ago wwzik292zeh9 swarm_cluster.3 nginx-server:latest node03.srv.world Running Running 30 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 |
Sponsored Link |