暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker swarm(2)swarm集群创建及高可用

运维笔记本 2020-01-17
1282

swarm集群创建及高可用

一、创建 Swarm 集群

我们知道 Swarm 集群由管理节点和工作节点组成。我们来创建一个包含一个管理节点和两个工作节点的最小 Swarm 集群。

搭建 Swarm 的过程有时也被称为初始化 Swarm,大体流程包括初始化第一个管理节点 -> 加入额外的管理节点 -> 加入工作节点 -> 完成。

初始化一个全新的 Swarm不包含在任何 Swarm 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式。一旦被加入 Swarm 集群,则切换为 Swarm 模式,如下图所示。

在单引擎模式下的 Docker 主机上运行 docker swarm init会将其切换到 Swarm 模式,并创建一个新的 Swarm,将自身设置为 Swarm 的第一个管理节点。

更多的节点可以作为管理节点或工作节点加入进来。这一操作也会将新加入的节点切换为 Swarm 模式。

1. 创建管理和工作节点

Docker Machine 可以在数秒内创建一个虚拟的 Docker 主机

下面我们使用它来创建三个 Docker 主机,并加入到集群中。

查看虚拟主机,现在没有

    docker-machine ls
    NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS

    2.使用 virtualbox 创建一个管理节点和两个worker节点

      docker-machine create --driver virtualbox manager1
      docker-machine create -d virtualbox worker1
      docker-machine create -d virtualbox worker2
        ➜  ~ docker-machine ls


        NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS


        manager1 - virtualbox Running tcp://192.168.99.100:2376 v19.03.5


        worker1 - virtualbox Running tcp://192.168.99.101:2376 v19.03.5


        worker2 - virtualbox Running tcp://192.168.99.102:2376 v19.03.5




        3.初始化集群

        进入管理节点

          docker-machine ssh manager1


          或者


          docker swarm init \
          --advertise-addr 192.168.99.100:2377 \
          --listen-addr 192.168.99.100:2377


          执行 sudo -i 可以进入Root 权限

          我们使用 docker swarm init
          在 manager1 初始化一个 Swarm 集群。

            docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.100
            Swarm initialized: current node (j0o7sykkvi86xpc00w71ew5b6) is now a manager.


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


            docker swarm join --token SWMTKN-1-47z6jld2o465z30dl7pie2kqe4oyug4fxdtbgkfjqgybsy4esl-8r55lxhxs7ozfil45gedd5b8a 192.168.99.100:2377


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

            如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 –advertise-addr 指定 IP。

            --advertise-addr 指定其他节点用来连接到当前管理节点的 IP 和端口。这一属性是可选的,当节点上有多个 IP 时,可以用于指定使用哪个IP。此外,还可以用于指定一个节点上没有的 IP,比如一个负载均衡的 IP。

            --listen-addr 指定用于承载 Swarm 流量的 IP 和端口。其设置通常与 --advertise-addr 相匹配,但是当节点上有多个 IP 的时候,可用于指定具体某个 IP。并且,如果 --advertise-addr 设置了一个远程 IP 地址(如负载均衡的IP地址),该属性也是需要设置的。建议执行命令时总是使用这两个属性来指定具体 IP 和端口。

            Swarm 模式下的操作默认运行于 2337 端口。虽然它是可配置的,但 2377/tcp 是用于客户端与 Swarm 进行安全(HTTPS)通信的约定俗成的端口配置。

            执行 docker swarm init 命令的节点自动成为管理节点。

            命令 docker info
            可以查看 swarm 集群状态:

              Containers: 0
              Running: 0
              Paused: 0
              Stopped: 0
              ...snip...
              Swarm: active
              NodeID: dxn1zf6l61qsb1josjja83ngz
              Is Manager: true
              Managers: 1
              Nodes: 1
              ...snip...

              命令 docker node ls
              可以查看集群节点信息:

                docker@manager1:~$ docker node ls
                ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
                1ipck4z2uuwf11f4b9mnon2ul * manager1 Ready Active Leader


                **退出虚拟主机**


                docker@manager1:~$ exit


                4.增加工作节点

                在manager节点上查看工作节点的token

                  docker@manager1:~$ docker swarm join-token worker                                                                                                          
                  To add a worker to this swarm, run the following command:


                  docker swarm join --token SWMTKN-1-1l138cs3n3s6440qt4n3t09x4d260ualp4x17ba4a82nvbxen8-ciexy2a43jj9ywpmu0vw9nt7a 192.168.99.100:2377

                  进入虚拟主机 worker1

                    $ docker-machine ssh worker1


                    加入 swarm 集群


                    docker@worker1:~$ docker swarm join \
                    --token SWMTKN-1-47z6jld2o465z30dl7pie2kqe4oyug4fxdtbgkfjqgybsy4esl-8r55lxhxs7ozfil45gedd5b8a \
                    192.168.99.100:2377


                    This node joined a swarm as a worker.
                    退出虚拟主机


                    docker@worker1:~$ exit

                    进入虚拟主机 worker2

                      $ docker-machine ssh worker1
                      加入 swarm 集群


                      docker@worker2:~$ docker swarm join \
                      --token SWMTKN-1-47z6jld2o465z30dl7pie2kqe4oyug4fxdtbgkfjqgybsy4esl-8r55lxhxs7ozfil45gedd5b8a \
                      192.168.99.100:2377


                      This node joined a swarm as a worker.
                      退出虚拟主机


                      docker@worker2:~$ exit

                      两个工作节点添加完成

                      5.查看集群

                      进入管理节点:

                        docker-machine ssh manager1
                        宿主机子上查看虚拟主机


                        docker@manager1:~$ docker-machine ls
                        NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
                        manager1 * virtualbox Running tcp://192.168.99.100:2376 v17.12.1-ce
                        worker1 - virtualbox Running tcp://192.168.99.101:2376 v17.12.1-ce
                        worker2 - virtualbox Running tcp://192.168.99.102:2376 v17.12.1-ce

                        在主节点上面执行 docker node ls 查询集群主机信息

                          docker@manager1:~$ docker node ls
                          ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
                          1ipck4z2uuwf11f4b9mnon2ul * manager1 Ready Active Leader
                          rtcpqgcn2gytnvufwfveukgrv worker1 Ready Active
                          te2e9tr0qzbetjju5gyahg6f7 worker2 Ready Active

                          到这里我们就创建了一个最小的 Swarm 集群,包含一个管理节点和两个工作节点。

                          6.多管理节点

                          为了解决管理节点的单点故障,下面添加两个管理节点,可以根据需要自行调整管理节点和工作节点的数量、名称和 IP。类似下图

                          创建两个管理节点

                            docker-machine create -d virtualbox manager2
                            docker-machine create -d virtualbox manager3
                              ➜  docker docker-machine ls 
                              NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
                              manager1 - virtualbox Running tcp://192.168.99.100:2376 v19.03.5
                              manager2 - virtualbox Running tcp://192.168.99.103:2376 v19.03.5
                              manager3 - virtualbox Running tcp://192.168.99.104:2376 v19.03.5
                              worker1 - virtualbox Running tcp://192.168.99.101:2376 v19.03.5
                              worker2 - virtualbox Running tcp://192.168.99.102:2376 v19.03.5

                              通过docker swarm join-token manager
                              获取加入管理节点的token信息

                                $ docker swarm join-token manager
                                To add a manager to this swarm, run the following command:
                                docker swarm join \
                                --token SWMTKN-1-0uahebax...ue4hv6ps3p \
                                192.168.99.100:2377

                                请注意,工作节点和管理节点的接入命令中使用的接入 Token(SWMTKN...)是不同的。因此,一个节点是作为工作节点还是管理节点接入,完全依赖于使用了哪个 Token。接入 Token 应该被妥善保管,因为这是将一个节点加入 Swarm 的唯一所需!

                                把manager2 加入集群

                                登录到 mgr2,然后使用含有管理节点接入 Token 的 docker swarm join 命令,将该节点作为工作节点接入 Swarm。

                                  docker-machine ssh manager2
                                  $ docker swarm join \
                                  --token SWMTKN-1-0uahebax...ue4hv6ps3p \
                                  192.168.99.100:2377 \
                                  --advertise-addr 192.168.99.103:2377 \
                                  --listen-addr 192.168.99.103:2377


                                  This node joined a swarm as a manager.

                                  在 mgr3 上重复以上步骤,记得在 --advertise-addr 与 --listen-addr 属性中指定 mgr3 的 IP 地址。

                                    docker-machine ssh manager2
                                    $ docker swarm join \
                                    --token SWMTKN-1-0uahebax...ue4hv6ps3p \
                                    192.168.99.100:2377 \
                                    --advertise-addr 192.168.99.104:2377 \
                                    --listen-addr 192.168.99.104:2377


                                    This node joined a swarm as a manager.

                                    在任意一个管理节点上执行 docker node ls 命令来列出 Swarm 节点。

                                      $ docker node ls
                                      ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
                                      0g4rl...babl8 * manager1 Ready Active Reachable
                                      2xlti...l0nyp manager3 Ready Active Reachable
                                      8yv0b...wmr67 worker1 Ready Active
                                      9mzwf...e4m4n worker2 Ready Active
                                      d21ly...9qzkx manager2 Ready Active Leader
                                      e62gf...l5wt6 worker3 Ready Active

                                      至此,已经成功创建了 6 个节点的 Swarm,其中包含 3 个管理节点和 3 个工作节点。

                                      在这个过程中,每个节点的 Docker 引擎都被切换到 Swarm 模式下。并且,Swarm 已经自动启用了 TLS 安全。

                                      注意,mgr2 的 ID 列还显示了一个星号(*),这个星号会告知用户执行docker node ls 命令所在的节点。本例中,命令是在 mgr2 节点执行的。

                                      二、swarm 高可用(HA)管理

                                      下文整理自文末链接。

                                      现在已经有一个运行中的 Swarm 了,下面看一下如何进行高可用(HA)管理。

                                      Swarm 管理器高可用性(HA)Swarm 的管理节点内置有对 HA 的支持。这意味着,即使一个或多个节点发生故障,剩余管理节点也会继续保证 Swarm 的运转。

                                      从技术上来说,Swarm 实现了一种主从方式的多管理节点的 HA。这意味着,即使你可能有多个管理节点,也总是仅有一个节点处于活动状态。

                                      通常处于活动状态的管理节点被称为“主节点”(leader),而主节点也是唯一一个会对 Swarm 发送控制命令的节点。也就是说,只有主节点才会变更配置,或发送任务到工作节点。如果一个备用(非活动)管理节点接收到了 Swarm 命令,则它会将其转发给主节点。

                                      这一过程如下图所示。步骤 ① 指命令从一个远程的 Docker 客户端发送给一个管理节点;步骤 ② 指非主节点将命令转发给主节点;步骤 ③ 指主节点对 Swarm 执行命令。

                                      Swarm的高可用(HA)管理

                                      仔细观察上图会发现,管理节点或者是 Leader 或者是 Follower。这是 Raft 的术语,因为 Swarm 使用了 Raft 共识算法的一种具体实现来支持管理节点的HA。

                                      关于 HA,有以下两条最佳实践原则。

                                      • 部署奇数个管理节点。
                                      • 不要部署太多管理节点(建议 3 个或 5 个)。

                                      部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。假如有 4 个管理节点,当网络发生分区时,可能会在每个分区有两个管理节点。这种情况被称为脑裂。

                                      每个分区都知道曾经有 4 个节点,但是当前网络中仅有两个节点,糟糕的是,每个分区都无法知道其余两个节点是否运行,也无从得知本分区是否掌握大多数(Quorum)。

                                      虽然在脑裂情况下集群依然在运行,但是已经无法变更配置,或增加和管理应用负载了。不过,如果部署有 3 个或 5 个管理节点,并且也发生了网络分区,就不会出现每个分区拥有同样数量的管理节点的情况。

                                      这意味着掌握多数管理节点的分区能够继续对集群进行管理。下图中右侧的例子,阐释了这种情况,左侧的分区知道自己掌握了多数的管理节点。

                                      多数管理节点的分区继续对集群进行管理

                                      对于所有的共识算法来说,更多的参与节点就意味着需要花费更多的时间来达成共识。这就像决定去哪吃饭,只有3个人的时候总是比有33个人的时候能更快确定。

                                      考虑到这一点,最佳的实践原则是部署 3 个或 5 个节点用于 HA。7 个节点可以工作,但是通常认为 3 个或 5 个是更优的选择。当然绝对不要多于 7 个,因为需要花费更长的时间来达成共识。

                                      补充

                                      关于管理节点的 HA 再补充一点。显然将管理节点分布到不同的可用域(Availability Zone)中是一种不错的实践方式,但是一定要确保它们之间的网络连接是可靠的,否则由于底层网络分区导致的问题将是令人痛苦的。

                                      内置的 Swarm 安全机制Swarm 集群内置有繁多的安全机制,并提供了开箱即用的合理的默认配置——如 CA 设置、接入 Token、公用 TLS、加密集群存储、加密网络、加密节点 ID 等。

                                      • 如何正确重启一个集群节点?

                                      锁定 Swarm尽管内置有如此多的原生安全机制,重启一个旧的管理节点或进行备份恢复仍有可能对集群造成影响。

                                      一个旧的管理节点重新接入 Swarm 会自动解密并获得 Raft 数据库中长时间序列的访问权,这会带来安全隐患。

                                      进行备份恢复可能会抹掉最新的 Swarm 配置。

                                      为了规避以上问题,Docker 提供了自动锁机制来锁定 Swarm,这会强制要求重启的管理节点在提供一个集群解锁码之后才有权从新接入集群。

                                      通过在执行 docker swarm init
                                      命令来创建一个新的 Swarm 集群时传入 --autolock
                                      参数可以直接启用锁。

                                      然而,前面已经搭建了一个 Swarm 集群,这时也可以使用 docker swarm update
                                      命令来启用锁。

                                      在某个 Swarm 管理节点上运行如下命令。

                                        $ docker swarm update --autolock=true
                                        Swarm updated.
                                        To unlock a swarm manager after it restarts, run the
                                        `docker swarm unlock`command and provide the following key:


                                        SWMKEY-1-5+ICW2kRxPxZrVyBDWzBkzZdSd0Yc7Cl2o4Uuf9NPU4


                                        Please remember to store this key in a password manager, since without
                                        it you will not be able to restart the manager.

                                        请确保将解锁码妥善保管在安全的地方!

                                        重启某一个管理节点,以便观察其是否能够自动重新接入集群。

                                          $ service docker restart

                                          尝试列出Swarm中的节点。

                                            $ docker node ls
                                            Error response from daemon: Swarm is encrypted and needs to be unlocked


                                            before it can be used.

                                            尽管 Docker 服务已经重启,该管理节点仍然未被允许重新接入集群。

                                            为了进一步验证,可以到其他管理节点执行 docker node ls 命令,会发现重启的管理节点会显示 down 以及 unreachable。

                                            执行docker swarm unlock
                                            命令来为重启的管理节点解锁 Swarm该命令需要在重启的节点上执行,同时需要提供解锁码。

                                              $ docker swarm unlock
                                              Please enter unlock key: <enter your key>

                                              该节点将被允许重新接入 Swarm,并且再次执行docker node ls
                                              命令会显示 ready
                                              reachable

                                              三、参考

                                              http://c.biancheng.net/view/3178.html


                                              最后修改时间:2020-01-18 12:18:48
                                              文章转载自运维笔记本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                              评论