docker swarm 使用详解
转载请注明出处:
1.docker swarm 的组成架构
一个基本的docker swarm 的架构如下:
它主要包含这几个核心组件:
-
Manager节点(Manager Nodes): 管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。Swarm可以有一个或多个Manager节点,其中一个被选举为Leader,负责领导整个集群。
-
Worker节点(Worker Nodes): 工作节点是集群中运行容器的实际节点。它们接受从Manager节点分配的任务,并在本地运行容器。
-
Overlay网络(Overlay Network): Overlay网络是Swarm集群中容器之间进行跨主机通信的虚拟网络。它使用VXLAN技术将多个主机上的容器连接到同一个网络中。
-
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
- 在Docker Swarm中,Overlay网络是自动创建的一种虚拟网络类型,用于容器间的通信。
- 当创建服务时,Swarm会自动为该服务创建一个Overlay网络,并将服务的容器连接到这个网络上。
- 当新的节点加入Swarm时,它将自动与已有的Overlay网络进行通信。新节点会自动加入到已存在的Overlay网络中,无需手动配置。
docker swarm 容器之间通信:
Swarm使用了Raft共识算法的一种具体实现来支持管理节点的HA。关于HA,以下是两条最佳实践原则。
● 部署奇数个管理节点。
● 不要部署太多管理节点(建议3个或5个)。
部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。假如有4个管理节点,当网络发生分区时,可能会在每个分区有两个管理节点。这种情况被称为脑裂——每个分区都知道曾经有4个节点,但是当前网络中仅有两个节点。糟糕的是,每个分区都无法知道其余两个节点是否运行,也无从得知本分区是否掌握大多数(Quorum)。虽然在脑裂情况下集群依然在运行,但是已经无法变更配置,或增加和管理应用负载了。
不过,如果部署有3个或5个管理节点,并且也发生了网络分区,就不会出现每个分区拥有同样数量的管理节点的情况。这意味着掌握多数管理节点的分区能够继续对集群进行管理。图10.5中右侧的例子,阐释了这种情况,左侧的分区知道自己掌握了多数的管理节点。
6.常用命令
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命令用于查看服务的日志。