1. 准备
| 主机名 | 系统 | ip | 角色 |
|---|---|---|---|
| node1 | centos7 64 位 | 172.29.157.193 | manager |
| node2 | centos7 64 位 | 172.18.186.192 | worker |
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 的通信端口