集群抽象工具Swarm
在Docker应用越来越深入的今天,把调度粒度停留在单个容器上是非常没有效率的。同样地,在提高对Docker宿主机管理效率和利用率的方向上,集群化管理方式是一个正确的选择。是时候从更高的抽象层次上使用Docker了,Swarm就是将多宿台主机抽象为“一台”的工具。
Swarm简介
目前传统的(没有集群管理工具)
有了Swarm后,使用多台Docker宿主机的方式就变成了图
Swarm最大程度兼容Docker的远程API,目前为止,Swarm已经能够支持95%以上的Docker远程API,这使得所有直接调用Docker远程API的程序能方便地将后端替换为Swarm,这类程序包括Docker官方客户端,以及Fig、Flynn和Deis这类集群化管理使用Docker的工具。
Swarm除了在多台Docker宿主机(或者说多个Docker服务端)上建立一层抽象外,还提供对宿主机资源的分配和管理。Swarm通过在Docker宿主机上添加的标签信息来将宿主机资源进行细粒度分区,通过分区来帮助用户将容器部署到目标宿主机上,同样通过分区方式还能提供更多的资源调度策略扩展。
现阶段Swarm依然处于初期开发过程中,对Docker镜像的操作,以及更复杂的调度策略等方向上,还没有形成Production Ready的实现,因此本书对Swarm使用只体现在几个核心功能上。对于一个Swarm集群,集群内节点分成Swarm Agent和Swarm Manager两类。Agent节点运行Docker服务端,Docker Release的版本需要保证一致,且为1.4.0或更新的版本。Manager节点负责与所有Agent上的Docker宿主机通信以及对外提供Docker远程API服务,因此Manager需要能获取到所有Agent地址。实现方式可以是让所有Agent到网络上的某个位置注册,Manager到相同的地址获取最新的信息,这样Agent节点的活动就可以被实时侦测;也可以是事先将所有Agent的信息写在Manager节点的一个本地文件中,但这种实现无法再动态地为集群增加Agent节点。
Swarm 实战
-
获取swarm镜像
sudo docker pull swarm
-
初始化swarm,搭建单机版swarm环境
sudo docker swarm init
如果要集成集群环境[root@iZuf6bm702o3rrjlhq9xt5Z ~]# docker swarm init --advertise-addr 172.29.227.255 Swarm initialized: current node (k7uveh6ie7dkl19nef8770d6k) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5whmzfu54ttj6n24llboq0vppp0v1j2u9weqoob5yjt9hx4jie- bmab0o7f7ur2i99dhbvux6923 172.29.227.255:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
当swarm创建成功之后会生成一个token SWMTKN-1-5whmzfu54ttj6n24llboq0vppp0v1j2u9weqoob5yjt9hx4jie- bmab0o7f7ur2i99dhbvux6923 172.29.227.255:2377
-
查看当前集群信息
sudo docker info
[root@iZuf6bm702o3rrjlhq9xt5Z ~]# docker info Client: Context: default Debug Mode: false Plugins: app: Docker App (Docker Inc., v0.9.1-beta3) buildx: Docker Buildx (Docker Inc., v0.8.2-docker) scan: Docker Scan (Docker Inc., v0.17.0) Server: Containers: 10 Running: 0 Paused: 0 Stopped: 10 Images: 4 Server Version: 20.10.17 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: false userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: active NodeID: k7uveh6ie7dkl19nef8770d6k Is Manager: true ClusterID: 5iwn6asj14aqwv6qrgb8ip4c3 Managers: 1 Nodes: 1 Default Address Pool: 10.0.0.0/8 SubnetSize: 24 Data Path Port: 4789 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000
此处可以看到有clinet,server,swarm等节点key, swarm的状态是active
-
查看当前swarm成员结点
sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION k7uveh6ie7dkl19nef8770d6k * iZuf6bm702o3rrjlhq9xt5Z Ready Active Leader 20.10.17
-
新建一个service,命名为:redis_test
sudo docker service create --replicas=3 --name redis_test redis
此处备注一下,service对应的镜像不需要在子node能够访问,否则无法通过swarm创建子service在子节点上
Swarm: active NodeID: p8sdseus4dpawefr6gl0ntbet Is Manager: false Node Address: 172.18.137.47 Manager Addresses: 114.55.103.145:2377 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
查看的docker通过swarm生成的节点service可以看到此节点非manager,
[root@iZuf6bm702o3rrjlhq9xt5Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f47da9f4c95f redis:latest "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 6379/tcp redis_test.1.jxzreea5b03rm430cihc9qrq0 e62e383ebed0 redis:latest "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 6379/tcp redis_test.2.x62bus9qk2c94ss6muh8kmsno
然后去manager上面看下
[root@iZbp102fxl8duhse0avs3mZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 79918571215d redis:latest "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 6379/tcp redis_test.3.r2py3vct0wpc2cwj5tytt2xbp 8cd8fade4be9 composetest_web:latest "flask run" 13 minutes ago Up 13 minutes composetest_webtest.3.aap09uztkitpg6547yixsf6fs 90f44bcbbcb7 composetest_web:latest "flask run" 13 minutes ago Up 13 minutes composetest_webtest.2.gjm3n4cgvgg4frpvp9654sj55 cdba2e03d2cd composetest_web:latest "flask run" 13 minutes ago Up 13 minutes composetest_webtest.1.re4pwp1t3fnevst3z4rqsjcdr 6b852f2b68b3 composetest_web "flask run" 5 days ago Up 5 days 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp composetest-web-1 73ae66443764 redis "docker-entrypoint.s…" 5 days ago Up 5 days 6379/tcp composetest-redis-1 9b651b43076f haproxy "docker-entrypoint.s…" 5 weeks ago Up 5 weeks 0.0.0.0:6301->6301/tcp, :::6301->6301/tcp Haproxy 0e206ce34569 django "/bin/bash" 6 weeks ago Up 5 weeks App2 ce9aa6740771 django "/bin/bash" 6 weeks ago Up 5 weeks App1 ee95a0ae7e5f redis "docker-entrypoint.s…" 6 weeks ago Up 6 weeks 6379/tcp redis-slave2 0df99da2ff2e redis "docker-entrypoint.s…" 6 weeks ago Up 6 weeks 6379/tcp redis-slave1 790681bc9bcf redis "docker-entrypoint.s…" 6 weeks ago Up 5 weeks 6379/tcp redis-master
可以看到manager上有一个redis_test服务,我们也可以通过的dorcker service ls 查看service 总揽
[root@iZbp102fxl8duhse0avs3mZ ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS uerxnt8m9wyj composetest_webtest replicated 3/3 composetest_web:latest kto59vvjj0sr redis_test replicated 3/3 redis:latest
-