Prometheus-operator (prometheus-stack) 簡介

前言

目前使用 Helm 來安裝時採用的方法,透過自定義 CRD (Kubernetes Custom Resource) 來生成 prometheus 的各種元件

也因為使用 CRD 的關係,學習上會比較不直觀,這部分還是需要對 prometheus 官方文件熟悉一點
預計之後會再針對基本的 prometheus, alertmanager 設定再整理一下

會把 API 存在 monitoring.coreos.com/v1

helm chart 連結

helm安裝流程
1
2
3
4
5
6
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace
# 安裝完之後進入介面 輸入以下指令之後透過 http://localhost:8080 進入
kubectl port-forward -n=monitoring svc/kube-prometheus-stack-grafana 8080:80
# 需要帳號密碼,透過 secret kube-prometheus-stack-grafana 取得

這個 stack 包含了很多東西:Prometheus, Prometheus Operator, Alertmanager, Grafana, kube-state-metrics, prometheus-node-exporter …等元件

以下是主要額外定義的 CRD:

  • Prometheus:聲明式和管理 Prometheus Server 實例;
    • config 使用 secret 存放,為 .yaml.gz 格式 (可用 gzip -d 解壓)
  • ServiceMonitor:負責聲明式的管理監控配置;
    • 依照設定的內容產生 jobs config 內容,並且更新到 Prometheus
  • PrometheusRule:負責聲明式的管理告警配置;
    • 定義 prometheus rules 使用 (新增於 configmap)
    • Rule 的設定是透過 configmap 掛給 Prometheus 的,名稱為 prometheus-prometheus-operator-kube-p-prometheus-rulefiles-0
  • Alertmanager:聲明式的建立和管理 Alertmanager 實例。
    • 使用 alertmanagerconfigs 丟入設定檔動態載入

Prometheus 這個 Pod 會跑 2 個 container,image 分別為:

  • prometheus-config-reloader 負責監控 secret 物件,一有變動就產生新的 config
    • 可看到 prometheus-config-reloader 的執行指令參數 --watch-dir 就是指定這個 configmap 掛載的點,因此只要新增 configmap 就可以新增 rule
    • prometheus 實際跑 server 的 container,是讀取 config_out 目錄上的設定檔

prometheus 的設定是使用 secret 的方式來掛載,經過 initcontainer 處理後轉成可使用的 config,目錄在 /etc/prometheus/config_out/prometheus.env.yaml

  • config:由 secret 掛載
  • config_out (實際載入的):emptyDir 共用 (由 reloader 產生)
  • rule_files:由 configMap 掛載
    • 使用 PrometheusRule 來新增,他會去更新 configMap

在 Prometheus stack 的系統中,都是透過 labels 來連接的,以下幾個例子:

  • Prometheus instance ↔ ServiceMonitors (產生對應 jobs)
  • ServiceMonitors ↔ Service (設定 metrices 位置)
  • PrometheusRule ↔ Prometheus instance (ruleSelector)

ServiceMonitor

透過綁定 Service 來監控 APP,綁定的方式是使用 label 加上對應的 port Name

以下範例是已經有建立了一個 deployment 與 svc

該 deployment 的 image 設計已經對 /metrics 丟了一些資料,因此沒有利用到額外的 exporter

ServiceMonitor.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
namespace: monitoring
labels:
team: frontend
spec:
# 設定搜尋的 namespace, 可透過 any 代表所有 namespace
namespaceSelector:
matchNames:
- default
# 對應到 service 的 label
selector:
matchLabels:
app: example-app
# endpoints: 對應到 service 的 port 名稱
endpoints:
- port: web
path: /metrics # 為預設值
interval: 15s

設定完後,就可以在 prometheus 上看到新的 target 抓取該 APP 的 metrics

Prometheus instance

這部分比較不會調整到,可聚焦在 label selector 的部分

  • 有 serviceMonitorNamespaceSelector, podMonitorSelector ruleSelector

