Prometheus Deployment on Kubernetes

2020 It邦幫忙鐵人賽 系列文章

由於我比較熟悉 GCP / GKE 的服務,這篇的操作過程都會以 GCP 平台作為範例,不過操作過程大體上是跨平台通用的。

寫文章真的是體力活,覺得我的文章還有參考價值,請左邊幫我點讚按個喜歡,右上角幫我按個追縱,底下歡迎留言討論。給我一點繼續走下去的動力。

對我的文章有興趣,歡迎到我的網站上 https://chechia.net 閱讀其他技術文章,有任何謬誤也請各方大德直接聯繫我,感激不盡。

Exausted Cat Face


摘要

  • Prometheus Introduction
  • Deploy Prometheus

Prometheus Introduction

生產環境與非生產環境,其中的一指標就是有沒有足夠完整的服務監測系統,這句話可以看出服務監測對於產品化是多麼重要。而監控資料 (metrics) 的收集與可視化工具其實非常多,例如上周介紹的 ELK Stack,這次我們要來介紹另外一個很多人使用的 prometheus。

Promethues 在官網上提到 是一個 Monitoring system and time series database

  • 可以收集高維度的資料
  • 使用自己的 PromQL 做有效且精簡的資料查詢
  • 內建資料瀏覽器,並且與 Grafana 高度整合
  • 支援 sharding 與 federation,來達到水平擴展
  • 有許多隨插即用的整合 exporter,例如 redis-exporter, kafka-exporter,kubernetes-exporter ,都可以直接取得資料
  • 支援 alert,使用 PromQL 以及多功能的告警,可以設定精準的告警條件

與 ELK 做比較

基本上 Prometheus 跟 ELK 比,其實是很奇怪的一件事,但這也是最常被問的一個問題。兩者在本質上是完全不同的系統。

  • Prometheus 是 based on time series database 的資料收集系統
  • ELK 是基於全文搜索引擎的資料查詢系統

是的,他們都能做 metrics 收集,在有限的尺度下,能達到一樣的效果。但這樣說的意思就等於是在說 mesos DC/OS 與 kubenetes 都能跑 container cluster 一樣,底下是完全不一樣的東西。

兩者的差異使用上差非常多

  • metrics 結構: ELK 借助全文搜索引擎,基本上送什麼資料近來都可以查找。Prometheus metrics 拉進來是 time series 的 key-value pairs。
  • 維護同樣的 metrics,prometheus 的使用的儲存空間遠小於 elasticsearch
  • prometheus 針對 time based 的搜尋做了很多優化,效能很高
  • Prometheus 對於記憶體與 cpu 的消耗也少很多
  • Elasticsearch 資源上很貴,是因為在處理大量 text log 的時候,他能夠用後段的 pipeline 處理內容,再進行交叉比對,可以從 text 裡面提取很多未事先定義的資料
  • Elasticsearch 的維護工作也比較複雜困難

如果要收集服務運行資料,可以直接選 prometheus。如果有收集 log 進行交叉比對,可以考慮 elk。

Helm

我們這邊用 helm 部屬,之所以用 helm ,因為這是我想到最簡單的方法,能讓輕鬆擁有一套功能完整的 prometheus。所以我們先用。

沒用過 helm 的大德可以參考 Helm Quickstart,先把 helm cli 與 kubernetes 上的 helm tiller 都設定好

Deploy Prometheus

我把我的寶藏都放在這了https://github.com/chechiachang/prometheus-kubernetes

下載下來的 .sh ,跑之前養成習慣貓一下

1cat install.sh
2
3#!/bin/bash
4HELM_NAME=prometheus-1
5
6helm upgrade --install ${HELM_NAME} stable/prometheus \
7  --namespace default \
8  --values values-staging.yaml

Configuration

Prometheus Stable Chart

values.yaml 很長,但其實各個元件設定是重複的,設定好各自的 image, replicas, service, topology 等等

 1alertmanager:
 2  enabled: true
 3
 4kubeStateMetrics:
 5  enabled: true
 6
 7nodeExporter:
 8  enabled: true
 9
10server:
11  enabled: true
12
13pushgateway:
14  enabled: true

底下有更多 runtime 的設定檔

  • 定義好 global 的 scrape 間距,越短 metrics 維度就越精準
  • PersistenVolume 強謝建議開起來,維持歷史的資料
    • 加上 storage usage 的 self monitoring(之後會講) 才不會滿出來 server 掛掉
  • server 的 scrapeConfigs 是 server 去收集的 job 設定。稍後再來細講。
 1server:
 2  global:
 3    ## How frequently to scrape targets by default
 4    ##
 5    scrape_interval: 10s
 6    ## How long until a scrape request times out
 7    ##
 8    scrape_timeout: 10s
 9    ## How frequently to evaluate rules
