一次docker swarm实践记录并部署portainer集群管理

220 阅读3分钟

1. 准备

主机名系统ip角色
node1centos7 64 位172.29.157.193manager
node2centos7 64 位172.18.186.192worker

1.1 配置 hosts

/etc/hosts

172.29.157.193	node1
172.18.186.192	node2

1.2 关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

2. 安装 docker

2.1 设置 docker repository

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2.2 安装 Docker Engine, containerd, Docker Compose

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2.3 启动 docker

sudo systemctl start docker

# 查看docker信息
docker info

ps: docker info 最后可能会有 warn 提示网络桥接行为的参数配置,可如下配置

sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
sudo sysctl -p /etc/sysctl.conf

2.4 在另一台机器执行同样操作,另可自行搜索配置 docker 开机自启动


3. docker swarm

3.1 在 node1 上执行初始化,并用结果将 node2 节点加入集群

docker swarm init --advertise-addr 172.29.157.193
Swarm initialized: current node (node1) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5lgkwbbstiqq7u9owwd0cz5lnw8ao6qk62v2siq0usda4o5dph-aw8x1sik3nrrfzg262el2msb6 172.29.157.193:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

将上述 swarm join 结果复制到 node2 上执行,最后在 node1 节点查看集群信息

[root@node1 ~]# docker node ls
ID                              HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ivsm9mr938zw8dxrmyh0s1z0a *      node1        Ready       Active            Leader                   26.1.1
vay3wpfuqyb4gvfutj8u27yu3        node2        Ready       Active                                        26.1.1

3.2 swarm 网络

[root@node1 ~]# docker network ls
NETWORK ID       NAME                   DRIVER    SCOPE
9a8ae68b3392     bridge                 bridge      local
bfaee612b3fe     docker_gwbridge        bridge      local
9e42d35e96df     host                   host        local
mn7mqvlyju18     ingress                overlay     swarm
3213991c7750     none                   null        local
  • docker_gwbridge:用于集群内的容器访问外部网络
  • ingress:用于集群南北向网络,算是集群的流量入口,简单的负载能力
  • 自定义 overlay :可用于集群东西向网络,内部的服务发现(service 名)

补充 这里碰到一个大坑,因为 node2 节点的 ip 为 172.18.*.*段,会与 docker_gwbridge 虚拟网段冲突,这样就导致两个服务节点通信有问题。所以需要将 docker 的默认网段调整修改下,然后重启 docker

配置 bip 时,只影响 docker0 网桥,不启作用;使用下面配置将影响 docker0 与 docker_gwbridge

{
  "default-address-pools":[
    {"base":"192.168.0.0/16","size":24}
  ]
}

4. portainer 部署

portainer 管理 docker swarm 集群与独立节点不同,其是通过在各节点上部署 agent 来实现

4.1 官网下载 docker-compose 文件

version: '3.8'

services:
  agent:
    image: portainer/agent:2.20.2
    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.20.2
    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:

执行部署

docker stack deploy -c portainer-agent-stack.yml portainer
配置说明:
  • agent 挂载 docker.sock 与 volumes,连接管理当前节点的 docker 守护进程与数据卷
  • agent 部署模式为 global,可理解为每一个节点(约束 os=linux)
  • 创建 overlay 网络=agent_network,用于 agent 与 server 的服务发现;attachable=true 表示可再加入
  • portainer 通过 docker swarm 内置的 dns,解析 tasks.agent 对应 agent 地址
  • 数据卷挂载,持久化 portainer 的管理数据

4.2 访问 http://****:9000 即可进入 ui 管理界面

  • 9443:https 端口
  • 9000:http 端口,建议生产禁用
  • 8000: tcp 端口,用于边缘计算或代理
  • 9001:与 agent 的通信端口

1.jpg

2.jpg

3.jpg