Docker Swarm集群搭建

zhouhuoya
2021-03-12 / 0 评论 / 103 阅读
温馨提示:
本文最后更新于2021-03-12,若内容或图片失效,请留言反馈。

简介

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

原理

swarm 集群由管理节点(manager)和工作节点(work node)构成。

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

docker-swarm

功能特点

  1. 与Docker Engine集成的集群管理

    使用Docker Engine CLI创建一组Docker引擎,您可以在其中部署应用程序服务。您不需要其他编排软件来创建或管理群集。

  2. 节点分散式设计

    Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时处理角色变化。您可以使用Docker Engine部署两种类型的节点,管理节点和工作节点。这意味着您可以从单个服务器构建整个群集。

  3. 声明性服务模型

    Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述由具有消息队列服务和数据库后端的Web前端服务组成的应用程序。

  4. 可扩容与缩放容器

    对于每个服务,您可以声明要运行的任务数。当您向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需的任务数量来保证集群的可靠状态

  5. 容器容错状态协调

    群集管理器节点不断监视群集状态,并协调您表示的期望状态的实际状态之间的任何差异。例如,如果设置一个服务以运行容器的10个副本,并且托管其中两个副本的工作程序计算机崩溃,则管理器将创建两个新副本以替换崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker节点上。

  6. 多主机网络

    您可以为服务指定覆盖网络。当swarm管理器初始化或更新应用程序时,它会自动为覆盖网络上的容器分配地址。

  7. 服务发现

    Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行的容器。您可以通过嵌入在swarm中的DNS服务器查询在群中运行的每个容器。

  8. 负载平衡

    您可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定如何在节点之间分发服务容器。

  9. 缺省安全:

    群中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。您可以选择使用自签名根证书或来自自定义根CA的证书。

  10. 滚动更新

    在已经运行期间,您可以增量地应用服务更新到节点。 swarm管理器允许您控制将服务部署到不同节点集之间的延迟。如果出现任何问题,您可以将任务回滚到服务的先前版本。

Docker安装

参考《Docker安装

环境信息

IPhostname角色
192.168.8.7node1manager
192.168.8.8node2worker
192.168.8.9node3worker

注:请按照表格信息配置hostname及hosts,并关闭SELinux

集群占用端口说明

  • 2377:TCP端口2377用于集群管理通信
  • 7946:TCP和UDP端口7946用于节点之间的通信
  • 4789:TCP和UDP端口4789用于覆盖网络流量

注:请关闭防火墙或者开放以上端口,保证服务器之间通讯

常用命令

在Docker Swarm中经常使用的主要有docker swarm、docker node、docker service、docker stack。

docker swarm

管理swarm,添加节点

[root@node1 ~]# docker swarm 

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

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

docker node

用于管理节点

[root@node1 ~]# docker node 

Usage:  docker node COMMAND

Manage Swarm nodes

Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node

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

docker service

管理service

[root@node1 ~]# 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.

docker stack

与docker-compose结合的命令,可以方便地在集群中部署应用。

[root@node1 ~]# docker stack 

Usage:  docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

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

安装步骤

初始化swarm

在manager服务器执行以下命令,本文为node1

[root@node1 ~]# docker swarm init --advertise-addr 192.168.8.7
Swarm initialized: current node (7htximl90se568lzwk1et2vn9) is now a manager.

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

    docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377

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

在worker节点执行命令加入集群

node2:

[root@node2 ~]# docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
This node joined a swarm as a worker.

node3:

[root@node3 ~]# docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
This node joined a swarm as a worker.

新增manager及worker

如果后续我们有新的主机被当做manager、worker节点想要加入到集群中来,但要不记得当时创建集群时的token,在manager主机上执行以下命令获取加入集群命令

**注意:manager请保证为奇数个 **

获取manager加入集群命令

[root@node1 ~]#   docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-00118144xv1kbsk3woco3ux73 192.168.8.7:2377

获取worker加入集群命令

[root@node1 ~]#   docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377

查看节点信息

[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
7htximl90se568lzwk1et2vn9 *   node1      Ready     Active         Leader           20.10.4
pd3aky1qe8pes1hk4v46vqfg1     node2      Ready     Active                          20.10.4
w1sjaj724jww19mpkqlbrwpf9     node3      Ready     Active                          20.10.4

AVAILABILITY列的说明:

  • Active 意味着调度程序可以将任务分配给节点。
  • Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
  • Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。

MANAGER STATUS列的说明

显示节点是属于manager或者worker

  • 没有值 表示不参与群管理的工作节点。
  • Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
  • Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
  • Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。

升级或降级节点

您可以将工作程序节点提升为manager角色。这在管理器节点不可用或者您希望使管理器脱机以进行维护时很有用。 类似地,您可以将管理器节点降级为worker角色。无论您升级或降级节点,您应该始终在群中维护奇数个管理器节点。升级节点或降级节点都应该在manager节点上执行命令

升级节点

[root@node1 ~]# docker node promote node2 
Node node2 promoted to a manager in the swarm.
[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
7htximl90se568lzwk1et2vn9 *   node1      Ready     Active         Leader           20.10.4
pd3aky1qe8pes1hk4v46vqfg1     node2      Ready     Active         Reachable        20.10.4
w1sjaj724jww19mpkqlbrwpf9     node3      Ready     Active                          20.10.4

降级节点

[root@node1 ~]# docker node demote node2 
Manager node2 demoted in the swarm.
[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
7htximl90se568lzwk1et2vn9 *   node1      Ready     Active         Leader           20.10.4
pd3aky1qe8pes1hk4v46vqfg1     node2      Ready     Active                          20.10.4
w1sjaj724jww19mpkqlbrwpf9     node3      Ready     Active                          20.10.4

创建自定义的overlay网络

manager节点执行

[root@node1 ~]# docker network create --driver overlay --subnet 10.10.10.0/16 zhouhuo

查询swarm网络

[root@node1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
f647038e58a7   bridge            bridge    local
6e9ca1596448   docker_gwbridge   bridge    local
ca2d5413e2b6   host              host      local
v9ncjd3k2jj0   ingress           overlay   swarm
aed5f8621657   none              null      local
4vtxz910km0q   zhouhuo           overlay   swarm

测试

测试将采用创建nginx服务的方式测试,以下操作均在manager节点执行

拉取镜像

[root@node1 ~]# docker pull nginx

创建nginx service

[root@node1 ~]# docker service create --name nginx --replicas 3 --network zhouhuo --publish 80:80 nginx:latest
bq1ht621wefby8sm76dlytaxr
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged

docker service create中的参数说明:

  • --name 服务名
  • --replicas 是创建的副本的数量
  • --network 是使用的网络
  • --publish 是服务公开的端口 :

查看nginx服务节点分配信息

[root@node1 ~]# docker service ps nginx 
ID             NAME      IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
tbx69a37e5nu   nginx.1   nginx:latest   node2     Running         Running 18 seconds ago             
u9nfgm7djld4   nginx.2   nginx:latest   node3     Running         Running 19 seconds ago             
uk7yboqag865   nginx.3   nginx:latest   node1     Running         Running 19 seconds ago

外部访问公开端口80

均能访问成功

reference