当前位置: 首页 > news >正文

使用 Docker Swarm 部署高可用集群指南

Docker Swarm 是 Docker 原生的集群管理工具,可以轻松地将多个 Docker 主机组成一个集群,实现服务的高可用性和负载均衡。以下是详细的部署步骤:

一、环境准备

1. 服务器要求

  • 至少 3 台 Linux 服务器(建议 CentOS/Ubuntu)
  • 每台服务器已安装 Docker Engine(版本 19.03+)
  • 服务器之间网络互通
  • 开放的端口:2377(集群管理)、7946(节点通信)、4789(覆盖网络)

2. 设置主机名和解析(所有节点)

# 设置主机名
hostnamectl set-hostname node1  # 在第一台执行
hostnamectl set-hostname node2  # 在第二台执行
hostnamectl set-hostname node3  # 在第三台执行# 编辑/etc/hosts添加解析
echo "
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
" >> /etc/hosts

二、初始化 Swarm 集群

1. 在主节点(node1)上初始化 Swarm

docker swarm init --advertise-addr <node1-IP>

输出示例:

Swarm initialized: current node (xyz) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-xxx 192.168.1.101:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2. 添加工作节点

在其他节点上运行上面输出的加入命令:

docker swarm join --token <worker-token> <node1-IP>:2377

3. 添加管理节点(可选,实现管理高可用)

# 在主节点获取管理令牌
docker swarm join-token manager# 在其他管理节点运行输出的命令

三、验证集群状态

1. 查看节点列表

docker node ls

输出示例:

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
x3y *   node1      Ready     Active         Leader           20.10.7
z4w     node2      Ready     Active         Reachable        20.10.7
a5b     node3      Ready     Active                          20.10.7

2. 检查 Swarm 状态

docker info | grep -i swarm

四、部署高可用服务

1. 创建覆盖网络

docker network create --driver overlay --attachable my-overlay

2. 部署示例服务(Nginx)

docker service create \--name nginx \--replicas 3 \--publish published=8080,target=80 \--network my-overlay \nginx:latest

3. 查看服务状态

docker service ls
docker service ps nginx

五、实现高可用特性

1. 服务自动重启

docker service update \--restart-condition any \--restart-delay 5s \--restart-max-attempts 3 \nginx

2. 设置滚动更新策略

docker service update \--update-parallelism 2 \--update-delay 10s \--image nginx:1.21 \nginx

3. 配置健康检查

docker service update \--health-cmd "curl -f http://localhost || exit 1" \--health-interval 5s \--health-retries 3 \--health-timeout 2s \nginx

六、集群管理

1. 节点维护

# 将节点设置为维护模式
docker node update --availability drain node2# 恢复节点
docker node update --availability active node2

2. 备份 Swarm 配置

# 备份 Raft 日志(在管理节点执行)
docker swarm ca --rotate  # 先轮换证书
tar -czvf swarm-backup.tar.gz /var/lib/docker/swarm/

3. 灾难恢复

# 在新节点恢复管理角色
docker swarm init --force-new-cluster --advertise-addr <new-ip>

七、监控和日志

1. 部署监控栈

# 创建监控网络
docker network create --driver overlay monitor# 部署 Prometheus
docker service create --name prometheus \--network monitor \--publish published=9090,target=9090 \prom/prometheus# 部署 Grafana
docker service create --name grafana \--network monitor \--publish published=3000,target=3000 \grafana/grafana

2. 集中日志收集

docker service create --name logspout \--mode global \--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \--network my-overlay \gliderlabs/logspout syslog+tls://your-log-server:514

八、安全加固

1. 启用 TLS 加密

# 初始化 Swarm 时启用 TLS
docker swarm init --advertise-addr <ip> --default-addr-pool 10.10.0.0/16 --data-path-port 4789 --force-new-cluster --listen-addr <ip>:2377 --cert-expiry 2160h

2. 定期轮换证书

docker swarm ca --rotate

3. 限制管理节点访问

iptables -A INPUT -p tcp --dport 2377 -s <trusted-ip> -j ACCEPT
iptables -A INPUT -p tcp --dport 2377 -j DROP

常见问题解决

  1. 节点无法加入集群

    • 检查防火墙设置
    • 验证令牌是否过期(默认24小时)
    • 确保所有节点时间同步
  2. 服务无法启动

    • 检查资源限制 docker service inspect --pretty <service>
    • 查看日志 docker service logs <service>
  3. 网络连接问题

    • 验证覆盖网络 docker network inspect <network>
    • 检查 IP 地址池是否冲突

通过以上步骤,您已经成功部署了一个高可用的 Docker Swarm 集群。这种架构可以自动处理节点故障、服务扩展和负载均衡,适合生产环境使用。

http://www.dtcms.com/a/265633.html

相关文章:

  • 副作用是什么?
  • DQL-3-聚合函数
  • lspci查看PCI设备详细信息
  • linux常用命令(10):scp命令(远程拷贝命令,复制文件到远程服务器)
  • PlatformIO 在使用 GitHub 上的第三方库
  • Spark 4.0的VariantType 类型以及内部存储
  • 云上堡垒:如何用AWS原生服务构筑坚不可摧的主机安全体系
  • java教程——初识guava(2)
  • 在 React 中使用 WebSockets 构建实时聊天应用程序
  • 实训项目记录 | 7.3
  • AI会取代网络工程师吗?理解AI在网络安全中的角色
  • 【网络安全】Webshell命令执行失败解决思路
  • 如何避免服务器出现故障情况?
  • 数据库服务端有连接数限制吗
  • vue3 + cesium + heatmapjs 开发热力图(不需要CesiumHeatMap插件)
  • JA3指纹在Web服务器或WAF中集成方案
  • 在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
  • Element UI 完整使用实战示例
  • Flutter 进阶:实现带圆角的 CircularProgressIndicator
  • 解决安装SunloginClient问题记录(Ubuntu 24.04.2)
  • 删除docker镜像后如何正确清理残余
  • 前端的一些报错
  • AIX 环境磁盘空间管理指南
  • 从零开始构建Airbyte数据管道:PostgreSQL到BigQuery实战指南
  • CentOS系统高效部署fastGPT全攻略
  • 两级缓存 Caffeine + Redis 架构:原理、实现与实践
  • 跨云架构:性能、成本与合规的平衡艺术
  • Linux 73 LAMP4
  • 渗透测试中 phpinfo() 的信息利用分析
  • Java接口报错:Packet for query is too large - 解决方案与架构思考