前言:

本文的目標為安裝 Prometheus 和 Grafana 來監控 K3s / K8s 叢集,達成用 Grafana 串接 Prometheus 監控的指標並用圖表呈現,也能幫警報系統串接 Gmail SMTP server 發送警告信。

還沒有建好叢集的讀者請先參考我的另一篇文章:

本文有用圖形化工具 portainer 和指令兩種方式教學,想安裝 portainer 的話請先參考我的另一篇文章:

先用 helm 安裝 kube-prometheus-stack (內含 grafana):

可參考官方說明

1
helm install my-kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 55.5.1

雖然 terminal 很快就顯示跑完了,但可以觀察虛擬機還是在大量跑東西。

順帶一提筆者一開始使用 1G 或 2G RAM 的主節點都會無限失敗,後來換成 4G RAM 才成功,Grafana 需要吃的資源真的很多。

裝完後查看 services:

  • 用 portainer 看:

  • 也可以用指令看:
1
kubectl get services

把本機的 port 映射到叢集 pod 的 port 以便在本機瀏覽器觀看:

實際 services 名稱和 namespace 等等請參考你剛剛查看 services 的結果。

1
2
3
4
5
6
7
# grafana 
kubectl port-forward svc/my-kube-prometheus-stack-grafana 3000:80 -n default

# 如果想看 prometheus 可以順便開這個
kubectl port-forward svc/my-kube-prometheus-stack-prometheus 9090:9090 -n default
# 如果想看 prometheus alert manager 可以順便開這個
kubectl port-forward svc/my-kube-prometheus-stack-alertmanager 9093:9093 -n default

對上本機 port 後就可以在瀏覽器打開 localhost:<port> 了:

回到叢集找 grafana 的帳密:

用 portainer 看:

也可以用指令看:

1
kubectl get secrets

1
2
kubectl get secret my-kube-prometheus-stack-grafana -o jsonpath="{.data.admin-user}" | base64 --decode
kubectl get secret my-kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode

輸入帳密後成功登入:

選擇 Create your first dashboard:

選擇 Add visualization:

可以看到已經預設與 Prometheus 連接好了。

接下來就可以使用指標和語法來建立自己想看的 DashBoard。

當然也可以直接看一些預設好的模板,點擊 DashBoard:

點擊想要的就可以看到數據囉:

接下來試著讓 grafana 發送警報信:

會使用 gmail 免費的發信服務。

先幫發信郵箱開啟兩步驟驗證:

幫發信郵箱設定應用程式密碼:

如果失敗的話請參考官方說明

用 portainer 改:

先找到 grafana 的 ConfigMap,新增以下 sftp 設定:

1
2
3
4
5
6
[smtp]
enabled = true
from_address = <your_gmail_address>
host = smtp.gmail.com:465
password = <your_gmail_app_passward>
user = <your_gmail_address>

ConfigMap 改完後要將 Application 重啟才會適用,點選 Redeploy:

重啟完就可以了。

也可以用指令改:

因為一開始的安裝是直接裝官方的設定檔,如果想調整設定的話會分兩種做法:

  1. 繼續用官方的設定檔但是手動覆蓋參數。
  2. 需要用 helm 把專案載到本機後修改設定並更新。

第一種直接執行指令(記得改成你自己的):

1
2
3
4
5
6
7
8
9
helm upgrade my-kube-prometheus-stack \
prometheus-community/kube-prometheus-stack --version 55.5.1 \
--set-string grafana.'grafana\.ini'.smtp.enabled=true \
--set-string grafana.'grafana\.ini'.smtp.host="smtp.gmail.com:465" \
--set-string grafana.'grafana\.ini'.smtp.from_address="your_gmail_address" \
--set-string grafana.'grafana\.ini'.smtp.user="your_gmail_address" \
--set-string grafana.'grafana\.ini'.smtp.password="your_gmail_app_passward" \
--set-string grafana.defaultDashboardsTimezone="utc+8"
# 最後面是順便改時區

第二種步驟比較多,但當你要改的參數很多時這樣反而比較方便:

先移到你想要的目錄,然後把官方設定檔拉下來:

1
helm pull prometheus-community/kube-prometheus-stack --version 55.5.1

拉下來的會是壓縮檔,所以要解壓縮:

1
tar -zxvf kube-prometheus-stack-55.5.1.tgz

進入解壓縮完後的目錄:

1
cd kube-prometheus-stack

在 grafana/value.yaml 中 grafana.ini 的部分添加 smtp 配置,用 IDE 或 vim 都行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
... 省略
## Grafana's primary configuration
## NOTE: values in map will be converted to ini format
## ref: http://docs.grafana.org/installation/configuration/
##
grafana.ini:
paths:
data: /var/lib/grafana/
logs: /var/log/grafana
plugins: /var/lib/grafana/plugins
provisioning: /etc/grafana/provisioning
analytics:
check_for_updates: true
log:
mode: console
grafana_net:
url: https://grafana.net
server:
domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ .Values.ingress.hosts | first }}{{ else }}''{{ end }}"
smtp:
enabled: true
host: "smtp.gmail.com:465"
from_address: "your_gmail_address"
user: "your_gmail_address"
password: "your_gmail_app_passward"
... 省略

保存後執行指令:

1
2
# <your_folder_name> 是指定你剛解壓縮完的 kube-prometheus-stack 目錄路徑
helm upgrade my-kube-prometheus-stack <your_folder_name>

設定完 SMTP 配置後就可以來測試發信了:

回到你的 grafana 頁面,到以下位置點擊 Add contact point (或是你要改預設的也可以):

編輯完後按下 Test:

到收件信箱檢查是否收到信件:

到這邊就大功告成囉,如果想設定 prometheus alert manager 的 SMTP 也是差不多的流程,另外你也可以自己設定發警告信的條件。