转载请注明出处:
一个基本的docker swarm 的架构如下:
它主要包含这几个核心组件:
Manager节点(Manager Nodes): 管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。Swarm可以有一个或多个Manager节点,其中一个被选举为Leader,负责领导整个集群。
Worker节点(Worker Nodes): 工作节点是集群中运行容器的实际节点。它们接受从Manager节点分配的任务,并在本地运行容器。
Overlay网络(Overlay Network): Overlay网络是Swarm集群中容器之间进行跨主机通信的虚拟网络。它使用VXLAN技术将多个主机上的容器连接到同一个网络中。
Service服务(Services): 服务是在Swarm集群中定义和运行的容器应用程序。服务可以由多个副本(replicas)组成,Swarm会自动在集群中的各个节点上调度和管理这些副本。服务可以通过负载均衡、自动伸缩等特性来保证高可用性和容错性。
Docker Swarm是Docker提供的原生容器编排和集群管理工具,它允许用户将多个Docker主机组成一个虚拟集群,以便更轻松地管理和部署容器化应用程序。
1. 集群管理:
2. 服务定义和部署:
docker stack deploy
命令部署整个Stack。这样可以一次性启动整个应用的所有服务。3. 容器通信和负载均衡:
4. 弹性伸缩和滚动更新:
5. 监控和日志收集:
Docker Swarm是一个强大且易于使用的容器编排和集群管理工具,它可以简化容器应用程序的部署、管理和扩展。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
docker swarm 容器之间通信:
Swarm使用了Raft共识算法的一种具体实现来支持管理节点的HA。关于HA,以下是两条最佳实践原则。
● 部署奇数个管理节点。
● 不要部署太多管理节点(建议3个或5个)。
部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。假如有4个管理节点,当网络发生分区时,可能会在每个分区有两个管理节点。这种情况被称为脑裂——每个分区都知道曾经有4个节点,但是当前网络中仅有两个节点。糟糕的是,每个分区都无法知道其余两个节点是否运行,也无从得知本分区是否掌握大多数(Quorum)。虽然在脑裂情况下集群依然在运行,但是已经无法变更配置,或增加和管理应用负载了。
不过,如果部署有3个或5个管理节点,并且也发生了网络分区,就不会出现每个分区拥有同样数量的管理节点的情况。这意味着掌握多数管理节点的分区能够继续对集群进行管理。图10.5中右侧的例子,阐释了这种情况,左侧的分区知道自己掌握了多数的管理节点。
docker swarm init命令用户创建一个新的Swarm。执行该命令的节点会成为第一个管理节点,并且会切换到Swarm模式。
● docker swarm join-token命令用于查询加入管理节点和工作节点到现有Swarm时所使用的命令和Token。要获取新增管理节点的命令,请执行docker swarm join-token manager命令;要获取新增工作节点的命令,请执行docker swarm join-token worker命令。
● docker node ls命令用于列出Swarm中的所有节点及相关信息,包括哪些是管理节点、哪个是主管理节点。
● docker service create命令用于创建一个新服务。
● docker service ls命令用于列出Swarm中运行的服务,以及诸如服务状态、服务副本等基本信息。
● docker service ps <service>命令会给出更多关于某个服务副本的信息。
● docker service inspect命令用于获取关于服务的详尽信息。附加--pretty参数可限制仅显示重要信息。
● docker service scale命令用于对服务副本个数进行增减。
● docker service update命令用于对运行中的服务的属性进行变更。
● docker service logs命令用于查看服务的日志。