docker swarm 集群
docker swarm 集群
一、环境
docker安装:
sudo apt install docker.io
主机分配:
操作系统 | 主机名 | 主机IP | docker版本 |
debian 12 (bookworm) | fs3(管理节点) | 192.168.1.95 | v20.10.24 |
debian 12 (bookworm) | fs1(工作节点) | 192.168.1.91 | v20.10.24 |
debian 12 (bookworm) | fs0(工作节点) | 192.168.1.92 | v20.10.24 |
开放端口:
2377/tcp:集群管理通信
7946/tcp、7946/udp:集群中各节点之间的通信
4789/udp:overlay网络使用
二、创建集群
2.1 创建管理节点
在管理节点fs3上创建集群,使用命令如下:
sudo docker swarm init --advertise-addr 192.168.1.95
其中--advertise-addr用于配置一个IP地址,集群中其它节点使用此IP地址与管理节点通信,执行命令后输出如下:
# 输出 Swarm initialized: current node (vjs13uolge09ts9xpzm3tx09p) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2.2 将工作节点加入集群
分别在fs1和fs0工作节点上执行下列指令:
sudo docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
如果要加入管理节点,则使用下列指令:
sudo docker swarm join-token manager --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
注意:该token有效期为24小时。如果token已过期,则可以使用一下命令重新获取:
docker swarm join-token worker
可使用docker info 查看当前集群的详细信息
使用docker node ls 查看当前集群中各节点信息:
其中*表示当前位于此节点。
2.3 集群网络
当在管理节点使用docker swarm init初始化一个docker集群时,docker默认会创建两个网络:
- overlay驱动的网络:名称为ingress,该网络用于处理集群中各个服务之间的控制与数据传输(当创建网络服务service时,如果没有指定自定义的overlay网络,则默认使用ingress网络)。
- bridge驱动的网络:名称为docker_gwbridge,该网络用于维护集群中各个节点之间的连接。
可以使用docker network ls查看集群网络
三、集群管理可视化
集群搭建好之后,我们使用portainer实现docker可视化管理界面。
portainer分两种部署模式:单机部署和集群部署
3.1 单机部署
我们可以将portainer部署在docker集群的管理节点中。此时,portainer可以通过管理节点的docker进程实现对docker集群的可视化。具体步骤为:
#在管理节点拉去portainer镜像 docker pull portainer/portainer-ce:latest #启动portainer容器 docker run \ -p 8000:8000 \ -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ --name my-portainer \ -d \ --privileged=true \ --restart=always \ portainer/portainer-ce:latest # --privileged=true用于赋予该容器root权限
当然也可以尝试使用docker-compose编排一个容器。这里不再赘述。
在浏览器中输入https://192.168.1.2:9443,进入portainer环境创建页面。
3.2 集群部署
- 在管理节点下载部署文件
curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml
文件内容如下:
version: '3.2' services: agent: image: portainer/agent:2.19.4 volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes networks: - agent_network deploy: mode: global placement: constraints: [node.platform.os == linux] portainer: image: portainer/portainer-ce:2.19.4 command: -H tcp://tasks.agent:9001 --tlsskipverify ports: - "9443:9443" - "9000:9000" - "8000:8000" volumes: - portainer_data:/data networks: - agent_network deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: agent_network: driver: overlay attachable: true volumes: portainer_data:
此时需要对agent部分增加一个端口挂载配置,否则后面创建环境时会因为连接失败导致无法创建环境:
version: '3.2' services: agent: image: portainer/agent:2.19.4 volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes ports: - "9001:9001" networks: - agent_network deploy: mode: global placement: constraints: [node.platform.os == linux] portainer: image: portainer/portainer-ce:2.19.4 command: -H tcp://tasks.agent:9001 --tlsskipverify ports: - "9443:9443" - "9000:9000" - "8000:8000" volumes: - portainer_data:/data networks: - agent_network deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] networks: agent_network: driver: overlay attachable: true volumes: portainer_data:
- 在管理节点部署portainer集群
docker stack deploy -c portainer-agent-stack.yml portainer
可以看到创建了一个网络和两个服务器:
- portainer_agent_network
- portainer_agent
- portainer_portainer
在集群中任意节点查看网络,可以看到所有节点上都创建了一个overlay驱动的网络portainer_agent_network。也就是在集群的各个节点创建该网络portainer_agent_network。
- 在管理节点查看服务
docker service ls
- 在管理节点查看容器
docker ps
- 在工作节点查看容器
注意:
与管理节点不同的是,工作简单值创建了portainer/agent容器,它是由管理节点在集群中创建的副本容器。
- 在浏览器中输入https://192.168.1.95:9443,进入portainer界面
与单机部署模式不同的是,在选择环境类型时,我们应该选择集群模式。即,勾选Docker Swarm 选项卡:
然后选择agent方式配置环境连接。当然默认情况,系统默认创建一个portainer集群环境:
- 进入该环境查看详细信息
- 进入集群页面,可以看到我们在管理节点上部署的portainer容器根据服务的副本配置,在工作节点上也建立了相同的portainer容器副本。
3.3 portainer密码重置
查看portainer是否正常远行:
docker ps
停止docker容器:
docker stop 5ca33ade99b4
查看portainer容器挂载信息:
docker inspect 5ca33ade99b4
找到容器挂载路径
进入到该路径下查看内容:
执行下列命令,重置管理员密码:
docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password
启动docker后,使用上图输出密码即可正常登录portainer管理界面。
四、部署容器集群
以创建busybox镜像容器为例,创建docker容器集群
4.1 拉去镜像
在管理节点中使用命令拉拉取镜像。
docker pull busybox
4.2创建网络
在管理节点创建一个overlay驱动的网络。
docker network create -d overlay --attachable busybox_overlay_network
注意:
在集群环境创建overlay驱动网络时,一定要带参数 --attachable,方便集群容器或单机容器与运行在其它节点中的容器建立通信。
4.3 创建服务器
在管理节点中创建服务
docker service create -td --name busybox_service --network busybox_overlay_network --replicas=2 busybox
- --replicas=2表示需要创建两个busybox容器的副本。
- --network busybox_overlay_network表示使用我们在上面创建的网络。
4.4 进入portainer查看busybox集群
在容器列表页面可以看到busybox容器集群。可以看到两个busybox容器分别位于dedian-fs0和debian-fs1节点,IP地址分别为10.0.2.3和10.0.2.4。
4.5 不同节点间容器通信
对应busybox容器集群的情况如下
主机 | 容器IP地址 |
debian-fs0 | 10.0.2.4 |
debian-fs1 | 10.0.2.3 |
进入到debian-fs0主机的busybox容器,ping位于debian-fs1主机中的busybox容器,可以ping通,反之相同。
4.6 集群扩展
前面在创建busybox容器集群是,设置其副本数量为2 --replicas=2,现在通过portainer将副本数量修改为3。
五、集群之负载均衡
5.1 无状态服务负载均衡
以nginx为例,实现无状态服务负载均衡。
- 拉取nginx镜像
docker pull nginx
- 被nginx服务创建overlay驱动的网络
docker network create -d overlay --attachable nginx_overlay_network
- 创建服务
docker service create -td --name nginx_service --network nginx_overlay_network --replicas=3 -p 8080:80 nginx
执行命令后等3分钟,再进portainer查看,发现nginx服务中三个节点已经处于runing状态。
- 查看三台主机节点的nginx服务默认发布页面
- 验证负载均衡功能
分别修改节点中的index.html页面方便区分来自不同容器的响应。
echo "server 192.168.1.95" > index.html
在物理机上验证负载均衡功能