初始化可以使用 values.yaml 調整,也可以直接 kubectl edit

Prometheus.yaml
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
annotations:
meta.helm.sh/release-name: prometheus-operator
meta.helm.sh/release-namespace: monitoring
generation: 1
labels:
app: kube-prometheus-stack-prometheus
app.kubernetes.io/instance: prometheus-operator
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/part-of: kube-prometheus-stack
app.kubernetes.io/version: 28.0.1
chart: kube-prometheus-stack-28.0.1
heritage: Helm
release: prometheus-operator
name: prometheus-operator-kube-p-prometheus
namespace: monitoring
spec:
additionalScrapeConfigs:
key: additional-scrape-configs.yaml
name: prometheus-operator-kube-p-prometheus-scrape-confg
alerting:
alertmanagers:
- apiVersion: v2
name: prometheus-operator-kube-p-alertmanager
namespace: monitoring
pathPrefix: /
port: http-web
externalUrl: http://prometheus-sit.k8sbridge.com/
image: quay.io/prometheus/prometheus:v2.32.1
podMonitorNamespaceSelector: {}
podMonitorSelector: {}
portName: http-web
probeNamespaceSelector: {}
probeSelector:
matchLabels:
release: prometheus-operator
replicas: 1
retention: 10d
routePrefix: /
ruleNamespaceSelector: {}
ruleSelector:
matchLabels:
release: prometheus-operator
secrets:
- etcd-certs
serviceAccountName: prometheus-operator-kube-p-prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector: {}
version: v2.32.1

PrometheusRule

產生 jobs,內容與原本的 prometheus rule 很接近

PrometheusRule.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
release: prometheus-operator
name: kube-prometheus-stack-ray.rules
spec:
groups:
- name: ray.rules
rules:
- alert: masterNodeDiskChecking
annotations:
message: |
haha! I am Ray and I learning prometheus~~
expr: node_filesystem_avail_bytes{device="/dev/mapper/ubuntu--vg-ubuntu--lv",fstype="xfs",mountpoint="/",instance="192.168.1.81:9100"} > 0
for: 15m
labels:
severity: warning

AlertmanagerConfig

這部分會與原本的 secret alertmanager-prometheus-operator-kube-p-alertmanager 一起使用,定義的內容都會是在 secret 內部的 (所以要改 global 的設定需要去調整 secret)
要注意的是在 route 的部分,採用這個方式建立的都會自動產生一個 matcher: namespace 來讓每一條 config 都只負責自己的 namespace
以下是簡易設定 slack 通知的

AlertmanagerConfig.yaml
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
27
28
29
30
31
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: config-example
labels:
alertmanagerConfig: example
spec:
route:
groupBy: ['alertname', 'job'] # 報警分組依據
groupWait: 10s # 最初即第一次等待多久時間傳送一組警報的通知
groupInterval: 10s # 在傳送新警報前的等待時間
repeatInterval: 12h # 傳送重複警報的週期
receiver: 'slack-example' # 傳送警報的接收者的名稱,以下receivers name的名稱
receivers:
- name: 'slack-example'
slackConfigs:
- sendResolved: false
apiURL:
name: 'slack-config'
key: 'urlSecret'
channel: '#alertmanager'

---
# 這裡的 urlSecret 要到 slack 去設定取得
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: slack-config
data:
urlSecret: **********************

小結

這邊算是做一個簡易的紀錄,把各元件基本的設定寫下來,但實際上要先理解原本 prometheus/alertmanager 後才有辦法設定這些,這邊網路上的資源蠻多的,之後再來整理整理

參考資料

Prometheus Operator — 為 Kubernetes 設定及管理 Prometheus | by smalltown | getamis
使用Operator管理Prometheus - prometheus-book (gitbook.io)
通过ServiceMonitor创建服务发现 (aliyun.com)

作者

林禹志 RayLin

發表於

2022-09-14

更新於

2022-09-26

許可協議

評論