赞
踩
当访问任何节点上的端口8080时,Docker将请求路由到活动容器。在群节点本身,端口8080可能并不实际绑定,但路由网格知道如何路由流量,并防止任何端口冲突的发生。
路由网格在发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。
创建三个节点的swarm集群
角色 | IP |
---|---|
swarm-manager | 192.168.2.5 |
swarm-worker1 | 192.168.2.6 |
swarm-worker2 | 192.168.2.7 |
修改主机名
[root@localhost ~]# hostnamectl set-hostname swarm-manager
添加主机名解析
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.5 swarm-manager
192.168.2.6 swarm-worker1
192.168.2.7 swarm-worker2
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
关闭防火墙或开放端口
# 查看firewalld防火墙状态 systemctl status firewalld # 查看所有打开的端口 firewall-cmd --zone=public --list-ports # 防火墙开放端口(更新firewalld防火墙规则后生效) firewall-cmd --zone=public --add-port=要开放的端口/tcp --permanent # 选项: –zone # 作用域 –add-port=80/tcp # 添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效 # 示例: firewall-cmd --zone=public --add-port=3306/tcp --permanent # firewalld防火墙关闭接口(更新firewalld防火墙规则后生效) firewall-cmd --zone=public --remove-port=要关闭的端口/tcp --permanent # 更新firewalld防火墙规则(并不中断用户连接,即不丢失状态信息) firewall-cmd --reload # 启动firewalld防火墙 systemctl start firewalld # 关闭firewalld防火墙: systemctl stop firewalld # 开机禁用firewalld防火墙 systemctl disable firewalld # 开机启用firewalld防火墙 systemctl enable firewalld
1.查看当前任意一台主机的swarm状态
[root@swarm-manager ~]# docker info -f '{{.Swarm}}'
{ inactive false [] 0 0 <nil> []}
当前状态为暂停
2.将swarm开启
[root@swarm-manager ~]# docker swarm init
Swarm initialized: current node (lq6vktglarbu60urm25tqn1ub) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5cs1bpgjxzm1v5xli77spz0ghqwne7shnz87pixwesplau9vsb-4pt0w6tmvz5vl1naqx9duc7yx 192.168.2.5:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
翻译:
群初始化:当前节点(lq6vktglarbu60urm25tqn1ub)现在是一个管理器。
要向集群中添加一个工作节点,运行以下命令:
docker swarm join——token swmtkn -1- 5cs1bpgjxzm1v5xli77spz0ghqwne7shnz87pixwesplau9vb -4pt0w6tmvz5vl1naqx9duc7yx 192.168.2.5:2377
要向集群中添加管理器,请运行` docker swarm join-token manager `并按照说明操作。
查看状态
[root@swarm-manager ~]# docker info -f '{{.Swarm}}'
{lq6vktglarbu60urm25tqn1ub 192.168.2.5 active true [{lq6vktglarbu60urm25tqn1ub 192.168.2.5:2377}] 1 1 0xc0005146e0 []}
3.将其他两台worker添加为工作节点
[root@swarm-worker1 ~]# docker swarm join --token SWMTKN-1-5cs1bpgjxzm1v5xli77spz0ghqwne7shnz87pixwesplau9vsb-4pt0w6tmvz5vl1naqx9duc7yx 192.168.2.5:2377
This node joined a swarm as a worker.
4.从控制节点查看
[root@swarm-manager ~]# docker info Swarm: active #当前状态活跃 NodeID: lq6vktglarbu60urm25tqn1ub Is Manager: true ClusterID: pmekmmvdxq2k7sdq4rxr9s5dn Managers: 1 #计算节点 Nodes: 3 #工作节点 Default Address Pool: 10.0.0.0/8 #默认地址池 SubnetSize: 24 Data Path Port: 4789 #数据通路端口 Orchestration: Task History Retention Limit: 5 #任务历史记录保留限制 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 10 Dispatcher: Heartbeat Period: 5 seconds #心跳周期 CA Configuration: Expiry Duration: 3 months Force Rotate: 0 Autolock Managers: false Root Rotation In Progress: false Node Address: 192.168.2.5 #节点地址 Manager Addresses: 192.168.2.5:2377 #控制节点地址
查看节点
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lq6vktglarbu60urm25tqn1ub * swarm-manager Ready Active Leader 24.0.2
wxvvriqekwwfd46476752a818 swarm-worker1 Ready Active 20.10.24
0c49ooh7er8zjthhdpvw6qx8r swarm-worker2 Ready Active 20.10.24
ID:节点ID
hostname:主机名
status:状态
availability:可用性
manager status:控制节点状态(leader首领,Reachable达状态)
engine version:docker 版本
部署可视化docker swarm平台
docker run -d --name myui -e HOST=192.168.3.10 -e PORT=8080 -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
1.将worker提升为manager
[root@swarm-manager ~]# docker node promote wxvvriqekwwfd46476752a818
Node wxvvriqekwwfd46476752a818 promoted to a manager in the swarm.
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lq6vktglarbu60urm25tqn1ub * swarm-manager Ready Active Leader 24.0.2
wxvvriqekwwfd46476752a818 swarm-worker1 Ready Active Reachable 20.10.24
0c49ooh7er8zjthhdpvw6qx8r swarm-worker2 Ready Active 20.10.24
2.将manager降级为worker
[root@swarm-manager ~]# docker node demote wxvvriqekwwfd46476752a818
Manager wxvvriqekwwfd46476752a818 demoted in the swarm.
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lq6vktglarbu60urm25tqn1ub * swarm-manager Ready Active Leader 24.0.2
wxvvriqekwwfd46476752a818 swarm-worker1 Ready Active 20.10.24
0c49ooh7er8zjthhdpvw6qx8r swarm-worker2 Ready Active 20.10.24
1.启动busybox
[root@swarm-manager ~]# docker service create --name server 192.168.2.7:5000/busybox sleep 99999999
ou5b2c1y0x0cpfq1fhjyyylfw
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
2.查看当前swarm中的service
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ou5b2c1y0x0c server replicated 1/1 192.168.2.7:5000/busybox:latest
3.查看当前service中的任务
[root@swarm-manager ~]# docker service ps server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qdsui6stwa30 server.1 192.168.2.7:5000/busybox:latest swarm-worker2 Running Running about a minute ago
上⼀节部署了只有⼀个副本的 Service,不过对于 web 服务,我们通常会运⾏多个实例。这样可以负载 均衡,同时也能提供⾼可⽤。
[root@swarm-manager ~]# docker service scale server=5 server 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 converged [root@swarm-manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ou5b2c1y0x0c server replicated 5/5 192.168.2.7:5000/busybox:latest [root@swarm-manager ~]# docker service ps server ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS qdsui6stwa30 server.1 192.168.2.7:5000/busybox:latest swarm-worker2 Running Running 3 hours ago hjh9lt9pb7lo server.2 192.168.2.7:5000/busybox:latest swarm-manager Running Running 24 seconds ago p8drzio7um64 server.3 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 24 seconds ago kj5oiavoj6eq server.4 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 24 seconds ago xndqh90i3q8z server.5 192.168.2.7:5000/busybox:latest swarm-worker2 Running Running 24 seconds ago
swarm-manager 上的副本 web_server.2 已经被 Shutdown 了,为了达到 5 个副本数的⽬标.
[root@swarm-manager ~]# docker service ps server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qdsui6stwa30 server.1 192.168.2.7:5000/busybox:latest swarm-worker2 Running Running 3 hours ago
2x0v0jp196n7 server.2 192.168.2.7:5000/busybox:latest swarm-manager Running Running 36 seconds ago
hjh9lt9pb7lo \_ server.2 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 41 seconds ago "task: non-zero exit (137)"
p8drzio7um64 server.3 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 10 minutes ago
0e5acarc93nw server.4 192.168.2.7:5000/busybox:latest swarm-manager Running Running 17 seconds ago
itoqthypjbn5 \_ server.4 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 22 seconds ago "task: non-zero exit (137)"
vitawq6ny2dq \_ server.4 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 57 seconds ago "task: non-zero exit (137)"
nwc6b2tmz8xq server.5 192.168.2.7:5000/busybox:latest swarm-worker2 Running Running about a minute ago
我们还可以减少副本(docker service scale server=3)
故障是在所难免的,容器可能崩溃,Docker Host 可能宕机,不过幸运的是,Swarm 已经内置了 failover 策略。 创建 service 的时候,我们没有告诉 swarm 发⽣故障时该如何处理,只是说明了我们期望的状态(⽐如 运⾏3个副本),swarm 会尽最⼤的努⼒达成这个期望状态,⽆论发⽣什么状况。 以上⼀节我们部署的 Service 为例,当前 3 个副本分布在 swarm-worker1 和 swarm-worker2 上。 现在我们测试 swarm 的 failover 特性,关闭 swarm-worker1。
Swarm 会检测到 swarm-worker1 的故障,并标记为 Down
Swarm 会将 swarm-worker1 上的副本调度到其他可⽤节点。我们可以通过 docker service ps 观察这 个 failover 过程
可以看到,web_server.1 和 web_server.2 已经从 swarm-worker1 迁移到了 swarm-worker2,之前运 ⾏在故障节点 swarm-worker1 上的副本状态被标记为 Shutdown
[root@swarm-manager ~]# docker service ps server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lx5x38ggwg2q server.1 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 24 seconds ago
qdsui6stwa30 \_ server.1 192.168.2.7:5000/busybox:latest swarm-worker2 Shutdown Running 3 hours ago
2x0v0jp196n7 server.2 192.168.2.7:5000/busybox:latest swarm-manager Running Running 5 minutes ago
hjh9lt9pb7lo \_ server.2 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 5 minutes ago "task: non-zero exit (137)"
p8drzio7um64 server.3 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 15 minutes ago
0e5acarc93nw server.4 192.168.2.7:5000/busybox:latest swarm-manager Running Running 4 minutes ago
itoqthypjbn5 \_ server.4 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 5 minutes ago "task: non-zero exit (137)"
vitawq6ny2dq \_ server.4 192.168.2.7:5000/busybox:latest swarm-manager Shutdown Failed 5 minutes ago "task: non-zero exit (137)"
aji7iovuwcms server.5 192.168.2.7:5000/busybox:latest swarm-worker1 Running Running 23 seconds ago
nwc6b2tmz8xq \_ server.5 192.168.2.7:5000/busybox:latest swarm-worker2 Shutdown Running 6 minutes ago
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ou5b2c1y0x0c server replicated 7/5 192.168.2.7:5000/busybox:latest
创建三台web服务器,然后更新开放端口
[root@swarm-manager ~]# docker service create --name web-cluster --replicas=3 192.168.2.7:5000/nginx
mhh01eix50toq0siun8lovx3u
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
mhh01eix50to web-cluster replicated 3/3 192.168.2.7:5000/nginx:latest
[root@swarm-manager ~]# docker service ps web-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jvqpztz5h3h2 web-cluster.1 192.168.2.7:5000/nginx:latest swarm-manager Running Running about a minute ago
qoto1v5ygnq8 web-cluster.2 192.168.2.7:5000/nginx:latest swarm-worker1 Running Running about a minute ago
no0edfd5dlag web-cluster.3 192.168.2.7:5000/nginx:latest swarm-worker2 Running Running 59 seconds ago
更新开放端口
[root@swarm-manager ~]# docker service update --publish-add 81:80 web-cluster
web-cluster
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
测试
[root@swarm-manager ~]# curl 192.168.2.5:81 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
服务发现
一种实现方式是将所有service都pushlish出去,然后通过routing mesh访问。但明显的缺点是把memcached和MySQL也暴露到外网。增加了安全隐患。
如果不publish,那么swarm就要提供一种机制,能够:
创建overlay网络
默认swarm自带了一种swarm网络,但是不能直接使用,因为目前ingress没有提供服务发现,必须创建自己的overlay网络
[root@swarm-manager ~]# docker network create -d overlay my_net
sxtupj84xfw5nmfgy3gtvdstn
[root@swarm-manager ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
43a8a43b0cb2 bridge bridge local
5ca5d03db71f docker_gwbridge bridge local
c598e7da9321 host host local
iplndsmyf02j ingress overlay swarm
sxtupj84xfw5 my_net overlay swarm
7dbddfe02b0b nginxcompose_default bridge local
36391f761fe6 none null local
下面我们将部署三副本的服务,镜像使用nginx1.21,然后镜像更新到nginx1.24
[root@swarm-manager ~]# docker service create --name my_web --replicas=3 192.168.2.7:5000/nginx
iwh72vw062be9q0wn59dtwb6u
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
进行滚动更新
[root@swarm-manager ~]# docker service update --image 192.168.2.7:5000/nginx:1.24 my_web
my_web
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
swarm将按照如下步骤执行滚动更新
将容器版本进行回滚
[root@swarm-manager ~]# docker service update --rollback my_web my_web rollback: manually requested rollback **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。** ![img](https://img-blog.csdnimg.cn/img_convert/136acaf23b4f5d5032ce14ccfaf4c879.png) ![img](https://img-blog.csdnimg.cn/img_convert/24f4600b695f4a21b05f345b9cc90a2d.png) ![img](https://img-blog.csdnimg.cn/img_convert/2478212993a99b01cea036ceb6a36aa2.png) ![img](https://img-blog.csdnimg.cn/img_convert/f3d003d43c451d8940700dcf712f87d8.png) ![img](https://img-blog.csdnimg.cn/img_convert/67f246fee462912370a27054bac937b6.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)** ![img](https://img-blog.csdnimg.cn/img_convert/a0e2ab1a305099387bb42a40d4df3cb3.jpeg) 碰到天花板技术停滞不前!** **因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。** [外链图片转存中...(img-lJO8ymOV-1712877755853)] [外链图片转存中...(img-1gNoE5Du-1712877755853)] [外链图片转存中...(img-NL2fEGot-1712877755854)] [外链图片转存中...(img-vOPpCSoD-1712877755854)] [外链图片转存中...(img-Do3MHiq3-1712877755854)] **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)** [外链图片转存中...(img-oh45Ppcz-1712877755854)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。