クラスターの構築
環境の準備
- Dockerがインストールされた5台のCentOSマシン。バージョンは次のとおりです。
CentOS 7.8.2003
- Docker Engine 1.12+(最小要件1.12、この記事では19.03.12を使用)
- ファイアウォールは次のポートを開くか、ファイアウォールを閉じます。
- クラスタ管理通信に使用されるTCPポート2377。
- ノード間の通信に使用されるTCPおよびUDPポート7946。
- UDPポート4789、オーバーレイネットワークに使用。
機械の分配
キャラクター | IP | ホスト名 | Dockerバージョン |
---|---|---|---|
マネージャー | 192.168.10.101 | manager1 | 19.03.12 |
マネージャー | 192.168.10.102 | manager2 | 19.03.12 |
マネージャー | 192.168.10.103 | manager3 | 19.03.12 |
ワーカー | 192.168.10.10 | 労働者1 | 19.03.12 |
ワーカー | 192.168.10.11 | worker2 | 19.03.12 |
hostname 主机名
マシンのホスト名を変更できます(再起動の失敗後すぐに有効になります)。- または
hostnamectl set-hostname 主机名
、マシンのホスト名を変更します(すぐに有効にするには、再起動して有効にします)。 - または
vi /etc/hosts
、以下に示すように、hostsファイルを編集して、ホスト名を127.0.0.1に追加します(再起動して有効にします)。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 manager1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
复制代码
クラスターを作成する
任意のノードでdocker swarm init
新しいコマンドを作成し、Swarmクラスターを追加すると、そのノードがデフォルトのノードマネージャーになります。事前定義された役割に従って、101から103までの任意のマシンでこのコマンドを実行します。
通常、クラスターに参加する最初の管理ノードはになりLeader
、後で参加するすべての管理ノードはになりますReachable
。現在のリーダーが死亡すると、すべてのReachableが新しいリーダーを再選します。
[root@localhost ~]# docker swarm init --advertise-addr 192.168.10.101
Swarm initialized: current node (clumstpieg0qzzxt1caeazg8g) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5ob7jlej85qsygxubqypjuftiwruvew8e2cr4u3iuo4thxyrhg-3hbf2u3i1iagurdprl3n3yra1 192.168.10.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
复制代码
クラスターに参加する
Dockerの組み込みクラスターモードには、公開鍵インフラストラクチャ(PKI)システムが付属しているため、コンテナーを安全にデプロイするのが簡単です。クラスター内のノードは、トランスポート層セキュリティ(TLS)を使用して、クラスター内の他のノードとの通信を認証、承認、および暗号化します。
デフォルトでdocker swarm init
は、新しいSwarmクラスターコマンドを作成することにより、マネージャーノードは、クラスターに参加するためのセキュリティ保護と他のノード間の通信のために、新しいルート認証局(CA)とキーペアを生成します。
Managerノードは、他のノードがクラスターに参加するときに使用する2つのトークン、WorkerトークンとManagerトークンを生成します。各トークンには、ルートCA証明書のダイジェストとランダムに生成されたキーが含まれています。ノードがクラスターに参加すると、参加ノードはダイジェストを使用して、リモート管理ノードからのルートCA証明書を検証します。リモート管理ノードはキーを使用して、参加ノードが承認済みノードであることを確認します。
マネージャー
クラスターマネージャー管理ノードにノードを追加するには、docker swarm join-token manager
コマンドを実行して管理対象ノードのトークン情報を表示します。
docker swarm join-token manager
复制代码
次に、他のノードdocker swarm join
で実行し、トークンパラメーターSwarmをクラスターに参加させます。ノードの役割はマネージャーです。
ワーカー
クラスターの作成時に返された結果から、このクラスターにワーカーノードを追加するには、次の図のコマンドを実行することがわかります。または、管理ノードがdocker swarm join-token worker
コマンドを実行して、トークン情報作業ノードを表示します。
次に、他のノードdocker swarm join
で実行し、トークンパラメーターSwarmをクラスターに参加させます。ノードの役割はワーカーです。
クラスター情報を表示する
Managerは任意のノードで実行されdocker info
、現在のクラスターを表示できます。
クラスターノードの表示
任意のノードで実行されているマネージャーdocker node ls
は、現在のクラスターノード情報を表示できます。
docker node ls
复制代码
*
現在のノードに代わって、現在の環境は、1つのマスター、2つのスレーブ、および2つの作業ノードで構成される3つの管理ノードで構成されています。
ノードのMANAGER STATUS
説明:ワーカーに属しているノードの値ではなく、マネージャーまたはワーカーノードが属していることを示します。
Leader
:このノードは、管理ノードのマスターノードであり、クラスターの管理とクラスターのオーケストレーションの決定を担当します。Reachable
:ノードは管理ノードのスレーブノードです。リーダーノードが使用できない場合、そのノードは新しいリーダーとして選択できます。Unavailable
:管理ノードは、他の管理ノードと通信できなくなりました。管理ノードが使用できない場合は、新しい管理ノードをクラスターに追加するか、稼働中のノードを管理ノードにアップグレードする必要があります。
ノードAVAILABILITY
:スケジューラーがタスクをノードに割り当てることができるかどうかを示します。
Active
:スケジューラーはノードにタスクを割り当てることができます。Pause
:スケジューラはノードに新しいタスクを割り当てませんが、既存のタスクは引き続き実行できます。Drain
:スケジューラーはノードに新しいタスクを割り当てず、ノードの既存のタスクをすべて閉じて、使用可能なノードでそれらをスケジュールします。
ノードを削除
マネージャー
AVAILABILITY
代わりに ノードの前にノードを削除する必要がありますDrain
。その目的は、このノードのサービスを他の使用可能なノードに移行して、通常のサービスを保証することです。続行する前に、コンテナの移行をチェックして、このステップが処理されていることを確認することをお勧めします。
docker node update --availability drain 节点名称|节点ID
复制代码
次に、マネージャーノードをワーカーノードにダウングレードします。
docker node demote 节点名称|节点ID
复制代码
次に、Workerに降格されたノードで次のコマンドを実行して、クラスターを離れます。
docker swarm leave
复制代码
最後に、管理ノードに残っているノードを削除します。
docker node rm 节点名称|节点ID
复制代码
ワーカー
AVAILABILITY
代わりに ノードの前にノードを削除する必要がありますDrain
。その目的は、このノードのサービスを他の使用可能なノードに移行して、通常のサービスを保証することです。続行する前に、コンテナの移行をチェックして、このステップが処理されていることを確認することをお勧めします。
docker node update --availability drain 节点名称|节点ID
复制代码
次に、削除するワーカーノードで次のコマンドを実行して、クラスターを終了します。
docker swarm leave
复制代码
最後に、管理ノードに残っているノードを削除します。
docker node rm 节点名称|节点ID
复制代码
サービス展開
注:クラスタ管理に関連するすべての操作は、マネージャノードで実行されます。
サービスを作成
次の例では、nginxミラーリングを使用してmynginxという名前のサービスを作成し、サービスをワーカーノードにランダムに割り当てて実行します。
docker service create --replicas 1 --name mynginx -p 80:80 nginx
复制代码
docker service create
:サービスを作成します。--replicas
:実行するサービスの複数のインスタンスを指定します。--name
:サービス名。
サービスを見る
docker service ls
サービスを 介して操作を表示します。
[root@manager1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hepx06k5ik5n mynginx replicated 1/1 nginx:latest *:80->80/tcp
复制代码
docker service inspect 服务名称|服务ID
サービスの詳細を表示 できます。
[root@manager1 ~]# docker service inspect mynginx
[
{
"ID": "k0dbjg1zzy3l3g71kdwa56ect",
"Version": {
"Index": 127
},
"CreatedAt": "2020-09-16T10:05:55.627974095Z",
"UpdatedAt": "2020-09-16T10:05:55.629507771Z",
"Spec": {
"Name": "mynginx",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx:latest@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0",
"Init": false,
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {
"Platforms": [
{
"Architecture": "amd64",
"OS": "linux"
},
{
"OS": "linux"
},
{
"OS": "linux"
},
{
"Architecture": "arm64",
"OS": "linux"
},
{
"Architecture": "386",
"OS": "linux"
},
{
"Architecture": "mips64le",
"OS": "linux"
},
{
"Architecture": "ppc64le",
"OS": "linux"
},
{
"Architecture": "s390x",
"OS": "linux"
}
]
},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80,
"PublishMode": "ingress"
}
],
"VirtualIPs": [
{
"NetworkID": "st2xiy7pjzap093wz4w4u6nbs",
"Addr": "10.0.0.15/24"
}
]
}
}
]
复制代码
docker service ps 服务名称|服务ID
サービスを表示するノードで実行 できます。
タスクdocker ps
を実行している対応するノードで、コンテナに対応するサービス情報を表示できます。
通話サービス
次に、サービスに正常にアクセスできるかどうか、およびクラスター内の任意のノードのIPアドレスがサービスにアクセスできる必要があるかどうかをテストします。
テスト結果:5台すべてのマシンがサービスに正常にアクセスできます。
柔軟なサービス
サービスがクラスターにデプロイされた後、コマンドを使用して、サービス内のコンテナーの数を柔軟に拡張および縮小できます。サービスで実行されているコンテナはタスクと呼ばれます。
docker service scale 服务名称|服务ID=n
サービスタスクは、スケーラブルな容量を実行している可能性がn個です。
docker service update --replicas n 服务名称|服务ID
膨張体積削減効果を達成することができます。
mynginxサービスによって実行されるタスクを5に拡張します。
[root@manager1 ~]# docker service scale mynginx=5
mynginx 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
复制代码
docker service ps 服务名称|服务ID
サービスを表示する ことにより、どのノードで実行されています。
縮小操作の別の波を見てみましょう。コマンドは次のとおりです。
[root@manager1 ~]# docker service update --replicas 3 mynginx
mynginx
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
复制代码
docker service ps 服务名称|服务ID
サービスを表示する ことにより、どのノードで実行されています。
Swarmクラスターモードでは、いわゆるエラスティックサービスが本当の意味で実現され、動的な拡張と縮小は1行のコマンドで実行できるため、シンプルで便利で強力です。
サービスを削除
docker service rm 服务名称|服务ID
サービスを削除します。
[root@manager1 ~]# docker service rm mynginx
mynginx
[root@manager1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
复制代码
ローリング更新とロールバック
次のケースでは、Redisバージョンを上位バージョンにアップグレードし、最後の操作にロールバックする方法を示します。
まず、Redisサービスのコピーを5つ作成します。バージョンは5です。詳細なコマンドは次のとおりです。
# 创建 5 个副本,每次更新 2 个,更新间隔 10s,20% 任务失败继续执行,超出 20% 执行回滚,每次回滚 2 个
docker service create --replicas 5 --name redis \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-monitor 20s \
--rollback-parallelism 2 \
--rollback-max-failure-ratio 0.2 \
redis:5
复制代码
--update-delay
:ローリング更新の時間間隔を定義します。--update-parallelism
:並行して更新されるコピーの数を定義します。デフォルトは1です。--update-failure-action
:コンテナーが開始に失敗した後に実行されるアクションを定義します。--rollback-monitor
:ロールバックの監視時間を定義します。--rollback-parallelism
:並行してロールバックするコピーの数を定義します。--rollback-max-failure-ratio
:タスク失敗のロールバック比率。比率がこの比率を超えるとロールバック操作が実行されます。0.2は20%を意味します。
次に、次のコマンドを使用してサービスのローリング更新を実装します。
docker service update --image redis:6 redis
复制代码
サービスのロールバックは、最後の操作の状態にのみロールバックでき、指定された操作に継続的にロールバックすることはできません。
docker service update --rollback redis
复制代码
一般的なコマンド
ドッカースウォーム
コマンド | 説明 |
---|---|
docker swarm init | クラスターを初期化する |
docker swarm join-token worker | ワーカーノードのトークンを表示する |
docker swarm join-token manager | 管理ノードのトークンを表示する |
Docker Swarm Join | クラスターに参加する |
Dockerノード
コマンド | 説明 |
---|---|
Dockerノードls | クラスター内のすべてのノードを表示する |
ドッカーノードps | 現在のノードのすべてのタスクを表示する |
Dockerノードrmノード名|ノードID | ノードの削除(-f 必須削除) |
Dockerノード検査ノード名|ノードID | ノードの詳細を表示する |
Dockerノードの降格ノード名|ノードID | ノードのダウングレード、管理ノードから稼働ノードへのダウングレード |
Dockerノードがノード名を昇格する|ノードID | 作業ノードから管理ノードへのノードのアップグレード |
Dockerノード更新ノード名|ノードID | ノードを更新 |
Dockerサービス
コマンド | 説明 |
---|---|
Dockerサービスの作成 | サービスを作成 |
Dockerサービスls | すべてのサービスを表示 |
Dockerサービス検査サービス名|サービスID | サービスの詳細を表示 |
Dockerサービスログサービス名|サービスID | サービスログを見る |
Dockerサービスrmサービス名|サービスID | サービスの削除(-f 必須の削除) |
Dockerサービススケールサービス名|サービスID = n | サービスの数を設定する |
Dockerサービス更新サービス名|サービスID | 更新サービス |
著者:こんにちはMr. Ward
リンク:https://juejin.im/post/6873687528726085640