目录
- Swarm Cluster
- 创建一个集群
Swarm Cluster
Swarm cluster集群是一组运行Docker并加入到集群中的机器。之后可继续执行docker命令,不过现在它们是由集群管理器在集群上执行。集群中的机器可以是物理的,也可以是虚拟的,加入集群后被称为节点。
可以使用不同的策略来控制容器运行的节点。确保每台机器只获得指定容器的一个实例。
节点类型
- managers
- workers
managers节点
- 是集群中唯一能够执行命令的机器
- 维护集群状态
- 调度services
- swarm 模式HTTP API端点
swarm 管理器使用 Raft 来实现维护整个 swarm 集群一致的内部状态
如果是测试的目的可以只运行一个 swarm 管理节点。如果单管理器的 swarm 出问题下线了,服务仍然会运行,不过你需要创建一个新的集群来恢复它。
要利用 swarm 模式的容错功能,建议创建奇数的管理节点。当有多个管理节点时,如果一个leader节点宕机,其余的manager节点将选择一个新的leader,并恢复集群状态的编排和维护。默认情况下,管理器节点也运行任务。
- 三个管理节点的 swarm 最大允许一个管理节点宕机
- 五个管理节点的 swarm 最大允许两个管理节点宕机
- N 个管理节点的 swarm 最大允许(N-1)/2 个管理节点宕机
Docker 推荐最多创建 7 个管理节点
worker节点
Worker 节点是 Docker Engine 的实例,其唯一目的是运行容器。 Worker 节点不参与Raft 分布状态,不作调度的决策或提供 swam 模式的 HTTP API 服务。
为了防止调度程序将任务放置在多节点集群中的管理器节点上,可以将manager节点的状态设为Drain ,调度程序优雅地停止节点上的任务,并在活动节点上调度任务。调度程序不会将新任务分配给状态为Drain的节点。
改变节点角色
当管理节点下线时可能会想把 worker 节点提升为管理节点,可以通过docker node promote 来把一个 worker 节点提升为管理节点 详细信息
也可以把管理节点降级为worker节点 详细信息
创建一个集群
启动一个swarm manager节点
添加docker damon的网络监听
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock
初始化swarm manager节点
[root@localhost ~]# docker swarm init --advertise-addr 192.168.126.128 Swarm initialized: current node (ne4zc6ntfqi608w0svyd8u68h) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. [root@localhost ~]# --advertise-addr 允许集群中的其他节点访问Swarmkit API和覆盖网络。swarm中的其他节点必须能够访问此地址。 以worker节点加入集群的命令可以通过 docker swarm join-token worker 获得 以manager节点加入集群的命令可通过docker swarm join-token manager 获得
- 将当前节点切换到群集模式。
- 创建一个名为default的集群。
- 指定当前节点为群集的leader manager节点。
- 用机器主机名命名节点。
- 将管理器配置为监听端口2377上的活动网络接口。
- 将当前节点设置为Active,这意味着它可以从调度程序接收任务。
- 为参与集群的引擎启动内部分布式数据存储,以维护集群及其上运行的所有服务的一致视图。
- 默认情况下,为群集生成一个自签名根CA。
- 默认情况下,为worker和manager节点生成令牌以加入集群。
- 创建一个名为ingress的覆盖网络,用于发布集群外部的服务端口。
- 为您的网络创建一个覆盖的默认IP地址和子网掩码
2376 docker守护进程端口
2377 集群管理端口
添加一个工作节点
- 添加docker damon的网络监听 略
加入集群
docker swarm join命令执行以下操作[root@localhost ~]# docker swarm join --token SWMTKN-1-0freguc5obmm505ujge4q3eem8hjnezq2f9c8czicezga4jn1j-awza9pu4on6v5ltos9cq7c9xc 192.168.126.128:2377 This node joined a swarm as a worker. [root@localhost ~]#
- 将当前节点上的Docker引擎切换到群集模式。
- 从管理器请求TLS证书
- 用机器主机名命名节点
- 基于swarm令牌在manager监听地址上将当前节点连接到swarm。
- 将当前节点设置为活动可用性,这意味着它可以从调度程序接收任务。
- 将入口覆盖网络扩展到当前节点。
查看集群
在swarm manager节点执行
AVAILABILITY 表示调度程序是否可以将任务分配给节点[root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION l2o08alsqh7az4d4tov1pwjcw localhost.localdomain Ready Active 18.09.6 ne4zc6ntfqi608w0svyd8u68h * localhost.localdomain Ready Active Leader 18.09.6
- Active 可以将任务分配给节点
- Pause 调度程序不向节点分配新任务,但现有的任务仍然运行
- Drain 调度程序不向节点分配新任务,已经存在的任务也将被调用到Active节点上
没有值表示不参与群集管理的工作节点- Leader 为集群做出所有的集群管理和编排决策
- Reachable 表示节点参与Raft仲裁的manager节点。如果leader节点不可用,则该节点有资格成为新的leader
- Unavailable 表示节点是一个无法与其他manager通信的节点。如果manager节点变为此状态应该加入一个新的manager节点到集群中,或者将一个工作节点提升为一个manager
查看节点详细信息
docker node inspect
docker node inspect self --pretty (查看当前节点的详细信息) [root@node1 ~]# docker node inspect i8so3iawiupkswhqsguiw7l91 --pretty ID: i8so3iawiupkswhqsguiw7l91 Hostname: node2 Joined at: 2019-06-11 04:46:29.827796972 +0000 utc Status: State: Ready Availability: Active Address: 192.168.49.136 Manager Status: Address: 192.168.49.136:2377 Raft Status: Reachable Leader: No Platform: Operating System: linux Architecture: x86_64 Resources: CPUs: 1 Memory: 1.777GiB Plugins: Log: awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog Network: bridge, host, macvlan, null, overlay Volume: local Engine Version: 18.09.6 TLS Info: TrustRoot: -----BEGIN CERTIFICATE----- MIIBaTCCARCgAwIBAgIUdZKOgCJWeabnUvO3g/aPe9dO040wCgYIKoZIzj0EAwIw EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTkwNjExMDMwNTAwWhcNMzkwNjA2MDMw NTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH A0IABCIrZHQWBQCOmVZ1wk3iz5dUSSinyK5+O/2kI/SP0dFhyYkV3fwQTIjRp3xg 5gHkosPXJzsWD28ozkV4Gmlx9gWjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBRBQ7wdTOzgK8zl15i4+GKYM2GJSDAKBggqhkjO PQQDAgNHADBEAiAtkLmwd2f7gADeyX82Yc/0KjJOmQnVQkOsZuP+rdVQjwIgLd52 yom4uvNZpJ7O3u7uNi/dO7fB5v8tGjZ+Vm3Ouo8= -----END CERTIFICATE----- Issuer Subject: MBMxETAPBgNVBAMTCHN3YXJtLWNh Issuer Public Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIitkdBYFAI6ZVnXCTeLPl1RJKKfIrn47/aQj9I/R0WHJiRXd/BBMiNGnfGDmAeSiw9cnOxYPbyjORXgaaXH2BQ==
更新节点属性
- 改变节点可用性
- 添加或删除标签元数据
- 更改节点角色
改变节点可用性
- 清空管理节点,以便只执行swarm管理任务,并且无法进行任务分配。
- 清空一个节点,以进行维护。
- 暂停节点,使其无法接收新任务。
- 恢复不可用节点或暂停节点的可用状态。
举例:
[root@node1 ~]# docker node update --availability drain node1
node1
Add or remove label metadata
节点标签提供了一种灵活的节点组织方法。可以再服务中使用节点标签,以限制task分配的节点。
在manager节点上运行docker node update --label-add 向节点添加标签元数据。--label-add支持 或者=
[root@node1 ~]# docker node update --label-add aaa --label-add bbb=222 --label-add ccc node1
node1
--label-add 可以多次使用
Promote or demote a node
可以将节点角色有worker节点升为manager节点,或者将manager节点降级为worker节点。
【注意】无论提升或降级节点的原因是什么,都必须始终维护集群中管理器节点的仲裁。
若要提升一个或一组节点,从manager节点运行docker node promote:
$ docker node promote node-3 node-2 Node node-3 promoted to a manager in the swarm. Node node-2 promoted to a manager in the swarm.
要降级一个或一组节点,从manager节点运行docker node demote:
$ docker node demote node-3 node-2 Manager node-3 demoted in the swarm. Manager node-2 demoted in the swarm.
脱离集群
在node节点执行
[root@localhost ~]# docker swarm leave Node left the swarm.
节点离开群集后,可以在manager点上运行docker节点rm命令,将节点从节点列表中删除。
$ docker node rm node-2
集群配置完毕!
参考
https://docs.docker.com/engine/swarm/
https://blog.51cto.com/13555423/2310922