Prometheus 的新戰(zhàn)場(chǎng):精準(zhǔn)監(jiān)控阿里云 AKS Serverless 集群
引言
我們緊接著上篇的 PromQL,接著往上蓋大樓。這篇我們的主角是 Prometheus-Operator 的 Prometheus,它的重要性就不言而喻了。
Prometheus-Operator 是 Kubernetes 生態(tài)中廣泛應(yīng)用的監(jiān)控組件,能夠簡(jiǎn)化 Prometheus 的部署和管理。然而,隨著云原生技術(shù)的發(fā)展,監(jiān)控阿里云 AKS Serverless 集群成為了一個(gè)新的挑戰(zhàn)。這些服務(wù)本質(zhì)上是無(wú)服務(wù)器的,無(wú)法通過(guò)傳統(tǒng)的節(jié)點(diǎn)指標(biāo)采集方式進(jìn)行監(jiān)控。因此,我們需要對(duì) Prometheus 自身進(jìn)行調(diào)整,以更好地適配阿里云 AKS Serverless 場(chǎng)景。
本文將探討如何通過(guò)重塑 Prometheus ,使其高效監(jiān)控阿里云 AKS Serverless 環(huán)境。
開始
基本設(shè)計(jì)
prometheus-operator 的控制鏈路其實(shí)非常簡(jiǎn)單,我們只需要知道以下基本原理就行:
? PodMonitor 和 ServiceMonitor 最終是用于生成 Prometheus 配置文件中的 srape_config;
? Prometheus 可以使用一個(gè) HTTP Post 請(qǐng)求 /-/reload 來(lái)在運(yùn)行時(shí)重新加載配置文件使新的 scrape_config 生效;
以上文為例,prometheus-operator 的控制鏈路是:
Prometheus
prometheus-operator 監(jiān)聽(tīng) Promtheus 資源,當(dāng)有 Add Event 發(fā)生時(shí),prometheus-operator 將以 StatefulSet 的形式部署 Prometheus 實(shí)例。每一個(gè) Prometheus Pod 里有兩個(gè)容器:
? prometheus 容器:主容器,使用 /etc/prometheus/config_out/prometheus.env.yaml 作為主要的配置文件:
...
- --config.file=/etc/prometheus/config_out/prometheus.env.yaml
...
? prometheus-config-reloader 容器:輔助容器,用于監(jiān)聽(tīng)上游配置文件的變化并調(diào)用主容器的 reload 接口重新加載配置;
當(dāng)我們觀察這個(gè) Pod 的 volumes 時(shí)候,有兩個(gè) volume 可以重點(diǎn)關(guān)注:
...
volumes:
- name: config
secret:
defaultMode: 420
secretName: prom-agent-prometheus-agent
- name: config-out
emptyDir:
medium: Memory
...
? config-out:EmptyDir 類型的卷,主要是用于 prometheus 容器與 prometheus-config-reloader 容器的數(shù)據(jù)共享,同時(shí)掛載于兩個(gè)容器的 /etc/prometheus/config_out/ 中;
? config:底層是一個(gè) Secret,這個(gè) config 將被掛載為 prometheus-config-reloader 容器中的 /etc/prometheus/config/prometheus.yaml.gz 。 prometheus-config-reloader 會(huì)監(jiān)聽(tīng)這個(gè)文件的變化,一旦有變化,將基于新的文件內(nèi)容生成新的配置文件 /etc/prometheus/config_out/prometheus.env.yaml。 prometheus-config-reloader 將調(diào)用主容器的 reload API 來(lái)重新加載配置文件;
PodMonitor / ServiceMonitor
? prometheus-operator 監(jiān)聽(tīng) PodMonitor 和 ServiceMonitor 的變化。一旦對(duì)應(yīng)資源發(fā)生了變化,prometheus-operator 將基于新的資源生成新的配置文件并將其更新到對(duì)應(yīng)的 Secrets 中。由于對(duì)應(yīng) Secrets 以文件形式掛載于 prometheus-config-reloader 容器中并被監(jiān)聽(tīng)文件變化,所以當(dāng)?shù)讓?Secrets 發(fā)生了變化,kubelet 將分鐘級(jí)傳播變化到對(duì)應(yīng)容器內(nèi)部,從而觸發(fā) prometheus-config-reloader 容器內(nèi)的監(jiān)聽(tīng)邏輯。
? Secrets 內(nèi)部是一個(gè) 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
我們這些了解完成之后,對(duì)于我們后面的改進(jìn)可謂是……語(yǔ)文不好,有點(diǎn)丟人,想不出來(lái)成語(yǔ)了。
Prometheus CRD YAML 優(yōu)化
我們先從 Prometheus 的持久化數(shù)據(jù)說(shuō)起:
storage:
volumeClaimTemplate:
spec:
storageClassName: alicloud-nas-subpath
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 15Gi
本地存儲(chǔ)優(yōu)化;
啟用 WAL 壓縮;
wal_compression: true
減少數(shù)據(jù)保留時(shí)間;
retention: 7d
還有我們資源的優(yōu)化,如果你的集群應(yīng)用很多,資源太少,就會(huì)導(dǎo)致 pod 異常,這邊你自己調(diào)整:
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
擴(kuò)展
因?yàn)?Prometheus 這邊優(yōu)化的還挺多的,所以我們這一篇就先講到這里,后面我們會(huì)更多的剖析相關(guān)內(nèi)容。
? Prometheus Agent
? PrometheusRule
結(jié)語(yǔ)
我們 Prometheus 基礎(chǔ)的優(yōu)化和改進(jìn)就結(jié)束了,相比較前幾篇,這篇的東西不是很多。其實(shí)還有很多的東西都需要講,我會(huì)把它們給分開。