Docker Swarm
Prometheus 可以發現 v2.20.0 及更高版本中的 Docker Swarm 叢集中的目標。本指南演示瞭如何使用該服務發現機制。
Docker Swarm 服務發現架構
Docker Swarm 服務發現包含 3 種不同的角色:節點 (nodes)、服務 (services) 和任務 (tasks)。
第一個角色,節點 (nodes),代表 Swarm 中的主機。它可用於自動監控 Docker 守護程序或在 Swarm 主機上執行的 Node Exporter。
第二個角色,任務 (tasks),代表部署在 Swarm 中的任何單個容器。每個任務都會獲得其關聯的服務標籤。一個服務可以由一個或多個任務支援。
第三個角色,服務 (services),將發現部署在 Swarm 中的服務。它將發現服務暴露的埠。通常,你會希望使用任務 (tasks) 角色而不是此角色。
Prometheus 只會發現暴露埠的任務和服務。
注意本文的其餘部分假設你已經有一個正在執行的 Swarm。
設定 Prometheus
對於本指南,你需要設定 Prometheus。我們將假定 Prometheus 在 Docker Swarm 管理節點上執行,並且能夠訪問 /var/run/docker.sock 處的 Docker socket。
監控 Docker 守護程序
讓我們深入瞭解服務發現本身。
Docker 自身作為守護程序,暴露了可被 Prometheus 伺服器攝取的指標 。
你可以透過編輯 /etc/docker/daemon.json 並設定以下屬性來啟用它們。
{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}
你可以設定 Docker Swarm 節點的 IP,而不是 0.0.0.0。
需要重啟守護程序以使新配置生效。
Docker 文件 包含有關此內容的更多資訊。
然後,你可以透過提供以下 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
讓我們分析重標籤配置的每個部分。
- 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 文件包含完整的標籤列表,但這裡還有其他你可能會覺得有用的重標籤配置。
僅透過特定網路抓取指標
- 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 socket。Prometheus 提供了額外的配置選項,如果你更喜歡 HTTP 和 HTTPS 而不是 Unix socket,可以使用它們連線到 Swarm。
結論
有許多發現標籤可以供你使用,以更好地確定要監控哪些目標以及如何監控。對於任務,有超過 25 個標籤可用。請不要猶豫,檢視你的 Prometheus 伺服器的“服務發現”頁面(在“狀態”選單下),以檢視所有發現的標籤。
服務發現對你的 Swarm 棧不做任何假設,因此在適當配置的情況下,它應該可以插入到任何現有棧中。