在这份指南中,我们将介绍在 Docker Swarm 集群中设置监控和日志系统的步骤。此设置确保您的集群被良好地监控,实时显示日志和性能指标的可视化。我们将使用的工具有如下:
- Docker Swarm :Docker 的内置集群工具,使容器编排变得简单。
- Traefik :一个反向代理和负载均衡器,用于动态管理流量。
- Grafana :一个监控平台,允许你可视化指标。
- Prometheus :一个监控系统,可以抓取指标并将它们存储在时间序列数据库中。
- cAdvisor :一个用于监控运行中容器的资源使用情况和性能的工具。
- Node Exporter :导出节点的硬件和操作系统层面的指标。
- Loki :一个日志聚合系统,用于从容器收集日志。
- Promtail :一个日志传输代理,将 Docker 容器的日志发送到 Loki。
在我们深入了解配置之前,我们先来做几个假设:
- Docker已在你计划用于Docker Swarm集群中的所有机器上安装。
- 你熟悉Docker的基本概念以及容器编排。
在管理节点上,运行以下命令来初始化Docker Swarm集群,这是设置集群的第一个步骤:
如需更多信息,请参见:
创建一个群集(swarm)更多详情请参阅docs.docker.com此命令将初始化Swarm集群环境,并生成一个令牌供您使用。在工作节点上,您需要运行以下命令以将其他节点添加到Swarm集群中。
docker swarm join --token <YOUR_TOKEN> <MANAGER_IP>:2377
注:<YOUR_TOKEN>
是您的唯一令牌,<MANAGER_IP>
是管理节点的 IP 地址。此命令用于将新节点加入到 Docker Swarm 集群中。
一旦节点连接完成,您可以在管理节点上运行以下命令来验证它们是否已加入该集群:
运行命令:docker node ls
为何用 Traefik 而不用 NGINX?
为什么用 Traefik 而不用 NGINX?
- 动态路由:Traefik 自动检测您 Swarm 集群中部署的新服务,并动态更新路由,无需手动调整配置。
- 无需暴露所有服务:默认情况下,Traefik 不会公开服务,除非明确配置,这增强了安全性。
- Swarm 模式集成:Traefik 内置支持 Docker Swarm,使在分布式集群中扩展和管理服务变得更加简单。
在部署 Traefik 之前,我们首先需要创建一个名为 traefik-public
的 Docker 网络,Traefik 将通过该网络与其他服务进行通信。
执行以下命令来创建网络:
docker network create --driver=overlay traefik-public
创建一个使用overlay驱动的名为traefik-public的Docker网络 (Create a Docker network named traefik-public using the overlay driver)
部署 Traefik现在我们来在Docker Swarm中设置Traefik吧。下面是一个示例docker-compose.yml
配置,用于Traefik。此设置确保Traefik在集群模式下运行并通过traefik-public
网络进行通信。
services:
traefik:
image: traefik:v2.9
command:
- "--log.level=DEBUG" # 日志级别为DEBUG
- "--providers.docker" # 启用Docker提供者
- "--providers.docker.exposedbydefault=false" # 默认不暴露服务
- "--providers.docker.network=traefik-public" # 使用网络traefik-public
- "--providers.docker.swarmmode=true" # 启用Swarm模式
- "--api.insecure=true" # API不安全启用
- "--api.dashboard=true" # 启用仪表板
- "--entrypoints.web.address=:80" # 设置web端点地址为80端口
- "--accesslog" # 启用访问日志
- "--api" # 启用API
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- traefik-public # 使用网络traefik-public
deploy:
placement:
constraints:
- node.role == manager # 节点角色 == 管理者
networks:
traefik-public:
external: true # 这是一个外部网络
此配置配置了 Traefik,如下所示:
- 一个可在
8080
端口访问的仪表板。 - 在
80
端口上的网络流量路由, - 访问 Docker socket 以检测在 Swarm 中运行的容器和服务。
- 用于 Traefik 和服务彼此通信的
traefik-public
网络。
让我们开始在Docker Swarm集群中设置Grafana。Grafana将帮助我们实时地将从Prometheus和其他来源收集的指标可视化。以下是在Swarm中部署Grafana作为服务的docker-compose.yml
配置:
services:
grafana:
image: grafana/grafana:latest
volumes:
- grafana_data:/var/lib/grafana
networks:
- traefik-public
environment:
- GF_SERVER_ROOT_URL=http://127.0.0/analytics
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.grafana.rule=PathPrefix(`/analytics`)"
- "traefik.http.routers.priority=2"
- "traefik.http.routers.grafana.entrypoints=web"
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
- "traefik.http.middlewares.grafana-stripper.stripprefix.prefixes=/analytics"
- "traefik.http.routers.grafana.middlewares=grafana-stripper"
volumes:
grafana_data:
networks:
traefik-public:
external: true
解释:
- 图像:我们使用从 Docker Hub 获取的最新 Grafana 镜像。
- 卷:持久卷
grafana_data
用于存储 Grafana 的数据和仪表板。 - 网络:Grafana 连接到
traefik-public
网络,以便与 Traefik 进行通信以实现路由。 - 环境变量:将
GF_SERVER_ROOT_URL
设置为/analytics
,这样 Grafana 就可以通过公共 IP 地址访问。 - Traefik 标签:这些标签配置了 Traefik 将如何为 Grafana 路由流量。它监听路径为
/analytics
的请求,去除前缀,并将流量转发到运行在 3000 端口的 Grafana。
现在,Grafana 可以通过 http://159.89.230.191/analytics
访问得到,等 Prometheus 和其他服务安装完毕,你就可以登录并开始查看数据了。
我们接下来将配置Prometheus来监控容器指标。
设置Prometheus、cAdvisor和Node Exporter 设置 Prometheus普罗米修斯负责从各种来源收集并存储指标数据,包括Node Exporter和cAdvisor这两个工具。这是普罗米修斯及其与Node Exporter和cAdvisor配合使用的设置。
docker-compose.yml
, 的配置文件
services:
prometheus:
image: prom/prometheus:v2.37.1
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
- "--web.console.templates=/usr/share/prometheus/consoles"
deploy:
placement:
constraints:
- node.role == manager
networks:
- traefik-public
node-exporter:
image: prom/node-exporter:v1.3.1
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- "--path.procfs=/host/proc"
- "--path.sysfs=/host/sys"
- "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)"
deploy:
mode: global
networks:
- traefik-public
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.45.0
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
deploy:
mode: global
networks:
- traefik-public
volumes:
prometheus_data:
networks:
traefik-public:
external: true
解释:
- Prometheus:主要服务,从配置的目标(例如Node Exporter、cAdvisor)中抓取数据并将数据存储在
prometheus_data
。 - Node Exporter:提供集群中每个节点的系统指标(如CPU、内存和磁盘使用情况)。它作为全局服务运行,意味着它运行在所有节点上。
- cAdvisor:监控运行容器的资源使用和性能特征。它也像Node Exporter一样,作为全局服务运行。
- 绑定挂载的概念:Node Exporter和cAdvisor都使用主机系统的目录(如
/proc
、/sys
、/var/lib/docker
等)来收集容器和节点级别的指标。
下面是这个设置的文件夹结构:
.
├── docker-compose.yml
├── prometheus/
│ └── prometheus.yml
└── prometheus_data/# Prometheus在这里存储时间序列数据
Prometheus 配置文件 (prometheus.yml
)
你需要创建一个Prometheus配置文件,来定义Prometheus如何从其目标(例如Prometheus本身、Node Exporter 和 cAdvisor)抓取(scraping)数据:
全局配置:
抓取时间间隔: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
dns_sd_configs:
- names:
- 'tasks.monitoring_node-exporter'
type: 'A'
port: 9100
- job_name: 'cadvisor'
dns_sd_configs:
- names:
- 'tasks.monitoring_cadvisor'
type: 'A'
port: 8080
创建必要的目录和文件的命令。
为了给Prometheus及其配置创建必要的目录结构,你可以运行以下命令:
# 创建一个 prometheus 文件夹
mkdir prometheus
# 在prometheus目录下创建一个prometheus.yml文件
touch prometheus/prometheus.yml# 打开文件并粘贴配置:
nano prometheus/prometheus.yml# 创建一个用于存放prometheus数据的目录
mkdir prometheus_data
Prometheus配置详解
- 抓取间隔:Prometheus 每 15 秒抓取一次指标。
- 任务配置 :
- Prometheus:在
localhost:9090
抓取自身的指标信息。 - Node Exporter:使用基于 DNS 的服务发现 (
dns_sd_configs
) 发现并通过抓取运行在每个节点上的node-exporter
服务的指标。 - cAdvisor:同样地,Prometheus 使用 DNS 服务发现抓取 cAdvisor 的指标信息。
一旦部署完成,Prometheus 就会在整个 Docker Swarm 集群中开始抓取系统和容器指标。
Loki 和 Promtail 日志设置洛基用于收集和查询日志信息,而普罗泰尔是将日志发送到洛基的代理。这里是如何在你的 docker-compose.yml
文件中以及洛基和普罗泰尔各自的配置文件中进行配置。
docker-compose.yml
用于 Loki和Promtail
网络,
traefik-public:
外部: 是
services:
loki:
image: grafana/loki:3.0.0
volumes:
- ./loki/loki-config.yaml:/mnt/config/loki-config.yaml
command: -config.file=/mnt/config/loki-config.yaml
networks:
- traefik-public
deploy:
mode: replicated
replicas: 1
promtail:
image: grafana/promtail:3.0.0
volumes:
- ./promtail/promtail-config.yaml:/mnt/config/promtail-config.yaml
- /var/log:/var/log
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- loki
command: -config.file=/mnt/config/promtail-config.yaml
environment:
- HOSTNAME={{.Node.Hostname}}
networks:
- traefik-public
deploy:
mode: global
目录结构
为了更有效地管理和维护Loki和Promtail,这里给出了一种可能的日志配置目录结构:
这是一个包含 Docker Compose 配置文件和 Loki 及 Promtail 配置文件的文件夹结构:
.
├── docker-compose.yml # Docker Compose 配置文件
├── loki/
│ └── loki-config.yaml # Loki 配置文件
└── promtail/
└── promtail-config.yaml # Promtail 配置文件
创建所需目录和文件的命令如下:
为了创建所需的文件和文件夹,请运行如下命令来实现。
# 创建 Loki 和 Promtail 的文件夹
mkdir loki promtail
# 生成 Loki 和 Promtail 配置文件并编辑相应内容
touch loki/loki-config.yaml
touch promtail/promtail-config.yaml
nano loki/loki-config.yaml
nano promtail/promtail-config.yaml
Loki 配置 (loki-config.yaml
)
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
公共:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
存储:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
复制因子: 1
环:
kvstore:
store: inmemory
query_range:
results_cache:
缓存:
内嵌缓存:
enabled: true
max_size_mb: 100
模式配置:
配置项:
- from: 2020-10-24
store: tsdb
object_store: filesystem
schema: v13
索引:
前缀: index_
周期: 24h
此配置指定Loki将分别监听HTTP的端口3100
和gRPC的端口9096
。日志将存储在文件系统的/tmp/loki
目录中。配置方案版本设置为v13
,并采用tsdb
存储格式。
promtail-config.yaml
)
服务器配置:
HTTP监听端口: 9080
gRPC监听端口: 0
positions:
filename: /tmp/positions.yamlclients:
- url: <http://loki:3100/loki/api/v1/push>scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
node: ${HOSTNAME}
__path__: /var/log/*log - job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
- target_label: 'node'
replacement: ${HOSTNAME} - job_name: promtail
static_configs:
- targets:
- localhost
labels:
job: promtail
node: ${HOSTNAME}
__path__: /var/log/promtail.log
关于Promtail配置的说明:
- 定位:跟踪日志文件的最后读取位置,以防止重复读取相同的日志。
- 客户端:Promtail 将日志发送到 Loki 的端点
[http://loki:3100/loki/api/v1/push](http://loki:3100/loki/api/v1/push.)
。 -
抓取设置:
-
系统日志:从
/var/log/*log
目录抓取日志。 -
Docker 日志:通过访问 Docker 套接字来抓取 Docker 容器的日志。
- Promtail 日志:抓取 Promtail 的自身日志来监控自身。
这种配置允许Promtail从系统文件和Docker容器收集日志,并将它们推送至Loki进行查询和分析。
部署步骤一旦配置文件设置完成后,你可以用Docker Compose来部署这个日志堆栈。
docker-compose up -d
这将启动 Loki 和 Promtail 两个服务,你可以通过 http://localhost:3100
(或你用于访问 Grafana 的 IP 地址)访问 Loki。Promtail 会自动开始将日志发送给 Loki,你可以在 Grafana 中查询这些日志。
通过使用Prometheus、cAdvisor、Node Exporter、Loki和Promtail搭建了一个完整的监控和日志记录系统,你现在拥有了一个强大的实时监控和日志分析系统。Prometheus收集关键指标,cAdvisor和Node Exporter提供了对容器化环境的深入洞察,而Loki和Promtail则确保了全面的日志聚合和搜索功能。
这种配置可以随着您的基础设施的扩展而扩展,并根据任何特定需求进行定制,无论是监控系统健康、排查问题,还是确保资源分配更优。此外,使用 Traefik 可以实现服务之间的无缝路由,从而更容易管理单个端点后多个服务。
通过在 Docker Swarm 中整合所有内容,你可以建立一个高效且易于部署的解决方案。你还可以在 Prometheus 中添加警报规则或在 Grafana 中设置仪表板以可视化日志和指标,从而扩展此设置。这样,你就能全面掌控你的可观测性和运营洞察力。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章