docker swarm 使用详解

发布时间 2023-08-13 23:35:32作者: 香吧香

转载请注明出处:

1.docker swarm 的组成架构

  一个基本的docker swarm 的架构如下:

  

  它主要包含这几个核心组件:

  1. Manager节点(Manager Nodes): 管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。Swarm可以有一个或多个Manager节点,其中一个被选举为Leader,负责领导整个集群。

  2. Worker节点(Worker Nodes): 工作节点是集群中运行容器的实际节点。它们接受从Manager节点分配的任务,并在本地运行容器。

  3. Overlay网络(Overlay Network): Overlay网络是Swarm集群中容器之间进行跨主机通信的虚拟网络。它使用VXLAN技术将多个主机上的容器连接到同一个网络中。

  4. Service服务(Services): 服务是在Swarm集群中定义和运行的容器应用程序。服务可以由多个副本(replicas)组成,Swarm会自动在集群中的各个节点上调度和管理这些副本。服务可以通过负载均衡、自动伸缩等特性来保证高可用性和容错性。

2.docker swarm的作用和应用场景

  Docker Swarm是Docker提供的原生容器编排和集群管理工具,它允许用户将多个Docker主机组成一个虚拟集群,以便更轻松地管理和部署容器化应用程序。 

  1. 集群管理:

  • Swarm模式: Docker Swarm使用Swarm模式来组织和管理集群。集群中有一个或多个Manager节点和多个Worker节点,其中Manager节点负责集群管理和调度,而Worker节点运行容器。
  • 高可用性: Swarm集群中的Manager节点通过Raft一致性协议进行选举,确保在Leader节点故障时能够自动切换到其他Manager节点,保证集群的高可用性。

  2. 服务定义和部署:

  • Service服务: 在Swarm中,用户通过定义和部署服务来描述应用程序的架构和需求。服务可以由多个副本(replicas)组成,Swarm会自动在集群中的各个节点上调度和管理这些副本。
  • Stack堆栈: 用户可以使用Docker Compose文件来定义多个服务,并使用docker stack deploy命令部署整个Stack。这样可以一次性启动整个应用的所有服务。

  3. 容器通信和负载均衡:

  • Overlay网络: Swarm集群中的容器通过Overlay网络进行跨主机通信。Swarm会自动创建和管理这些Overlay网络,并为每个服务分配一个虚拟网络。容器可以使用服务名称进行相互通信,而不用关心实际运行在哪个节点上。
  • 负载均衡: Swarm集群内置了负载均衡功能,它会自动将外部请求路由到运行服务的节点。这样,用户可以通过任何节点访问服务,Swarm会自动将请求转发到负载最低的容器。

  4. 弹性伸缩和滚动更新:

  • 弹性伸缩: 用户可以根据需求随时增加或减少服务的副本数量,以适应应用程序的流量变化。Swarm会自动在集群中的节点上启动或停止容器,保持所需的副本数量。
  • 滚动更新: Swarm支持滚动更新,可以逐步替换旧版本的容器。这样可以避免应用程序中断并提供无缝的升级体验。

  5. 监控和日志收集:

  • 监控: Swarm集群可以与各种监控工具集成,如Prometheus、Grafana等,以收集和展示容器和集群的统计信息。
  • 日志收集: Swarm集群可以使用日志驱动来收集容器的日志,并将其重定向到指定的位置,如Elasticsearch、Logstash等。

  Docker Swarm是一个强大且易于使用的容器编排和集群管理工具,它可以简化容器应用程序的部署、管理和扩展。Swarm提供了高可用性、容器通信、负载均衡、弹性伸缩等功能,适用于各种规模的应用场景。

3.docker swarm 配置

  不包含在任何Swarm中的Docker节点,称为运行于单引擎(Single-Engine)模式。一旦被加入Swarm集群,则切换为Swarm模式。在单引擎模式下的Docker主机上运行docker swarm init会将其切换到Swarm模式,并创建一个新的Swarm,将自身设置为Swarm的第一个管理节点。

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

  (1).登录到node1(mgr1)并初始化一个新的Swarm初始化一个全新的Swarm

$ docker swarm init \
  --advertise-addr 10.0.0.1:2377 \
  --listen-addr 10.0.0.1:2377

Swarm initialized: current node (d21lyz...c79qzkx) is now a manager.

  将这条命令拆开分析如下。

  ● docker swarm init会通知Docker来初始化一个新的Swarm,并将自身设置为第一个管理节点。同时也会使该节点开启Swarm模式。

  ● --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)通信的约定俗成的端口配置。

  (2).列出Swarm中的节点。

