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

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

  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-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

在物理机上验证负载均衡功能

 

posted @ 2024-04-01 16:58  钟齐峰  阅读(114)  评论(0编辑  收藏  举报