容器網絡(十)如何快速部署 Prometheus?【79】

(八)如何快速部署 Prometheus?

上一節介紹了 Prometheus 的核心,多維數據模型。本節演示如何快速搭建 Prometheus 監控系統。node

(1)環境說明

​ 咱們將經過 Prometheus 監控兩臺 Docker Host:10.0.0.21 和 10.0.0.22,監控 host 和容器兩個層次的數據。docker

按照架構圖,咱們須要運行以下組件:json

(2)Prometheus Server

Prometheus Server 自己也將以容器的方式運行在 host 10.0.0.21 上。瀏覽器

(3)Exporter

Prometheus 有不少現成的 Exporter,完整列表請參考 https://prometheus.io/docs/instrumenting/exporters/架構

咱們將使用:學習

  1. Node Exporter,負責收集 host 硬件和操做系統數據。它將以容器方式運行在全部 host 上。
  2. cAdvisor,負責收集容器數據。它將以容器方式運行在全部 host 上。

(4)Grafana

顯示多維數據,Grafana 自己也將以容器方式運行在 host 10.0.0.21上。測試

(5)運行 Node Exporter

在兩個 host 上執行以下命令:this

docker run -d -p 9100:9100 \
  -v "/proc:/host/proc" \
  -v "/sys:/host/sys" \
  -v "/:/rootfs" \
  --net=host \
  prom/node-exporter \
  --path.procfs /host/proc \
  --path.sysfs /host/sys \
  --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

注意,這裏咱們使用了 --net=host,這樣 Prometheus Server 能夠直接與 Node Exporter 通訊。google

Node Exporter 啓動後,將經過 9100 提供 host 的監控數據。在瀏覽器中經過 http://10.0.0.21:9100/metrics 測試一下。url

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 9
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.14.4"} 1
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 1.221024e+06
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 1.221024e+06
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
# TYPE go_memstats_buck_hash_sys_bytes gauge
go_memstats_buck_hash_sys_bytes 1.445015e+06
# HELP go_memstats_frees_total Total number of frees.
# TYPE go_memstats_frees_total counter
go_memstats_frees_total 616
# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started.
# TYPE go_memstats_gc_cpu_fraction gauge
go_memstats_gc_cpu_fraction 0
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
# TYPE go_memstats_gc_sys_bytes gauge
go_memstats_gc_sys_bytes 3.436808e+06
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
# TYPE go_memstats_heap_alloc_bytes gauge
go_memstats_heap_alloc_bytes 1.221024e+06
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
# TYPE go_memstats_heap_idle_bytes gauge
go_memstats_heap_idle_bytes 6.4282624e+07
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
# TYPE go_memstats_heap_inuse_bytes gauge
go_memstats_heap_inuse_bytes 2.433024e+06
# HELP go_memstats_heap_objects Number of allocated objects.
# TYPE go_memstats_heap_objects gauge
go_memstats_heap_objects 7382
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
(6)運行 cAdvisor

在兩個 host 上執行以下命令:

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --net=host \
  google/cadvisor:latest

注意,這裏咱們使用了 --net=host,這樣 Prometheus Server 能夠直接與 cAdvisor 通訊。

cAdvisor 啓動後,將經過 8080 提供 host 的監控數據。在瀏覽器中經過 http://10.0.0.22:8080/metrics 測試一下。

# HELP cadvisor_version_info A metric with a constant '1' value labeled by kernel version, OS version, docker version, cadvisor version & cadvisor revision.
# TYPE cadvisor_version_info gauge
cadvisor_version_info{cadvisorRevision="8949c822",cadvisorVersion="v0.32.0",dockerVersion="19.03.13",kernelVersion="4.15.0-122-generic",osVersion="Alpine Linux v3.7"} 1
# HELP container_cpu_load_average_10s Value of container cpu load average over the last 10 seconds.
# TYPE container_cpu_load_average_10s gauge
container_cpu_load_average_10s{container_label_maintainer="",container_label_org_label_schema_description="",container_label_org_label_schema_name="",container_label_org_label_schema_schema_version="",container_label_org_label_schema_url="",container_label_org_label_schema_vcs_ref="",container_label_org_label_schema_vcs_url="",container_label_org_label_schema_vendor="",container_label_org_opencontainers_image_description="",container_label_org_opencontainers_image_revision="",container_label_org_opencontainers_image_source="",container_label_org_opencontainers_image_title="",container_label_org_opencontainers_image_url="",container_label_org_opencontainers_image_vendor="",container_label_works_weave_role="",id="/",image="",name=""} 0
container_cpu_load_average_10s{container_label_maintainer="",container_label_org_label_schema_description="",container_label_org_label_schema_name="",container_label_org_label_schema_schema_version="",container_label_org_label_schema_url="",container_label_org_label_schema_vcs_ref="",container_label_org_label_schema_vcs_url="",container_label_org_label_schema_vendor="",container_label_org_opencontainers_image_description="",container_label_org_opencontainers_image_revision="",container_label_org_opencontainers_image_source="",container_label_org_opencontainers_image_title="",container_label_org_opencontainers_image_url="",container_label_org_opencontainers_image_vendor="",container_label_works_weave_role="",id="/docker",image="",name=""} 0
container_cpu_load_average_10s{container_label_maintainer="",container_label_org_label_schema_description="",container_label_org_label_schema_name="",container_label_org_label_schema_schema_version="",container_label_org_label_schema_url="",container_label_org_label_schema_vcs_ref="",container_label_org_label_schema_vcs_url="",container_label_org_label_schema_vendor="",container_label_org_opencontainers_image_description="",container_label_org_opencontainers_image_revision="",container_label_org_opencontainers_image_source="",container_label_org_opencontainers_image_title="",container_label_org_opencontainers_image_url="",container_label_org_opencontainers_image_vendor="",container_label_works_weave_role="",id="/docker/95ddff3ce5af3f26e027ba9247838f8f0186f3cd104afcfb2109aa14bc49dd56",image="google/cadvisor:latest",name="cadvisor"} 0
(7)運行 Prometheus Server