$ docker node ls
ID            HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
d21...qzkx *  mgr1      Ready   Active        Leader

  此时mgr1是Swarm中唯一的节点,并且作为Leader列出

  (3)在mgr1上执行docker swarm join-token命令来获取添加新的工作节点和管理节点到Swarm的命令和Token。

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

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

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

  (4)登录到wrk1,并使用包含工作节点接入Token的docker swarm join命令将其接入Swarm。

$ docker swarm join \
    --token SWMTKN-1-0uahebax...c87tu8dx2c \
    10.0.0.1:2377 \
    --advertise-addr 10.0.0.4:2377 \
    --listen-addr 10.0.0.4:2377

This node joined a swarm as a worker.

  --advertise-addr与--listen-addr属性是可选的。在网络配置方面,请尽量明确指定相关参数,这是一种好的实践。

  (5)在wrk2和wrk3上重复上一步骤来将这两个节点作为工作节点加入Swarm。确保使用--advertise-addr与--listen-addr属性来指定各自的IP地址。

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

$ docker swarm join \
    --token SWMTKN-1-0uahebax...ue4hv6ps3p \
    10.0.0.1:2377 \
    --advertise-addr 10.0.0.2:2377 \
    --listen-addr 10.0.0.1:2377

This node joined a swarm as a manager.

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

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

$ docker node ls
ID                HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
0g4rl...babl8 *   mgr2      Ready   Active        Reachable
2xlti...l0nyp     mgr3      Ready   Active        Reachable
8yv0b...wmr67     wrk1      Ready   Active
9mzwf...e4m4n     wrk3      Ready   Active
d21ly...9qzkx     mgr1      Ready   Active        Leader
e62gf...l5wt6     wrk2      Ready   Active

4.docker swarm 通信

  在Docker Swarm中创建通信网络是通过Overlay网络来实现的。Overlay网络允许Swarm集群中的容器在不同的主机上进行跨主机通信。

  • 在Docker Swarm中,Overlay网络是自动创建的一种虚拟网络类型,用于容器间的通信。
  • 当创建服务时,Swarm会自动为该服务创建一个Overlay网络,并将服务的容器连接到这个网络上。
  • 当新的节点加入Swarm时,它将自动与已有的Overlay网络进行通信。新节点会自动加入到已存在的Overlay网络中,无需手动配置。

  docker swarm 容器之间通信:

  在Docker Swarm集群中,每个Docker容器的 hosts文件会自动添加一条与当前容器名称和IP地址相关的主机配置。这是由于Swarm集群管理器(manager)自动维护了一个内部DNS服务,并在集群中的各个节点上自动更新所有容器的hosts文件。

  当一个容器创建或加入到Swarm集群中时,Swarm manager会为该容器生成一个唯一的名称,并将该容器的名称与其IP地址映射写入到它所在节点的hosts文件中。

  在Swarm集群中,容器之间可以通过容器名称相互通信,而无需关注它们所在的物理主机。通过在容器中使用其他容器的名称作为主机名,可以实现容器之间的直接通信。

  这种配置的作用是简化容器之间的网络通信。通过在hosts文件中添加容器名称和IP地址的映射关系,可以使容器之间不再需要知道对方的具体IP地址,而是通过使用容器名称来进行通信。这样的设计方便了容器的扩展和移动,因为容器的IP地址可能会发生变化,但其名称仍然保持不变。Swarm manager负责在集群中管理和更新这些映射关系,以确保容器之间的通信能够持续有效。

5.Swarm管理器高可用性(HA)

                       

  Swarm使用了Raft共识算法的一种具体实现来支持管理节点的HA。关于HA,以下是两条最佳实践原则。

    ● 部署奇数个管理节点。

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

  部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。假如有4个管理节点,当网络发生分区时,可能会在每个分区有两个管理节点。这种情况被称为脑裂——每个分区都知道曾经有4个节点,但是当前网络中仅有两个节点。糟糕的是,每个分区都无法知道其余两个节点是否运行,也无从得知本分区是否掌握大多数(Quorum)。虽然在脑裂情况下集群依然在运行,但是已经无法变更配置,或增加和管理应用负载了。

  不过,如果部署有3个或5个管理节点,并且也发生了网络分区,就不会出现每个分区拥有同样数量的管理节点的情况。这意味着掌握多数管理节点的分区能够继续对集群进行管理。图10.5中右侧的例子,阐释了这种情况,左侧的分区知道自己掌握了多数的管理节点。