Docker Swarm 集群管理

[toc]

swarm

是什么

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

原理

如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

image-20221122204223589

共识算法

swarm 的共识算法和 etcd 共识算法是类似的,使用的是 raft 共识算法,来保证集群的稳定性。

提示

在 CloudNative 中我们可以看到关于 etcd & raft 教程。

raft 需要保证大部分节点一致性,所以不要心存侥幸~

我们应该尽可能的使用 奇数 作为集群数量。

1 1 0 0 leader

2 2 0 0 leader

3 2 1 1 leader

5 3 2 2 leader

6 4 2 2 leader

奇数和偶数一样的~

命令

[root@iZbp1evo5cnwagauz3w188Z /]# docker swarm -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

init

Usage:  docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])
      --autolock                               Enable manager autolocking (requiring an unlock key to start a stopped manager)
      --availability string                    Availability of the node ("active"|"pause"|"drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic (format: <ip|interface>)
      --data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value is set
                                               or is set to 0, the default port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)

初始化集群

[root@iZbp1evo5cnwagauz3w188Z /]# docker swarm init
Swarm initialized: current node (an0oq2uwu0qv2xkfcwwazhjx5) is now a manager.

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

    docker swarm join --token SWMTKN-1-2vqziogty31uuxyw58fwbbvji4323uz24v1hhgusnw0dve7k12-0q89bbp3g4st04eij30x7ob2i 10.0.0.188:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

提示

生成了一个用于其他节点加入主节点的命令:

docker swarm join --token SWMTKN-1-2vqziogty31uuxyw58fwbbvji4323uz24v1hhgusnw0dve7k12-0q89bbp3g4st04eij30x7ob2i 10.0.0.188:2377

移除节点(离开集群):

docker swarm leave

更新集群:

docker swarm update 

服务

[root@iZbp1evo5cnwagauz3w188Z /]# docker service
Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.

其他常用命令

初始化 swarm 集群,进行初始化的这台机器,就是集群的管理节点。

docker-machine ssh swarm-manager
docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。

查看集群信息

进入管理节点,执行:docker info 可以查看当前集群的信息。

docker info

部署服务到集群中

注意:跟集群管理有关的任何操作,都是在管理节点上操作的。

以下例子,在一个工作节点上创建一个名为 helloworld 的服务,这里是随机指派给一个工作节点:

docker service create --replicas 1 --name helloworld alpine ping docker.com