Prometheus 的新戰(zhàn)場:精準監(jiān)控阿里云 AKS Serverless 集群
引言
我們緊接著上篇的 PromQL,接著往上蓋大樓。這篇我們的主角是 Prometheus-Operator 的 Prometheus,它的重要性就不言而喻了。
Prometheus-Operator 是 Kubernetes 生態(tài)中廣泛應用的監(jiān)控組件,能夠簡化 Prometheus 的部署和管理。然而,隨著云原生技術的發(fā)展,監(jiān)控阿里云 AKS Serverless 集群成為了一個新的挑戰(zhàn)。這些服務本質上是無服務器的,無法通過傳統(tǒng)的節(jié)點指標采集方式進行監(jiān)控。因此,我們需要對 Prometheus 自身進行調整,以更好地適配阿里云 AKS Serverless 場景。
本文將探討如何通過重塑 Prometheus ,使其高效監(jiān)控阿里云 AKS Serverless 環(huán)境。
開始
基本設計
prometheus-operator 的控制鏈路其實非常簡單,我們只需要知道以下基本原理就行:
? PodMonitor 和 ServiceMonitor 最終是用于生成 Prometheus 配置文件中的 srape_config;
? Prometheus 可以使用一個 HTTP Post 請求 /-/reload 來在運行時重新加載配置文件使新的 scrape_config 生效;
以上文為例,prometheus-operator 的控制鏈路是:
Prometheus
prometheus-operator 監(jiān)聽 Promtheus 資源,當有 Add Event 發(fā)生時,prometheus-operator 將以 StatefulSet 的形式部署 Prometheus 實例。每一個 Prometheus Pod 里有兩個容器:
? prometheus 容器:主容器,使用 /etc/prometheus/config_out/prometheus.env.yaml 作為主要的配置文件:
...
- --config.file=/etc/prometheus/config_out/prometheus.env.yaml
...
? prometheus-config-reloader 容器:輔助容器,用于監(jiān)聽上游配置文件的變化并調用主容器的 reload 接口重新加載配置;
當我們觀察這個 Pod 的 volumes 時候,有兩個 volume 可以重點關注:
...
volumes:
- name: config
secret:
defaultMode: 420
secretName: prom-agent-prometheus-agent
- name: config-out
emptyDir:
medium: Memory
...
? config-out:EmptyDir 類型的卷,主要是用于 prometheus 容器與 prometheus-config-reloader 容器的數據共享,同時掛載于兩個容器的 /etc/prometheus/config_out/ 中;
? config:底層是一個 Secret,這個 config 將被掛載為 prometheus-config-reloader 容器中的 /etc/prometheus/config/prometheus.yaml.gz 。 prometheus-config-reloader 會監(jiān)聽這個文件的變化,一旦有變化,將基于新的文件內容生成新的配置文件 /etc/prometheus/config_out/prometheus.env.yaml。 prometheus-config-reloader 將調用主容器的 reload API 來重新加載配置文件;
PodMonitor / ServiceMonitor
? prometheus-operator 監(jiān)聽 PodMonitor 和 ServiceMonitor 的變化。一旦對應資源發(fā)生了變化,prometheus-operator 將基于新的資源生成新的配置文件并將其更新到對應的 Secrets 中。由于對應 Secrets 以文件形式掛載于 prometheus-config-reloader 容器中并被監(jiān)聽文件變化,所以當底層 Secrets 發(fā)生了變化,kubelet 將分鐘級傳播變化到對應容器內部,從而觸發(fā) prometheus-config-reloader 容器內的監(jiān)聽邏輯。
? Secrets 內部是一個 Base64 之后的 gz 格式的 prometheus.yaml,比如我們可以用下面這種方式解碼出 prometheus.yaml:
kubectl get secrets prometheus-k8s -o jsonpath="{.data.prometheus\.yaml\.gz}" | base64 -d > prometheus.yaml.gz
gzip -d prometheus.yaml.gz
我們這些了解完成之后,對于我們后面的改進可謂是……語文不好,有點丟人,想不出來成語了。
Prometheus CRD YAML 優(yōu)化
我們先從 Prometheus 的持久化數據說起:
storage:
volumeClaimTemplate:
spec:
storageClassName: alicloud-nas-subpath
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 15Gi
本地存儲優(yōu)化;
啟用 WAL 壓縮;
wal_compression: true
減少數據保留時間;
retention: 7d
還有我們資源的優(yōu)化,如果你的集群應用很多,資源太少,就會導致 pod 異常,這邊你自己調整:
resources:
limits:
cpu: "3"
memory: 3Gi
requests:
cpu: 1000m
memory: 1024Mi
完整文件;
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 3.0.1
name: k8s
namespace: monitoring
spec:
alerting:
alertmanagers:
- apiVersion: v2
name: alertmanager-main
namespace: monitoring
port: web
enableFeatures: []
storage:
volumeClaimTemplate:
spec:
storageClassName: alicloud-nas-subpath
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 15Gi
externalLabels: {}
image: quay.io/prometheus/prometheus:v3.0.1
nodeSelector:
kubernetes.io/os: linux
podMetadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 3.0.1
podMonitorNamespaceSelector: {}
# matchExpressions:
# - key: kubernetes.io/metadata.name
# operator: In
# values:
# - monitoring
# - lobby
podMonitorSelector: {}
probeNamespaceSelector: {}
probeSelector: {}
replicas: 2
resources:
limits:
cpu: "5"
memory: 5Gi
requests:
cpu: 2000m
memory: 2048Mi
ruleNamespaceSelector: {}
ruleSelector: {}
scrapeConfigNamespaceSelector: {}
scrapeConfigSelector: {}
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccountName: prometheus-k8s
serviceMonitorSelector: {}
serviceMonitorNamespaceSelector: {}
# matchExpressions:
# - key: kubernetes.io/metadata.name
# operator: In
# values:
# - monitoring
# - lobby
version: 3.0.1
retention: 15d
wal_compression: true
擴展
因為 Prometheus 這邊優(yōu)化的還挺多的,所以我們這一篇就先講到這里,后面我們會更多的剖析相關內容。
? Prometheus Agent
? PrometheusRule
結語
我們 Prometheus 基礎的優(yōu)化和改進就結束了,相比較前幾篇,這篇的東西不是很多。其實還有很多的東西都需要講,我會把它們給分開。