Docker Swarm
从 v2.20.0 版本开始,Prometheus 可以发现 Docker Swarm 集群中的目标。本指南将演示如何使用该服务发现机制。
Docker Swarm 服务发现架构
Docker Swarm 服务发现 包含 3 种不同的角色:nodes(节点)、services(服务)和 tasks(任务)。
第一种角色 nodes(节点)代表属于 Swarm 的主机。它可以用于自动监控运行在 Swarm 主机上的 Docker Daemons 或 Node Exporters。
第二种角色 tasks(任务)代表在 swarm 中部署的任何单个容器。每个任务都具有其关联的服务标签。一个服务可以由一个或多个任务支持。
第三个,services,将发现部署在 swarm 中的服务。它将发现服务暴露的端口。通常你会想使用 tasks 角色而不是这个。
Prometheus 将只发现暴露端口的任务和服务。
注意本文的其余部分假定你已经运行了一个 Swarm。
设置 Prometheus
对于本指南,你需要设置 Prometheus。我们将假设 Prometheus 运行在 Docker Swarm 管理节点上,并且可以访问 Docker 套接字 `/var/run/docker.sock`。
监控 Docker 守护进程
让我们深入了解服务发现本身。
Docker 本身作为一个守护进程,会暴露指标 ,Prometheus 服务器可以抓取这些指标。
你可以通过编辑 `/etc/docker/daemon.json` 并设置以下属性来启用它们
{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}
你可以将 IP 设置为 Docker Swarm 节点 IP,而不是 `0.0.0.0`。
需要重启守护进程才能使新配置生效。
然后,你可以通过提供以下 `prometheus.yml` 文件来配置 Prometheus 抓取 Docker 守护进程
scrape_configs:
# Make Prometheus scrape itself for metrics.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Create a job for Docker daemons.
- job_name: 'docker'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: nodes
relabel_configs:
# Fetch metrics on port 9323.
- source_labels: [__meta_dockerswarm_node_address]
target_label: __address__
replacement: $1:9323
# Set hostname as instance label
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: instance
对于 nodes 角色,你也可以使用 `dockerswarm_sd_configs` 的 `port` 参数。然而,推荐使用 `relabel_configs`,因为它允许 Prometheus 在相同的 Docker Swarm 配置之间重用相同的 API 调用。
监控容器
现在让我们在 Swarm 中部署一个服务。我们将部署cadvisor ,它暴露容器资源指标。
docker service create --name cadvisor -l prometheus-job=cadvisor \
--mode=global --publish target=8080,mode=host \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock,ro \
--mount type=bind,src=/,dst=/rootfs,ro \
--mount type=bind,src=/var/run,dst=/var/run \
--mount type=bind,src=/sys,dst=/sys,ro \
--mount type=bind,src=/var/lib/docker,dst=/var/lib/docker,ro \
google/cadvisor -docker_only
这是一个监控它的最小 `prometheus.yml` 文件。
scrape_configs:
# Make Prometheus scrape itself for metrics.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Create a job for Docker Swarm containers.
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
# Only keep containers that should be running.
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
# Only keep containers that have a `prometheus-job` label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
# Use the prometheus-job Swarm label as Prometheus job label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
让我们分析一下relabel 配置的每个部分。
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
Docker Swarm 通过 API 公开任务的期望状态 。在我们的示例中,我们只**保留**应该运行的目标。这可以防止监控应该关闭的任务。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
当我们部署 cadvisor 时,我们添加了一个标签 `prometheus-job=cadvisor`。由于 Prometheus 获取任务标签,我们可以指示它**只**保留具有 `prometheus-job` 标签的目标。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
最后一部分将任务的 `prometheus-job` 标签转换为目标标签,覆盖了从抓取配置中获得的默认 `dockerswarm` 作业标签。
发现的标签
Prometheus 文档 包含标签的完整列表,但这里有一些你可能会发现有用的其他 relabel 配置。
仅通过特定网络抓取指标
- source_labels: [__meta_dockerswarm_network_name]
regex: ingress
action: keep
仅抓取全局任务
全局任务运行在每个守护进程上。
- source_labels: [__meta_dockerswarm_service_mode]
regex: global
action: keep
- source_labels: [__meta_dockerswarm_task_port_publish_mode]
regex: host
action: keep
向目标添加 docker_node 标签
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: docker_node
连接到 Docker Swarm
上面的 `dockerswarm_sd_configs` 条目有一个 `host` 字段。
host: unix:///var/run/docker.sock
这是在使用 Docker 套接字。Prometheus 提供了额外的配置选项,可以使用 HTTP 和 HTTPS 连接到 Swarm,如果你更喜欢而不是 unix 套接字。
结论
有许多可以使用的发现标签,以便更好地确定要监控哪些目标以及如何监控。对于任务,有超过 25 个可用标签。请随时查看 Prometheus 服务器的“服务发现”页面(在“状态”菜单下),以查看所有发现的标签。
服务发现对你的 Swarm 堆栈没有任何假设,因此通过适当的配置,它可以即插即用地集成到任何现有堆栈中。