Bendi新闻
>
Docker三剑客之Docker Swarm

Docker三剑客之Docker Swarm

6月前

 

一、环境

docker安装:

sudo apt install docker.io

主机分配:

操作系统主机名主机IPdocker版本
debian 12 (bookworm)fs3(管理节点)192.168.1.95v20.10.24
debian 12 (bookworm)fs1(工作节点)192.168.1.91v20.10.24
debian 12 (bookworm)fs0(工作节点)192.168.1.92v20.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

 可以看到创建了一个网络和两个服务器:

  1. portainer_agent_network

  2. portainer_agent

  3. 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-fs010.0.2.4
debian-fs110.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
在物理机上验证负载均衡功能

链接:https://www.cnblogs.com/zhongqifeng/p/18108887

(版权归原作者所有,侵删)

微信扫码关注该文公众号作者

来源:马哥Linux运维
logo
联系我们隐私协议©2024 bendi.news
Bendi新闻
Bendi.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Bendi.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。