在 host 10.0.0.22上執行以下命令:

docker run -d -p 9090:9090 \
  -v /root/prometheus.yml:/etc/prometheus/prometheus.yml \
  --name prometheus \
  --net=host \
  prom/prometheus

注意,這裏咱們使用了 --net=host,這樣 Prometheus Server 能夠直接與 Exporter 和 Grafana 通訊。

prometheus.yml 是 Prometheus Server 的配置文件。

最重要的配置是:

static_configs:
  - targets: ['localhost:9090','localhost:8080','localhost:9100','10.0.0.21:8080','10.0.0.21:9100']

指定從哪些 exporter 抓取數據。這裏指定了兩臺 host 上的 Node Exporter 和 cAdvisor。

另外 localhost:9090 就是 Prometheus Server 本身,可見 Prometheus 自己也會收集本身的監控數據。一樣地,咱們也能夠經過 http://10.0.0.22:9090/metrics 測試一下。

在瀏覽器中打開 http://10.0.0.22:9090 ,點擊菜單 Status -> Targets

以下圖所示:

全部 Target 的 State 都是 UP,說明 Prometheus Server 可以正常獲取監控數據。

(8)運行 Grafana

在 host 10.0.0.22 上執行以下命令:

docker run -d -i -p 3000:3000 \
  -e "GF_SERVER_ROOT_URL=http://grafana.server.name"  \
  -e "GF_SECURITY_ADMIN_PASSWORD=secret"  \
  --net=host \
  grafana/grafana

注意,這裏咱們使用了 --net=host,這樣 Grafana 能夠直接與 Prometheus Server 通訊。

-e "GF_SECURITY_ADMIN_PASSWORD=secret 指定了 Grafana admin用戶密碼 secret

Grafana 啓動後。在瀏覽器中打開 http://10.0.0.22:3000/

Name 爲 Data Source 命名,例如 prometheus

Type 選擇 Prometheus

Url 輸入 Prometheus Server 的地址 http://10.0.0.22:9090

其餘保持默認值,點擊 Add

若是一切順利,Grafana 應該已經可以訪問 Prometheus 中存放的監控數據了,那麼如何展現呢?

Grafana 是經過 Dashboard 展現數據的,在 Dashboard 中須要定義:

  1. 展現 Prometheus 的哪些多維數據?須要給出具體的查詢語言表達式。
  2. 用什麼形式展現,好比二維線性圖,儀表圖,各類座標的含義等。

可見,要作出一個 Dashboard 也不是件容易的事情。幸運的是,咱們能夠藉助開源社區的力量,直接使用現成的 Dashboard。

訪問 https://grafana.com/dashboards?dataSource=prometheus&search=docker,將會看到不少用於監控 Docker 的 Dashboard。

咱們能夠下載這些現成的 Dashboard,而後 import 到咱們的 Grafana 中就能夠直接使用了。

好比下載 Docker and system monitoring,獲得一個 json 文件,而後點擊 Grafana 左上角菜單 Dashboards -> Import。導入咱們下載的 json 文件。

Dashboard 將馬上展現出漂亮的圖表。

在這個 Dashboard 中,上部分是 host 的數據,咱們能夠經過 Node 切換不一樣的 host。

Dashboard 的下半部分展現的是全部的容器監控數據。Grafana 的 Dashboard 是可交互的,咱們能夠在圖表上只顯示指定的容器、選取指定的時間區間、從新組織和排列圖表、調整刷新頻率,功能很是強大。

好了,以上就完成了 Prometheus 監控系統的部署,更多功能你們能夠自行探索。到這裏咱們已經學習了多種 Docker 監控方案,是時候對它們作個比較了,下一節見。

相關文章
相關標籤/搜索