Docker swarm集群(集群部署,弹性伸缩,滚动更新,监控,global模式的设置等)

前言

Docker swarm简介
  • Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
  • Swarm的基本架构如下图所示
    在这里插入图片描述
  • 这个图作为一个整体实际上都处于一个所谓的集群中,它可能对应了一到多台的实际服务器。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能笼统地向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是Swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。
  • Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
  • Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。
Docker Swarm 优点
  • 任何规模都有高性能表现
    对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。
    经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。

  • 灵活的容器调度
    Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。

  • 服务的持续可用性
    Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。
    此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。

  • 和 Docker API 及整合支持的兼容性
    Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。
    Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。开发的 Compose 文件能(通过 docker-compose up )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。

  • 综上所述,Docker Swarm 提供了一套高可用 Docker 集群管理的解决方案,完全支持标准的 Docker API,方便管理调度集群 Docker 容器,合理充分利用集群主机资源。

  • 注意:并非所有服务都应该部署在Swarm集群内。数据库以及其它有状态服务就不适合部署在Swarm集群内。

相关概念

1.节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。下图展示了集群中管理节点与工作节点的关系。
在这里插入图片描述
2.服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。下图展示了容器、任务、服务的关系。
在这里插入图片描述

实验环境

主机名(IP)服务
server1(172.25.24.1)manager
server2(172.25.24.2)node1
server3(172.25.24.3)node3
真机(172.25.24.24)测试

Docker swarm集群的搭建

server1
  • 1.搭建yum源,下载docker:
[root@server1 ~]# cat /etc/yum.repos.d/docker.repo 
[docker]
name=docker
gpgcheck=0
baseurl=http://172.25.24.24/docker
[root@server1 ~]# yum install docker-ce -y
  • 2.开启服务:
[root@server1 ~]# systemctl start docker
[root@server1 ~]# systemctl enable docker
  • 3.创建Swarm集群:
[root@server1 ~]# docker swarm init    #初始化集群

在这里插入图片描述

  • 4.查看桥接信息以及网络配置:
[root@server1 ~]# yum install bridge-utils -y
[root@server1 ~]# brctl  show
[root@server1 ~]# docker network ls

在这里插入图片描述

server2和server3
  • 1.Server2和server3搭建yum源。下载docker并开启服务,这里不再赘述。
  • 2.Server2和server3加入集群,使用刚刚server1初始化给的信息添加:
  • Server2:
docker swarm join --token SWMTKN-1-1is4ic18j3r5wvu43u89uiybtetq3ea5e9w8ikqi0qftw0maqd-77f2dlpp8xj8p65pn1gx1r0a7 172.25.24.1:2377

在这里插入图片描述

  • server3:
    在这里插入图片描述
  • 在server1上查看swarm集群节点信息:
[root@server1 ~]# docker node ls

在这里插入图片描述

使用swarm集群部署web服务

  • 1.给三个节点导入nginx镜像
[root@server1 ~]# ls
nginx.tar
[root@server1 ~]# docker load -i nginx.tar 
[root@server1 ~]# docker images 
[root@server1 ~]# docker tag nginx:1.16 nginx:latest
[root@server2 ~]# docker tag nginx:1.16 nginx:latest
[root@server3 ~]# docker tag nginx:1.16 nginx:latest

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 2.创建集群服务,并创建一个覆盖网络,保证在不同主机上的容器互通。在集群上部署三个nginx容器,用来提供服务。
[root@server1 ~]# docker network create -d overlay webnet #   创建驱动为overlay的网络
[root@server1 ~]# docker service create --name web  --network webnet --replicas 3 -p 80:80 nginx  #创建集群服务
[root@server1 ~]# docker service ps web

命令解释:

  • docker service create 命令创建一个服务
  • –name 服务名称命名为 web
  • –network 指定服务使用的网络模型
  • –replicas 设置启动的示例数为3,部署几个完全一样的容器(副本)
    在这里插入图片描述
  • 3.查看80端口的开启情况,docker服务列表以及docker集群的web列表。
[root@server1 ~]# netstat -antlp | grep 80     
[root@server1 ~]# docker service ls
[root@server1 ~]# docker service ps web

在这里插入图片描述

  • 4.Server1~3做以下操作:复制发布页面到容器nginx的默认发布目录下
  • Server1:
[root@server1 ~]# vim index.html
[root@server1 ~]# cat index.html 
server1---nginx
[root@server1 ~]# docker cp index.html web.1.nhmzxhdvn2cee47ddrmbxku73:/usr/share/nginx/html

在这里插入图片描述

  • server2:
    在这里插入图片描述
  • server3:
    在这里插入图片描述
  • 5.在真机上测试负载均衡(容器部署在集群上,所以任何一个ip都可以访问到)。
