Prometheus Kubernetes k8s Grafana

Kubernetes 效能監控利器-Promethus 簡介

石偉琪 2018/11/22 20:57:27
5405

Kubernetes 效能監控利器-Promethus 簡介


簡介

Prometheus 介紹,以及安裝與設定

作者

石偉琪


1. Prometheus 介紹
 

Prometheus 是由 SoundCloud 建立,用來做為監控與告警的 open-source 系統。Prometheus 2016 年成為第二個加入CNCF的專案(第一個則是 Kubernetes

 

Prometheus 具有以下的特點:

 

  • 多維度的資料模型:透過 metrics 名稱 與 key / value 來區分的時間序列資料
  • 靈活的查詢語言(PromQL)
  • 不依賴分散式儲存設備,每台主機都是獨立自主的
  • 時間序列資料是由 Prometheus server 發起,經由 http 將 metrics 資料,由設定的主機上取回(這點正好與 zabbix 相反)
  • 支持多重的儀表板
 
 
2. Prometheus 架構:
 
Prometheus 的架構如下圖所示(原圖出處:https://prometheus.io/assets/architecture.png )

 

 其中:
 
  • Prometheus server :裡面包含了用來收集時間序列資料的 TSDB,以及 HTTP server
  • Jobs / exporters :像是本文後面會提到的 node exporter,這些 exporter 是用來產生 metrics data 給 Prometheus server ,做為收集、監測使用
  • Alert manager :當到達某些事先設定的監控條件時,用來發出告警,通知相關管理員的元件
  • Grafana:用來呈現收集到的 metrics data 用,透過 web browser 即可觀看
 
 
3. 環境準備:
 
本文是將 Prometheus 以及 Grafana 安裝在 kubernetes cluster 以外的主機上,環境說明如下:
 
 
Hostname OS IP 說明
ai-01 Red Hat 7.6 10.0.2.10 k8s master 兼 worker node
ai-02 Red Hat 7.6 10.0.2.11 k8s backup master 兼 worker node
ai-etcd Red Hat 7.6 10.0.2.12 Prometheus server 兼 Grafana server
.Prometheus: 2.5.0
.Grafana: 5.2.2
ai-01 ai-02 上安裝了 k8s 以及其他的服務,而 Prometheus 則是透過安裝在 ai-01 / ai-02 上的 node exporter 來收集效能的數據,最後再經由 Grafana 來呈現效能數據。
 
 
4. Prometheus 安裝與設定
 
1) 在 ai-etcd 上安裝 Prometheus Server
 
server端的安裝方式,大概又可以分為兩種:一種是把 Prometheus server 安裝在 Kubernetes 的環境內,也就是把它裝成一個 pod 來運作;另一種則是在 Kubernetes cluster 以外,網路能夠連得到的地方,找台主機安裝,本文採用後者的方式來安裝。

 

首先,從 Prometheus 官網上 ( https://prometheus.io/download/ ) 下載檔案:本文內準備的環境是 Red Hat 7.6, 故下載 prometheus-2.5.0.linux-amd64.tar.gz

 

2) 將下載回來的檔案,在主機上合適的目錄下解開,例:/opt/prometheus-2.5.0

 

3) 解開後,可以拿目錄裡的 prometheus.yml 來加以修改,這個稍候等到 client 端上 node exporter 這些都安裝好了之後,再回過頭來設定 prometheus server

 

4) 接下來就是在 k8s cluster 內,安裝並設定 node exporter。直接在 ai-01 / ai-02 上,下載 node exporter image ,下載的指令為 docker pull prom/node-exporter:v0.14.0

 

5) 然後,到以下的網頁下載 daemonset.yaml 以及 service.yaml 這兩個檔案

 

 
6) 將步驟 5) 下載回來的 daemonset.yaml service.yaml ,使用以下的指令 ,建立並設定 node exporter

 

kubectl create -f daemonset.yaml

kubectl create -f service.yaml

 

設定好了之後,就會看到多了 node exporter pod 出現了(因為本文使用的 lab 2 worker nodes,所以會出現兩個 node exporter pod)

 

 
安裝到這裡,client 端最主要的工作就大功告成。接下來,再回過頭來設定 server 端。
 
7) 將 prometheus.yml copy /etc 目錄下,進行必要的修改。以下介紹幾個部份
 

[root@ai-etcd data]# cat /etc/prometheus.yml

# my global config

global:

  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.

  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.

  # scrape_timeout is set to the global default (10s).

 

# Alertmanager configuration

#alerting:

#  alertmanagers:                                       <— alter manager 的設定檔,之後用有到時再來設定

#  - static_configs:

#    - targets:

      # - alertmanager:9093

 

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.

rule_files:

  # - "first_rules.yml"

  # - "second_rules.yml"

 

# A scrape configuration containing exactly one endpoint to scrape:

# Here it's Prometheus itself.

