11、副本数量模式(replicated mode 和 global mode)
Swarm 可以在 Service 创建和运行过程中灵活的通过 --replicas 调整容器副本数量,内部调度器则会根据当前集群的资源使用情况在不同的node 上启停容器,这就是 Service 默认的 replicated mode 。在此模式下,node 上运行的副本数有多有少,一般情况下,资源更丰富的node 运行的副本数更多,反之亦然。
除了 replicated mode ,Service 还提供了一个 global mode ,其作用是强制在每个node上都运行一个且最多一个副本。
global mode 特别适合需要运行daemon 的集群环境。比如要收集所有容器的日志,就可以用 global mode 创建 Service,在所有 node 上都运行 gliderlabs/logspout 容器,及时之后有新的node加入,swarm 也会自动在新的node上启动一个 gliderlabs/logspout 副本
[root@swarm-manager ~]# docker service create --mode global --name bbox busybox sleep 99999
5qamycgjpsivklii7omh4wgq8
overall progress: 2 out of 2 tasks
l9usnqu08wnq: running [==================================================>]
su6as9kbp9od: running [==================================================>]
verify: Service converged
[root@swarm-manager ~]#
[root@swarm-manager ~]# docker service ps bbox
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ygwk31ee5cek bbox.su6as9kbp9odmbemdasjgvsd1 busybox:latest swarm-worker2 Running Running 40 seconds ago
kswnk367tpyu bbox.l9usnqu08wnqrejs6v3a3c9j7 busybox:latest swarm-worker1 Running Running 40 seconds ago
[root@swarm-manager ~]#
例如swarm-manager是Drain 状态 通过docker node update swarm-manager --availability active GLobal会在swarm-manager创建副本,global模式会在每台机器上创建副本
可以通过 docker service inspect
查看 service 的 mode。
[root@swarm-manager ~]# docker service inspect bbox --pretty
ID: 5qamycgjpsivklii7omh4wgq8
Name: bbox
Service Mode: Global
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: busybox:latest@sha256:836945da1f3afe2cfff376d379852bbb82e0237cb2925d53a13f53d6e8a8c48c
Args: sleep 99999
Init: false
Resources:
Endpoint Mode: vip
[root@swarm-manager ~]#
Service Mode: Global
这里是 Global
,如果创建 service 时不指定,默认是 Replicated
。
12、Label 控制 Service 的位置
使用 label能精细控制 Service 的运行位置呢
逻辑分两步:
1、为每个 node 定义 label。
2、设置 service 运行在指定 label 的 node 上。label 可以灵活描述 node 的属性,其形式是 key=value,用户可以任意指定,
例如将 swarm-worker1 作为测试环境,为其添加 label env=test:
swarm-worker1标记为测试环境,swarm-worker2标记为线上环境
swarm-worker1
[root@swarm-manager ~]# docker node update --label-add env=test swarm-worker1
swarm-worker1
[root@swarm-manager ~]# docker node inspect swarm-worker1 --pretty
ID: l9usnqu08wnqrejs6v3a3c9j7
Labels:
- env=test
Hostname: swarm-worker1
Joined at: 2020-05-12 06:57:51.232356307 +0000 utc
Status:
State: Ready
Availability: Active