1.Swarm 集群
Swarm 集群( Cluster )为 组被统一管理起来的 Docker 主机 集群是 Swarm 所管理的对象 这些主机通过 Docker 引擎的 Swarm 模式相互沟通,其中部分主机可能作为管理节点(manager )响应外部的管理请求,其他主机作为工作节点( worker )来实际运行 Docker 容器。当然,同一个主机也可以即作为管理节点,同时作为工作节点。
当用户使用 Swarm 集群时,首先定义 个服务(指定状态、复制个数、网络、存储、暴露端口等),然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
2.节点
节点(Node )是 Swarm 集群的最小资源单位 每个节点实际上都是一台 Docker 主机。
Swarm 集群中节点分为两种:
第一种:管理节点(manager node ):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点 同时,多个管理节点之间通过 Raft 协议构成共识 一般推荐每个集群设置5个或 7个管理节点;
第二种:工作节点( worker node ):负责执行管理节点安排的具体任务 默认情况下,管理节点自身也同时是工作节点 每个工作节点上运行代理( agent )来汇报任务完成情况。用户可以通过 docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote 命令来将一个管理节点降级为工作节点
3.服务
服务( Se ice )是 Docker 支持复杂多容器协作场景的利器。一个服务可以由若干个任务组成,每个任务为某个具体的应用 服务还包括对应的存储、网络、端口映射、副本个数、访问配置、升级配置等附加参数。
一般来说,服务需要面向特定的场景,例如一个典型的 Web 服务可能包括前端应用、后端应用,以及数据库等,这些应用都属于该服务的管理范畴。
Swarm 集群中服务类型也分为两种(可以通过-mode 指定):
第一种:复制服务( replicated services )模式:默认模式,每个任务在集群中会存在若干副本,
这些副本会被管理节点按照调度策略分发到集群中的工作节点上,此模式下可以使用–replicas 参数设置副本数量。
第二种:全局服务( global services )模式 调度器将在每个可用节点都执行一个相同的任务。该模式适合运行节点的检查,如监控应用等
4.任务
任务是 Swarm 集群中最小的调度单位,即一个指定的应用容器。例如仅仅运行前端业务的前端容器 任务从生命周期上将可能处于创建( NEW)、等待( PENDING)、分配( ASSIGNED )、接受( ACCEPTED )、准备( PREPARING )、开始( STARTING )、运行(RUNNING)、完成(COMPLETE )、失败(FAILED )、关闭( SHUTDOWN)、 拒绝(REJECTED)、孤立(ORPHANED )等不同状态。
Swarm 集群中的管理节点会按照调度要求将任务分配到工作节点上。例如指定副本为2时,可能会被分配到两个不同的工作节点上。一旦当某个任务被分配到 一个工作节点,将无法被转移到另外的 作节点,即 Swarm 中的任务不支持迁移。
5.服务的外部访问
Swarm 集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。
Swarm 中支持入口负载均衡( ingress load baancing )的映射模式,该模式下,每个服务都会被分配一个公开端口( PublishedPort ),该端口在集群中任意节点上都可以访问到,并被保留给该服务。
当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
使用 Swarm
用户在安装 Docker 1.12 更新的版本后 ,即可直接尝试 Swarm 模式的相关功能。假定分别准备两个 Linux 主机,作为管理节点(实际上也同时具备 作节点功能)和工作节点。
下面来演示 Swarm 集群的主要操作,包括:
- swarm init : 在管理节点上 建一个集群;
- node list : 列出集群中的节点信息;
- swarm join 加入一个新的节点到已有集群中;
- swarm update : 更新一个 Swar 集群;
- swarm leave : 离开 Swarm 集群
此外,还可以使用 docker service 命令部署 Docker 应用服务到集群中;
1.创建集群
[root@ken1 ~]# docker swarm init --advertise-addr 192.168.64.4
Swarm initialized: current node (70k014efwg9fiwsy8x83qm5g2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0uunq2g8r48b2bm47b9x5xqmkhmzesoi9grwjroh4y3w5q9yek-5jalfma30b0bx36lyxs09ppw8 192.168.64.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意返回的 token 串,这是集群的唯 id 加人集群的各个节点将需要这个信息。另外,默认的管理服务端口为 2377 ,需要能被工作节点访问到;另外,为了支持集群的成员发现和外部服务映射,还需要再所有节点上开启 7946 TCP/UDP 端口和 4789 UDP 端口。
2.查看集群信息
[root@ken1 ~]# docker info
...
Swarm: active
NodeID: 70k014efwg9fiwsy8x83qm5g2
Is Manager: true
ClusterID: l7dgzb3ec2uwcpimjktv5gs33
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
...
还可以查看集群中已经加入的节点情况,此时只有 个管理节点:
[root@ken1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
70k014efwg9fiwsy8x83qm5g2 * ken1 Ready Active Leader 19.03.2
3.加入集群
在所有要加入集群的普通节点上面执行 warm joi 口命令,表示把这台机器加入指定集群当中,例如,在工作节点上,将其加入刚创建的集群, 则可以通过:
[root@ken2 ~]# docker swarm join --token SWMTKN-1-0uunq2g8r48b2bm47b9x5xqmkhmzesoi9grwjroh4y3w5q9yek-5jalfma30b0bx36lyxs09ppw8 192.168.64.4:2377
This node joined a swarm as a worker.
此时,在管理节点上再次查看集群中节点情况,可以看到新加入的工作节点:
[root@ken1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
70k014efwg9fiwsy8x83qm5g2 * ken1 Ready Active Leader 19.03.2
2uah6pnxtntaim4kfyzal5enn ken2 Ready Active 19.03.2
4.使用集群服务
那么,怎么使用 Swarm 提供的服务呢?
实际上有两种方法,一种是使用 Docker 原来的客户端命令,只要指定使用 Swarm manager 务的监昕地址即可 例如, manager 服务监听的地址为 manager ip:2377 ,则可以通过指定–<manager ip >:2377 选项来继续使用 Docker 客户端,执行任意 Docker 命令,例如 ps、info、run等
另外一种方法,也是推荐的做法,是使用新的 docker ervice 命令,可以获得包括多主机网络等更高级的特性支持。
建好 Swarm 集群后,可以在管理节点上执行如下命令来快速创建一个应用服务,并制定服务的复制份数为2, 如下命令所示,默认会自动检查确认服务状态都正常:
[root@ken1 ~]# docker service create --replicas 2 --name busybox1 busybox sleep 5000
xojgs96mpw17tgowr445t82p5
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
1.查看服务
此时使用 service ls 查看集群中服务情况,会发现新创建的busybox1服务;
[root@ken1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xojgs96mpw17 busybox1 replicated 2/2 busybox:latest
还可通过service inspect 命令来查看服务的具体信息:
[root@ken1 ~]# docker inspect busybox1
[
{
"ID": "xojgs96mpw17tgowr445t82p5",
"Version": {
"Index": 16
},
"CreatedAt": "2019-09-17T14:46:57.080074484Z",
"UpdatedAt": "2019-09-17T14:46:57.080074484Z",
"Spec": {
"Name": "busybox1",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "busybox:latest@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e",
"Args": [
"sleep",
"5000"
],
"Init": false,
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {
"Platforms": [
{
"Architecture": "amd64",
"OS": "linux"
},
{
"OS": "linux"
},
{
"OS": "linux"
},
{
"OS": "linux"
},
{
"Architecture": "arm64",
"OS": "linux"
},
{
"Architecture": "386",
"OS": "linux"
},
{
"Architecture": "ppc64le",
"OS": "linux"
},
{
"Architecture": "s390x",
"OS": "linux"
}
]
},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 2
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip"
}
},
"Endpoint": {
"Spec": {}
}
}
]
同时 ,管理节点和工作节点上都运行了一个容器
[root@ken1 ~]# docker service ps busybox1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
sbintlu2r2xv busybox1.1 busybox:latest ken2 Running Running 2 minutes ago
fantjwn1sx5h busybox1.2 busybox:latest ken1 Running Running 2 minutes ago
2.扩展服务
用户还可以通过 docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>命令来对服务进行伸缩, 例如将服务复制个数从 改为 1:
[root@ken1 ~]# docker service scale busybox1=1
busybox1 scaled to 1
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
查看服务
[root@ken1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xojgs96mpw17 busybox1 replicated 1/1 busybox:latest
3.删除服务
服务使用完成后可以通过 docker service rm <SERVICE-ID> 命令来进行删除,服务命令更多的参数可以通过 docker service help 进行查看
[root@ken1 ~]# docker service rm busybox1
busybox1
[root@ken1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
4.使用外部服务地址
Swarm 通过路由机制支持服务对外映射到指定端口,该端口可 以在集群中任意节点上进行访问,即使该节点上没有运行服务实例 需要在创建服务时使用–publish 参数:
[root@ken1 ~]# docker service create --name nginx --publish published=80,target=80 nginx
fwbclecrj9es6yu64ttflb7fa
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
查看服务
[root@ken1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
s49uxbq8gxix nginx.1 nginx:latest ken1 Running Running 47 seconds ago
可以发现在ken1节点和ken2节点都开启了80端口,在浏览器可以指定任意一个节点IP都可以访问。
ken1节点
[root@ken1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::2377 :::*
LISTEN 0 128 :::7946 :::*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
ken2节点
[root@ken2 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::7946 :::*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
之后,用户访问集群中任意节点的,都会被 Swarm 的负载均衡器代理到对应的服务实例。用户也可以配置独立的负载均衡服务,后端指向集群中各个节点对应的外部端口,获取高可用特性。
5.离开集群
节点可以在任何时候通过 warm leave 命令离开一个集群 命令格式为 docker swarm leave [OPT ONS ], 支持-f ,–force意味着强制离开集群.
使用服务命令
Swarm 提供了对应用服务的良好的支持,使用 Swarm 集群可以充分满足应用服务可扩展、高可用的需求。 Docker 通过 servic 命令来管理应用服务,主要包括 create,inspect,logs,ls,ps,rm,rollback scale,update 等若干子命令
总结
用户可以将若Docker 主机节点组成的集群当作一个大的虚拟 Docker 主机使用,并且,原先基于单机的Docker 应用,可以无缝地迁移到 Swarm 上来。通过使用服务, Swarm 集群可以支持多个应
用构建的复杂业务,并很容易对其进行升级等操作。在生产环境中, Swarm 管理节点要考虑高可用性和安全保护,一方面多个管理节点应该分配到不同的容灾区域,另一方面服务节点应该配合数字证书等手段限制访问。Swarm 功能已 经被无缝嵌入到了 Docker 1.12+版本中,用户今后可 直接使用 Docker命令来完成相关功能 配置,对 Swarm 集群的管理更加简便.