[root@foundation10 ~]# curl 172.25.24.1
[kiosk@foundation11 ~]$ for i in {1..10};do curl http://172.25.11.1;done
[kiosk@foundation11 ~]$ for i in {1..10};do curl http://172.25.11.2;done
[kiosk@foundation11 ~]$ for i in {1..10};do curl http://172.25.11.3;done

在这里插入图片描述

弹性伸缩(增加或减少服务数目)

  • 1.拉伸(增加scale数目)
[root@server1 ~]# docker service scale web=6
[root@server1 ~]# docker ps

可以看到容器1,5部署在了server1上。
在这里插入图片描述
容器2,6部署在了server2上。
在这里插入图片描述
容器3,4部署在了server3上。
在这里插入图片描述

  • 查看docker集群的web服务列表
[root@server1 ~]# docker service ps  web

在这里插入图片描述

  • 2.真机测试
[root@foundation10 ~]# curl 172.25.24.1
server1---nginx
[root@foundation10 ~]# curl 172.25.24.1

在这里插入图片描述

  • 3.缩减
[root@server1 ~]# docker service scale web=3
[root@server1 ~]# docker service ps  web

在这里插入图片描述

  • 4.真机测试
[root@foundation10 ~]# curl 172.25.24.1

在这里插入图片描述

监控

  • 1.在server1上导入镜像visualizer
[root@server1 ~]# docker load -i visualizer.tar

在这里插入图片描述

  • 2.创建swarm的监控容器
[root@server1 ~]# docker service create \
> --name=viz \
> --publish=8080:8080/tcp \
> --constraint=node.role==manager \
> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
> dockersamples/visualizer

在这里插入图片描述

  • 查看viz容器以及8080端口是否开放
[root@server1 ~]# docker ps               
[root@server1 ~]# netstat -antlp | grep 8080

在这里插入图片描述

  • 3.测试:web界面去监控管理的集群以及每个集群的状态。http://172.25.24.1:8080/
    在这里插入图片描述
  • 当我们关闭server3的docker服务时,再查看监控
[root@server3 ~]# systemctl stop docker

在这里插入图片描述

  • 我们可以发现当server3停掉后,它上面的服务跑到了server2上
    当增加服务的数目时,Docker swarm集群会自动分配每个节点的web数目,并展示到监控界面
[root@server3 ~]# systemctl start docker
[root@server1 ~]# docker service scale web=12

在这里插入图片描述

在这里插入图片描述
注意:集群中的每个节点都应该有拉起容器的镜像,因为每个节点都有承担任务的可能性。

滚动更新(灰度发布)

更新的过程中始终保持业务连续性,用户感觉不到。可以回滚

  • 1.给server1~3导入要更新的镜像。(以httpd镜像为例,也可以使用game2048,只要该镜像也开启的是80端口即可。)
[root@server1 ~]# docker load -i httpd.tar
[root@server2 ~]# docker load -i httpd.tar
[root@server3 ~]# docker load -i httpd.tar
  • 2.增加集群的规模
[root@server1 ~]# docker service scale web=30

在这里插入图片描述

  • 这里是没有更新的,拉伸的30个服务全是nginx的容器。
    在这里插入图片描述
  • 3.更新,并且设定每5s更新一次,每次更新5个。这时,所有的nginx容器已经释放,现在的容器都是基于httpd镜像建立的。
  • 参数含义解释:
  • –image 指定要更新的镜像
  • –update-parallelism 指定最大同步更新的任务数
  • –update-delay 指定更新间隔
[root@server1 ~]# docker service scale web=30
[root@server1 ~]# docker service update --image httpd --update-delay 5s  --update-parallelism 5 web

在这里插入图片描述

在这里插入图片描述

swarm的global模式的部署

  • 某些特殊的以用场景,比如说:大型集群当中要对每个节点进行zabbix监控,那么只需要给每个节点部署一个zabbix-agent容器即可,global也就是保证每个节点时刻有且只有一个容器。
  • 给三个节点导入game2048的镜像。
[root@server1 ~]# docker load -i game2048.tar
[root@server2 ~]# docker load -i game2048.tar
[root@server3 ~]# docker load -i game2048.tar
  • 我们在server1上以global模式部署集群。
[root@server1 ~]# docker service rm web
[root@server1 ~]# docker service create --name web --publish 80:80 --mode global game2048

在这里插入图片描述

  • 在三个节点查看,此时三个节点都只运行了一个容器
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在浏览器中查看。
    在这里插入图片描述
  • 如果集群当中自动加入一个节点,那么管理节点就会自动在刚进来的节点上面运行一个容器
    接下来实现一下
  • 在真机当中再开启一台server4,给server4安装并开启服务,导入镜像game2048并加入集群,这里不再赘述。
  • server1上查看
    在这里插入图片描述
  • 在server4查看,此时game2048容器已经运行。
    在这里插入图片描述
  • 在浏览器里面查看,可以看到已经自动为server4添加web服务
    在这里插入图片描述