10    ##
11    evaluation_interval: 10s
12  persistentVolume:
13    ## If true, Prometheus server will create/use a Persistent Volume Claim
14    ## If false, use emptyDir
15    ##
16    enabled: true
17
18    ## Prometheus server data Persistent Volume access modes
19    ## Must match those of existing PV or dynamic provisioner
20    ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
21    ##
22    accessModes:
23      - ReadWriteOnce
24
25    ## Prometheus server data Persistent Volume annotations
26    ##
27    annotations: {}
28
29    ## Prometheus server data Persistent Volume existing claim name
30    ## Requires server.persistentVolume.enabled: true
31    ## If defined, PVC must be created manually before volume will be bound
32    existingClaim: ""
33
34    ## Prometheus server data Persistent Volume mount root path
35    ##
36    mountPath: /data
37
38    ## Prometheus server data Persistent Volume size
39    ##
40    size: 80Gi
41
42alertmanagerFiles:
43
44serverFiles:

部屬完看一下

 1kubectl get pods --selector='app=prometheus'
 2
 3NAME                                             READY   STATUS    RESTARTS   AGE
 4prometheus-alertmanager-694d6694c6-dvkwd         2/2     Running   0          8d
 5prometheus-kube-state-metrics-85f6d75f8b-7vlkp   1/1     Running   0          8d
 6prometheus-node-exporter-2mpjc                   1/1     Running   0          8d
 7prometheus-node-exporter-kg7fj                   1/1     Running   0          51d
 8prometheus-node-exporter-snnn5                   1/1     Running   0          8d
 9prometheus-pushgateway-5cdfb4979c-dnmjn          1/1     Running   0          8d
10prometheus-server-59b8b8ccb4-bplkx               2/2     Running   0          8d
11
12kubectl get services --selector='app=prometheus'
13
14NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
15prometheus-alertmanager         ClusterIP   10.15.241.66   <none>        80/TCP     197d
16prometheus-kube-state-metrics   ClusterIP   None           <none>        80/TCP     197d
17prometheus-node-exporter        ClusterIP   None           <none>        9100/TCP   197d
18prometheus-pushgateway          ClusterIP   10.15.254.0    <none>        9091/TCP   197d
19prometheus-server               ClusterIP   10.15.245.10   <none>        80/TCP     197d
20
21kubectl get endpoints --selector='app=prometheus'
22
23NAME                            ENDPOINTS                                             AGE
24prometheus-alertmanager         10.12.6.220:9093                                      197d
25prometheus-kube-state-metrics   10.12.6.222:8080                                      197d
26prometheus-node-exporter        10.140.0.30:9100,10.140.0.9:9100,10.140.15.212:9100   197d
27prometheus-pushgateway          10.12.6.211:9091                                      197d
28prometheus-server               10.12.3.14:9090                                       197d

簡單說明一下

  • prometheus-server 是主要的 api-server 以及 time series database
  • alertmanager 負責告警工作
  • pushgateway 提供 client 端主動推送 metrics 給 server 的 endpoint
  • kube-state-metrics 是開來收集 cluster wide 的 metrics, 像是 pods running counts, deployment ready count, total pods number 等等 metrics
  • node-exporter 是 daemonsets, 把每一個 node 的 metrics, 像是 memory, cpu, disk…等資料,收集出來

主要服務存取就是透過 prometheus-server

Access Prometheus server

除了直接 exec -it 進去 prometheus-server 以外,由於 prometheus 本身有提供 web portal, 所以我們這邊透過 port forwarding 打到本機上

1PROMETHEUS_POD_NAME=$(kc get po -n default --selector='app=prometheus,component=server' -o=jsonpath='{.items[0].metadata.name}')
2
3kubectl --namespace default port-forward ${PROMETHEUS_POD_NAME} 9090

透過 browser 就可以連入操作

1http://localhost:9090

也可以透過 HTTP API 用程式接入控制

Prometheus Web

Prometheus 本慎提供的 UI 其實功能就很強大

  • 可以查到 (已經匯入存在) 的 metrics
  • 可以在上面執行 PromQL 查詢語法
  • 查詢運行的 status
  • 查詢目前所有收集的 targets 的狀態,有收集器掛了也可以在這邊看到

小結

  • 輕鬆自架 prometheus
  • Prometheus 頁面有精簡,但是功能完整的 graph 製圖
  • 但大家通常會使用 Grafana 搭配使用, 用過都說讚, 我們明天繼續