背景
因為正常的監控都是用K8S做的,而K3S上的監控方案少之又少,如果直接用rancher上的prometheus監控,會消耗至少2G的記憶體,于是我們就自己做了K3S和pg資料庫的監控,并且通過我們自己做的監控,可以減少一些不必要的性能開銷。主要監控容器資源消耗,主控端資源消耗,pg資料庫資源消耗

這個是資源使用情況,大約會用掉600M記憶體和100MCPU
user@user:/$ kubectl top pod -n kube-ops
NAME CPU(cores) MEMORY(bytes)
grafana-0 1m 47Mi
kube-state-metrics-594fb7bc84-5mg6g 3m 10Mi
node-exportor-prometheus-node-exporter-sznls 31m 8Mi
node-exportor-prometheus-node-exporter-tx7rm 13m 7Mi
prometheus-0 46m 565Mi
prometheus-postgres-exporter-6c858f47d4-dj9hj 13m 6Mi
prometheus監控元件參考helm chart https://github.com/prometheus-community/helm-charts/tree/main/charts 我魔改的github連接配接 https://github.com/lizhenwei/k3s-prometheus
Prometheus的安裝
1.建立一個命名空間kube-ops,把監控用的東西都放在這個命名裡面。
2.使用我魔改的chart進行安裝,預設版本是v2.26.0,預設啟用上圖提到的
cadvisor,kube_state_metrics,node_exportor,postgres_exporter
kubectl create ns kube-ops
helm install -n kube-ops prometheus lizhenwei-prometheus
如果要關閉其中的某個監控項,安裝時參考添加變量 –set node_exportor.enable=false,
prometheus的資料會用預設的storageClass生成PVC,如果沒有預設的,參考手動設定nfs存儲 –set persistence.storageClass=nfs-client
安裝成功後,因為我是nodeport暴露出來的,是以可以通過浏覽器去檢查一下配置,例如這裡我們暴露出來是32331端口可以通路,例如:
$ kubectl get svc -n kube-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus NodePort 10.43.178.128 <none> 9090:32331/TCP 2d4h
通路http://master機器IP:32331/targets,可以看到prometheus自己已經是成功起來了,我們也可以去http://master機器IP:32331/config頁面看看配置項是否都正确
要啟用或停用某些監控功能,可以修改lizhenwei-prometheus/valuse.yaml裡的配置,修改成true或false
kube-state-metrics的安裝
kube-state-metrics是用來收集k8s叢集的CPU,記憶體等資訊的收集器,這裡我用的是v1.9.7版本。
使用我github上的helm進行安裝:
helm install -n kube-ops prometheus lizhenwei-kube-state-metrics
要想驗證部署kube-state-metrics之後,是否能成功使用,我們可以看prometheus的target頁面是不是顯示kube-state-metrics(X/X up) x為機器節點數量。
然後我們去graph頁面看看,http://master機器IP:32331/graph。可以參考官網給的promql文檔,輸入幾個語句試試
PromQL參考連結 https://github.com/kubernetes/kube-state-metrics/tree/master/docs
例如輸入kube_configmap_info,點選execute會傳回一些結果,如下圖
K3S自帶的CADVISOR
K3S自帶kubelet ,而cadvisor已經內建在kubelet裡了,prometheus可以通過配置找到本地安裝的cadvisor,例如下列代碼:
- job_name: 'cadvisor'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
接入prometheus的時候,可以根據以下連結,檢視PromQL語句
https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md
node-exportor的安裝
這個使用官方網站給的一個公共庫就可以了
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install node-exportor prometheus-community/prometheus-node-exporter
grafana參考連結 https://grafana.com/grafana/dashboards/1860
postgres-exportor
下載下傳代碼
https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-postgres-exporter到機器上
修改valuse.yaml裡的queries裡的參數,在最後面加上
pg_stat_activity:
query: |
SELECT
datname,
SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
COUNT(*) AS process_idle_seconds_count
FROM pg_stat_activity
WHERE state = 'idle'
GROUP BY datname
metrics:
- datname:
usage: "LABEL"
description: "datname"
- process_idle_seconds:
usage: "COUNTER"
description: "Idle time of server processes"
- process_idle_seconds_sum:
usage: "GUAGE"
description: "sum of Idle time of server processes"
在valuse.yaml檔案的config.datasource部分添加我們的postgres超管使用者資訊。
helm安裝語句
helm install -n kube-ops prometheus-postgres-exporter prometheus-postgres-exporter
Grafana導入dashboard
可以參考這位大神的github連結
https://github.com/starsliao/Prometheus