补充:对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)

[root@server1 ~]# docker load --help
[root@server1 ~]# docker node update --help

在这里插入图片描述

  • 将server4设置为drain状态,也就是worker不再工作。
[root@server1 ~]# docker node update --availability drain server4
server4
[root@server1 ~]# docker node ls

在这里插入图片描述

  • 在浏览器里面查看各个节点的状态
    在这里插入图片描述
  • 恢复server4为active状态
[root@server1 ~]# docker node update --availability active server4
server4
[root@server1 ~]# docker node ls

在这里插入图片描述

  • 在浏览器里面查看各个节点的状态
    在这里插入图片描述
  • 将server1设置为drain状态,server1上的worker容器会释放,但是监控的容器会正常工作
[root@server1 ~]# docker node update --availability drain server1
server1
[root@server1 ~]# docker node ls

在这里插入图片描述

  • 在浏览器里面查看各个节点的状态
    在这里插入图片描述
  • 查看容器的状态
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 恢复server1的状态
[root@server1 ~]# docker node update --availability active server1
server1
[root@server1 ~]# docker node ls
[root@server1 ~]# docker service ps viz

在这里插入图片描述

<think>首先,用户的问题是:“我想了解如何监控跨主机的DockerSwarm集群请问监控跨主机DockerSwarm集群的最佳实践与工具”。这是一个关于DockerSwarm监控的问题。系统级指令:1.所有行内数学表达式必须使用$...$格式。但在这个问题中,似乎没有数学表达式,所以我需要确保在回答中如果有数学内容,比如涉及性能指标或公式时,正确使用。2.独立公式必须使用$$...$$格式并单独成段。3.LaTeX语法正确。4.使用中文回答。5.生成相关问题。6.回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层:-回答结构清晰,帮助用户逐步解决问题。-尽量保证回答真实可靠。-参考站内引用:提供了两个引用:-引用[1]:关于DockerSwarm部署集群应用,包括服务详情的命令。-引用[2]:关于dockerswarm集群部署,查看web服务列表和测试curl命令。用户的上一个问题可能是关于DockerSwarm部署,但当前问题聚焦在监控上。所以,我需要基于用户的问题构建回答。关键点:-监控跨主机的DockerSwarm集群。-最佳实践与工具。结构化回答:1.**介绍监控的重要性**:解释为什么需要监控DockerSwarm集群。2.**监控的关键方面**:列出需要监控的元素,如节点健康、服务状态、资源使用等。3.**最佳实践**:提供一般性的建议。4.**工具推荐**:列出和描述流行的监控工具。5.**实施步骤**:简要说明如何设置监控。6.**生成相关问题**:在回答结束时添加相关问题。参考提供的引用:-引用[1]显示了`dockerserviceinspect`命令,这可以用于检查服务详情。-引用[2]显示了使用curl测试服务。这些可以在回答中引用,作为监控的一部分。例如,命令行工具是监控的一部分。工具推荐:-**Prometheus+Grafana**:这是监控Docker集群的黄金标准。Prometheus收集指标,Grafana可视化。-**cAdvisor**:用于容器监控。-**ELKStack**:用于日志监控。-**Docker内置命令**:如`dockernodels`,`dockerservicels`,`dockerserviceinspect`。-**第三方工具**:如Datadog,Sysdig,Zabbix。最佳实践:-集中化日志和指标收集。-设置警报。-监控节点级别和容器级别的指标。-使用健康检查。在回答中引用段落:-当提到使用Docker命令时,可以引用[^1]或[^2]。-例如:"使用`dockerserviceinspect`命令可以查看服务的详细状态[^1]."生成相关问题:-在结尾添加几个相关问题,类似示例。完整回答结构:1.**引言**:简要解释监控的重要性。2.**监控方面**:列出关键监控点。3.**最佳实践**:描述实践。4.**工具介绍**:详细描述工具。5.**实施示例**:给出简单示例。6.**相关问题**:添加相关问题。确保使用中文。</think>### 监控跨主机 Docker Swarm 集群的最佳实践与工具 监控 Docker Swarm 集群是确保分布式应用稳定运行的关键,尤其是在跨主机环境中。它涉及跟踪节点健康、服务状态、资源使用(如 CPU、内存、网络)以及日志集中管理。以下我将基于最佳实践和常用工具,一步步为您解释如何高效监控跨主机集群。 #### 1. **监控的关键方面** - **节点级别监控**:包括主机健康、资源利用率(如 CPU 使用率、内存占用、磁盘 I/O)。例如,监控节点是否在线或负载过高。 - **服务级别监控**:跟踪服务副本数、任务状态(如运行中、失败)、网络延迟等。使用命令如 `docker service ls` 可快速查看服务列表 [^2]。 - **容器级别监控**:关注单个容器的性能指标,如进程数、网络流量。 - **日志与事件**:集中收集日志,便于故障排查。事件包括服务更新、节点加入/退出。 - **警报机制**:设置阈值警报(如 CPU > 80%),及时响应异常。 #### 2. **最佳实践** 以下是跨主机监控的核心实践,确保可靠性和可扩展性: - **集中化数据收集**:所有节点和容器的指标和日志应汇总到中央存储(如时间序列数据库),避免数据分散。这简化了跨主机分析。 - **自动化健康检查**:在服务定义中添加健康检查(如 `healthcheck` 指令),Docker 会自动监控服务状态,失败时触发重启或警报。 - **资源隔离与配额**:为服务设置资源限制(如 `--reserve-memory`),防止单个容器耗尽主机资源,影响整体集群。 - **定期巡检与测试**:使用命令行工具(如 `docker node inspect` 或 `curl` 测试服务端点)验证集群健康 [^2]。例如,引用中的 `curl` 测试可扩展为自动化脚本。 - **安全监控**:监控未授权访问或异常网络流量,结合工具如 Prometheus 的 Alertmanager 实现实时警报。 - **文档化监控策略**:记录监控指标和响应流程,便于团队协作。 #### 3. **推荐工具** 以下是专为 Docker Swarm 设计的流行工具,支持跨主机监控。大多数工具开源且易于集成: - **Prometheus + Grafana(黄金组合)**: - **功能**:Prometheus 收集和存储指标(如节点 CPU、内存),Grafana 提供可视化仪表盘。支持自定义查询(如计算服务副本的平均延迟 $ \text{avg}( \text{latency} ) $)。 - **集成方式**:部署 Prometheus 作为 Swarm 服务,使用 `docker service create` 设置。cAdvisor(容器监控工具)可自动收集容器指标并导出到 Prometheus。 - **优点**:实时警报、高度可扩展,适合大规模集群。 - **示例命令**:查看服务详情可使用 `docker service inspect --pretty <ID>`,这能输出服务配置和状态,便于诊断 [^1]。 - **ELK Stack(Elasticsearch, Logstash, Kibana)**: - **功能**:集中管理日志。Logstash 收集和过滤日志,Elasticsearch 存储,Kibana 可视化。监控日志异常(如错误率激增)。 - **集成方式**:在 Swarm部署 Filebeat 代理到每个节点,转发日志到 ELK。 - **优点**:强大的日志搜索和分析,适合故障排查。 - **Docker 内置工具**: - **Docker Stats API**:通过 `docker stats` 命令实时查看容器资源使用。 - **Swarm 管理命令**:如 `docker node ls` 检查节点状态,`docker service ps <service>` 查看任务分布。这些命令是快速诊断的基础 [^1][^2]。 - **第三方云服务**: - **Datadog**:提供全栈监控,自动发现 Swarm 服务,集成警报和仪表盘。 - **Sysdig**:专注于容器安全与性能,支持 Prometheus 导出。 - **Zabbix**:适用于企业级监控,可定制代理监控主机和容器。 | 工具 | 适用场景 | 优点 | 缺点 | |------|----------|------|------| | Prometheus + Grafana | 指标监控与可视化 | 开源、高度灵活 | 需要配置复杂 | | ELK Stack | 日志集中管理 | 强大的搜索能力 | 资源消耗较大 | | Datadog | 云原生全栈监控 | 易用、SaaS 服务 | 付费版本昂贵 | #### 4. **实施步骤示例** 以 Prometheus + Grafana 为例,简述设置流程: 1. **部署监控服务**:在 Swarm 管理节点运行命令创建 Prometheus 服务。 ```bash docker service create --name prometheus --publish 9090:9090 prom/prometheus ``` 2. **添加 cAdvisor**:在每个节点部署 cAdvisor 收集容器指标。 ```bash docker service create --name cadvisor --mode global --publish 8080:8080 google/cadvisor ``` 3. **配置 Grafana**:部署 Grafana 并导入 Prometheus 数据源,创建仪表盘监控集群指标(如节点 CPU 使用率)。 4. **设置警报**:在 Prometheus 中定义规则(如 `node_memory_usage > 90%`),触发邮件或 Slack 通知。 5. **测试与验证**:使用 `curl` 测试服务端点 [^2],或运行 `docker service inspect` 检查服务健康 [^1]。 监控工具的选择取决于集群规模:小集群可用内置命令 + Prometheus,大集群推荐结合云服务如 Datadog 以降低运维负担。 #### 相关问题 1. 如何为 Docker Swarm 设置自动伸缩以优化资源使用? 2. Docker Swarm 与 Kubernetes 在监控方面有哪些关键差异? 3. 如何实现 Docker Swarm 集群的高可用性和故障转移机制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值