- 概念
- AVAILABILITY 的三种状态 可用性
- MANAGER STATUS 的三种状态
- 操作命令
- docker node update --availability 修改节点可用性
- docker swarm leave 节点离开集群
- docker node rm 删除节点
- docker node promote/demote 升级降级节点
- docker service create 部署服务到集群
- 动态扩容两种方式
- docker service ps 查看服务部署情况
- docker service rm 删除服务
- docker service ps 查看服务部署情况
- docker service inspect 查看具体服务信息
- docker service update 滚动升级
- docker info 集群信息
- 上机实验
- 初始化
- Raft协议
- 将两个work节点docker服务停止
- docker info信息
- 服务在提交之后不会发生动态调整
Docker 集群化部署
Docker sworm 工作机制 - 官网链接
概念的总结
swarm
集群的管理和编号,docker可以初始化一个swarm集群,其他结点可以加入。(管理,工作者)
Node
就是一个docker结点,多个结点就组成了一个网络集群(管理、工作者)
Service
任务,可以在管理结点或者工作结点来运行。核心,用户访问。
Task
容器内的命令、细节任务!
AVAILABILITY 的三种状态 可用性service
- Active:调度器能够安排任务到该节点
- Pause:调度器不能够安排任务到该节点,但是已经存在的任务会继续运行
- Drain:调度器不能够安排任务到该节点,而且会停止已存在的任务,并将这些任务分配到其他 Active 状态的节点
- Leader:为群体做出所有群管理和编排决策的主要管理者节点
- Reachable:如果 Leader 节点变为不可用,该节点有资格被选举为新的 Leader
- Unavailable:该节点不能和其他 Manager 节点产生任何联系,这种情况下,应该添加一个新的 Manager 节点到集群,或者将一个 Worker 节点提升为 Manager 节点
升级降级
[升级] docker node promote WorkerA [降级] docker node demote WorkerA操作命令 docker node update --availability 修改节点可用性
- 使node不可调度:
docker node update --availability drain
- 停止node:
docker node update --availability pause
- 使node可调度:
docker node update --availability activedocker swarm leave 节点离开集群
- 使当前work节点离开集群:
[root@iZ2zeeea01dfr0ijz61q5bZ ~]# docker swarm leave Node left the swarm.
- leader/Reachable节点离开集群
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker swarm leave Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing this node leaves 1 managers out of 2. Without a Raft quorum your swarm will be inaccessible. The only way to restore a swarm that has lost consensus is to reinitialize it with `--force-new-cluster`. Use `--force` to suppress this message.
- 为了删除leader或者Reachable节点我们可以先进行降级为Work节点之后进行离开集群
[升级] docker node promote WorkerA [降级] docker node demote WorkerAdocker node rm 删除节点
- 删除node:
docker node rm
删除节点
-f可以删除运行的工作节点,但是不能是主节点
docker node promote/demote 升级降级节点[升级] docker node promote WorkerA [降级] docker node demote WorkerAdocker service create 部署服务到集群
docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
运行了三个nginx服务,被分配给了三个容器
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service create -p 8080:80 --replicas 3 --name my-nginx nginx nb0p3u573jvu8wcfruhp04ri6 overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged
每个服务器查询容器状况
[root@iZ2zeeea01dfr0ijz61q5bZ ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ce1bc85f035 nginx:latest "/docker-entrypoint.…" 44 seconds ago Up 43 seconds 80/tcp my-nginx.1.s0q9r0qhb1yajsel1i20tdlum [root@iZ2zeeea01dfr0ijz61q5aZ ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ca14540ba74 nginx:latest "/docker-entrypoint.…" 48 seconds ago Up 46 seconds 80/tcp my-nginx.3.y9ddyamakd7411sgvhyl24nw2 [root@iZ2zeeea01dfr0ijz61q59Z ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7baa823ebdc7 nginx:latest "/docker-entrypoint.…" about a minute ago Up 59 seconds 80/tcp my-nginx.2.wzp7a77pu4f2lu9fk38yme2ni #5cZ是没有的 [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES动态扩容两种方式
docker service scale my-nginx=5 docker service update --replicas 10 my-nginx
- 方式一:
docker service update --replicas 10 my-nginx
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service update --replicas 10 my-nginx my-nginx overall progress: 10 out of 10 tasks 1/10: running [==================================================>] 2/10: running [==================================================>] 3/10: running [==================================================>] 4/10: running [==================================================>] 5/10: running [==================================================>] 6/10: running [==================================================>] 7/10: running [==================================================>] 8/10: running [==================================================>] 9/10: running [==================================================>] 10/10: running [==================================================>] verify: Service converged
- 方式二:
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service scale my-nginx=5 my-nginx scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service convergeddocker service ps 查看服务部署情况
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service ps my-nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS s0q9r0qhb1ya my-nginx.1 nginx:latest iZ2zeeea01dfr0ijz61q5bZ Running Running 14 minutes ago wzp7a77pu4f2 my-nginx.2 nginx:latest iZ2zeeea01dfr0ijz61q59Z Running Running 14 minutes ago y9ddyamakd74 my-nginx.3 nginx:latest iZ2zeeea01dfr0ijz61q5aZ Running Running 14 minutes ago 2hha260nxh18 my-nginx.4 nginx:latest iZ2zeeea01dfr0ijz61q59Z Running Running 12 minutes ago 0e59envs0g56 my-nginx.5 nginx:latest iZ2zeeea01dfr0ijz61q5aZ Running Running 12 minutes agodocker service rm 删除服务
docker service rm 服务名docker service ps 查看服务部署情况
docker service ps 服务名
可以看到服务运行在那些节点上
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service ps my-nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS mz83alfde7y7 my-nginx.1 nginx:latest iZ2zeeea01dfr0ijz61q5cZ Running Running 40 minutes ago s0q9r0qhb1ya _ my-nginx.1 nginx:latest ngzsop9kuocrkdpju6jutrl3z Shutdown Orphaned 26 minutes ago y3ljuqzhijw3 my-nginx.2 nginx:latest iZ2zeeea01dfr0ijz61q5cZ Running Running 23 minutes ago wzp7a77pu4f2 _ my-nginx.2 nginx:latest zpne79i1zbcwpanm3u7k0y3d2 Shutdown Orphaned 23 minutes ago 6tkpmlga1v54 my-nginx.3 nginx:latest iZ2zeeea01dfr0ijz61q5cZ Running Running 23 minutes ago k6amvh9r6bme _ my-nginx.3 nginx:latest zpne79i1zbcwpanm3u7k0y3d2 Shutdown Orphaned 23 minutes ago y9ddyamakd74 _ my-nginx.3 nginx:latest iZ2zeeea01dfr0ijz61q5aZ Shutdown Shutdown 24 minutes ago o8i4cdjizfa1 my-nginx.4 nginx:latest iZ2zeeea01dfr0ijz61q5cZ Running Running 23 minutes ago 2hha260nxh18 _ my-nginx.4 nginx:latest zpne79i1zbcwpanm3u7k0y3d2 Shutdown Orphaned 23 minutes ago n99wzzkkg2go my-nginx.5 nginx:latest iZ2zeeea01dfr0ijz61q5cZ Running Running 24 minutes ago 0e59envs0g56 _ my-nginx.5 nginx:latest iZ2zeeea01dfr0ijz61q5aZ Shutdown Shutdown 24 minutes agodocker service inspect 查看具体服务信息
docker service inspect 服务名
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service inspect --pretty my-nginx ID: nb0p3u573jvu8wcfruhp04ri6 Name: my-nginx Service Mode: Replicated Replicas: 5 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: nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 Init: false Resources: Endpoint Mode: vip Ports: PublishedPort = 8080 Protocol = tcp TargetPort = 80 PublishMode = ingressdocker service update 滚动升级
docker service update --image redis:3.0.7 redisdocker info 集群信息
**
可以看出来有三个节点,其中有两个是管理节点。
上机实验 初始化- 使用ip addr查看本机ip
- 初始化集群 作为管理节点
docker swarm init --advertise-addr 172.30.160.92 #这里的 IP 为创建机器时分配的 内网ip。Raft协议
双主双从:假设一个结点挂了!其他结点是否可以用!
Raft协议:保证大多数结点存活才可以使用,只要>1, 集群至少大于3台!
- 通过这两个命令生成token后去其他节点中运行从而加入集群
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6b2hs9v3lc73pv4xn7dyv0gqi4ljo6ucfgm0s3ag6hhdp20gxm-dwtnhhk2fa87b4jd9e5mkfcca 172.30.160.92:2377
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6b2hs9v3lc73pv4xn7dyv0gqi4ljo6ucfgm0s3ag6hhdp20gxm-4latyoz0e4lnnfnpqm7wjsrqr 172.30.160.92:2377
- 初始状态是在5cZ初始化docker swarm init的因此它为leader节点并且将其他节点加入构成两主两从的结构
[root@iZ2zeeea01dfr0ijz61q5cZ ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION zoj83x7i7xnawhahf0k2959dq iZ2zeeea01dfr0ijz61q5aZ Ready Active 20.10.12 n1px3rqxy59m6hyrjyi58fwj1 iZ2zeeea01dfr0ijz61q5bZ Ready Active 20.10.12 l3wtk8e7ne760cgji7pbovkpb * iZ2zeeea01dfr0ijz61q5cZ Ready Active Leader 20.10.12 zpne79i1zbcwpanm3u7k0y3d2 iZ2zeeea01dfr0ijz61q59Z Ready Active Reachable 20.10.12
- 5cZ为leader,将其手动结束服务,发现因为只剩下一个主节点,因此不能够运行
[root@iZ2zeeea01dfr0ijz61q59Z ~]# docker node ls Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
- 然后5cZ再次启动服务
[root@iZ2zeeea01dfr0ijz61q5cZ /]# systemctl start docker
#启动后5cZ发现59Z成为了Leader就会变成Reachable [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION zoj83x7i7xnawhahf0k2959dq iZ2zeeea01dfr0ijz61q5aZ Ready Active 20.10.12 n1px3rqxy59m6hyrjyi58fwj1 iZ2zeeea01dfr0ijz61q5bZ Ready Active 20.10.12 l3wtk8e7ne760cgji7pbovkpb * iZ2zeeea01dfr0ijz61q5cZ Ready Active Reachable 20.10.12 zpne79i1zbcwpanm3u7k0y3d2 iZ2zeeea01dfr0ijz61q59Z Ready Active Leader 20.10.12将两个work节点docker服务停止
[root@iZ2zeeea01dfr0ijz61q59Z ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION zoj83x7i7xnawhahf0k2959dq iZ2zeeea01dfr0ijz61q5aZ Down Active 20.10.12 n1px3rqxy59m6hyrjyi58fwj1 iZ2zeeea01dfr0ijz61q5bZ Down Active 20.10.12 l3wtk8e7ne760cgji7pbovkpb iZ2zeeea01dfr0ijz61q5cZ Ready Active Reachable 20.10.12 zpne79i1zbcwpanm3u7k0y3d2 * iZ2zeeea01dfr0ijz61q59Z Ready Active Leader 20.10.12
开启一个服务运行了在5cZ上
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service create -p8080:80 --name my-nginx nginx pdksl93bek4zihgijzdyx3biq overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abbf0c8ad7c5 nginx:latest "/docker-entrypoint.…" 20 seconds ago Up 18 seconds 80/tcp my-nginx.1.l6fixew2pq61v66nbvjm0zvlxdocker info信息
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker info Swarm: active NodeID: l3wtk8e7ne760cgji7pbovkpb Is Manager: true ClusterID: 03sd6s9vyk2pu0uozf9rmr47a Managers: 2 Nodes: 4 Default Address Pool: 10.0.0.0/8 SubnetSize: 24 Data Path Port: 4789 Orchestration: Task History Retention Limit: 5服务在提交之后不会发生动态调整
初始状态5cZ的状态为Drain
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION jmd278rks0g4dod7yyzrojg9b iZ2zeeea01dfr0ijz61q5aZ Ready Active Reachable 20.10.12 ngzsop9kuocrkdpju6jutrl3z iZ2zeeea01dfr0ijz61q5bZ Ready Active 20.10.12 l3wtk8e7ne760cgji7pbovkpb * iZ2zeeea01dfr0ijz61q5cZ Ready Drain Leader 20.10.12 zpne79i1zbcwpanm3u7k0y3d2 iZ2zeeea01dfr0ijz61q59Z Ready Active 20.10.12
将其状态修改为Actice
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker node update --availability active l3wtk8e7ne760cgji7pbovkpb l3wtk8e7ne760cgji7pbovkpb [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION jmd278rks0g4dod7yyzrojg9b iZ2zeeea01dfr0ijz61q5aZ Ready Active Reachable 20.10.12 ngzsop9kuocrkdpju6jutrl3z iZ2zeeea01dfr0ijz61q5bZ Ready Active 20.10.12 l3wtk8e7ne760cgji7pbovkpb * iZ2zeeea01dfr0ijz61q5cZ Ready Active Leader 20.10.12 zpne79i1zbcwpanm3u7k0y3d2 iZ2zeeea01dfr0ijz61q59Z Ready Active 20.10.12
但是服务没有流转过来
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
动态扩容之后,倾向于分配在这个节点
[root@iZ2zeeea01dfr0ijz61q5cZ /]# docker service scale redis=7 redis scaled to 7 overall progress: 7 out of 7 tasks 1/7: running [==================================================>] 2/7: running [==================================================>] 3/7: running [==================================================>] 4/7: running [==================================================>] 5/7: running [==================================================>] 6/7: running [==================================================>] 7/7: running [==================================================>] verify: Service converged [root@iZ2zeeea01dfr0ijz61q5cZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa794d38a768 redis:3.0.7 "docker-entrypoint.s…" about a minute ago Up about a minute 6379/tcp redis.7.uiav726vnrajtucshz8ngng8v