scrape_configs:

  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.

  - job_name: 'prometheus'

 

    # metrics_path defaults to '/metrics'

    # scheme defaults to 'http'.

 

    static_configs:

    - targets: ['localhost:9090']                        <— Prometheus 使用 9090 port

 

## node_exporter of ai-01                             <— node exporter 的設定,每個 node 有獨立的設定

  - job_name: 'node_exporter_ai-01'

 

    static_configs:

    - targets: ['10.0.2.10:9100']                       <— node exporter 用的 port 9100

 

## node_exporter of ai-02

  - job_name: 'node_exporter_ai-02'

 

    static_configs:

    - targets: ['10.0.2.11:9100']

 

 

設定完畢後,存檔離開

 

8) 測試 Prometheus 是否能正確地啟動

 

手動執行以下的指令將 Prometheus 帶起來

 

 # /opt/prometheus-2.5.0/prometheus --config.file=/etc/prometheus.yml --storage.tsdb.path=/data --storage.tsdb.retention=30d

 

其中:

--config.file=/etc/prometheus.yml  : 設定檔是 /etc/prometheus.yml(格式為 yaml)

 

--storage.tsdb.path=/data :資料要儲存在哪個路徑之下

 

--storage.tsdb.retention=30d :資料要儲存多久,此範例為 30 天(30d)

 

 
若可以正確的啟動,可以看到 9090 port 正被 prometheus 這個 user 所使用

 

再以 ps -ef | grep $PID ($PID 可由上圖看到是 81284)  來檢查

 

 
9) 除了 check process 外,也可以連到 Prometheus 自己的 Dashboard 來查看,請用 Chrome 連到 http://Prometheus_SERVER_IP:9090/  ,會看到類似如下的畫面
 
 
Status —> Target ,就可以看到 prometheus.yaml 裡設定的 targets
 
 

Graph —> 然後,可以在裡面試著輸入 metrics(例如:node_load1),查看data

 

 
10) 確認可以看到步驟 8) 以及 9) 的資訊後,就可以將 prometheus 註冊為 service,讓系統啟動時,將 Prometheus 自動帶起來。
 
 
5. Grafana 安裝與設定
 
裝好 Prometheus server ,也開始收集資料之後,接著,就可以把資料以 Grafana 呈現出來。
 
1) 先從 Grafana 官網( https://grafana.com/grafana/download )上下載檔案,本文內準備的環境是 Red Hat 7.6, 故下載 grafana-5.3.4.linux-amd64.tar.gz .
 
2) 將下載回來的檔案,在主機上合適的目錄下解開,例:/opt/grafana-5.3.4
 
3) 直接將 Grafana 註冊為 service,接著以 systemctl start grafana 將 Grafana 啟動
 
4) 啟動後,就可以 Chrome 連到  http://Grafana_SERVER_IP:3000/  查看先前用 Prometheus 收集的 metrics 了
 
5) 登入後,系統會提示要先設定 database source 的連線方式,如下圖所示
 
 
接著會出現下面的畫面
 
因為使用的是 Prometheus 當做 data source,把名稱以及對應的連線方式設定好了後,就可以按下 Save & Test 測試剛剛的設定,如果成功的話,就會把這個 data source  的設定儲存起來
 
 
 
最後,就可以開始建立 dashboard,來呈現想要觀看的資料了。
 
 
6. Grafana Dashboard 介紹
 
Grafana 最強大的功能,就在於它的顯示能力,在這裡稍微介紹一下這部份的功能。
 
Grafana 支援多個不同的 dashboard,可以根據實際的需求,在每個 dashboard 上,顯示不同的相關資料。
 
管理者除了可以自行建立 dashboard 外,也可以從 Grafana 的網站( https://grafana.com/dashboards )上,下載合適的 dashboard,直接 import,就可以省去自行創建 dashboard 的時間。
 
本文的環境裡,一共使用了四個 dashboard
 
 
 
其中,Node Exporter Server Metrics 監控的是由 node exporter 所產出的 metrics
 
 
這個 dashboard 可以顯示出主機的相關效能,像是 CPU  使用率 、Memory 使用率、系統 loading 、硬碟 使用率 、網路 使用率 .... 等
 
 
而這個 dashboard,則是可以看到以 pod 為單位的相關效能數據。
 
 
deployment 這張 dashboard 則是可以看到以 k8s 裡,以 deployment 為單位的效能相關數據
 
 
最後這一張 dashboard,是以 cluster 為顯示單位,顯示 k8s cluster 整體的效能相關數據。
 
除了顯示單位可以從不同的層面來查看外,因為 Prometheus 本身是一個時間序列資料庫,在保存效能數據時,有特別加入時間戳記,因此在顯示資料時,也可以依特定的時間區間,更有彈性的將資料呈現出來。
 
 
 
 
7. 結論
 
Prometheus 加上 Grafana 這兩款軟體,為監控 k8s 帶來不同於以往的監控軟體的便利性。如果您還在尋覓 k8s 合適的監控軟體,相信這會是您絕佳的選擇。
石偉琪