目錄
一、基于 Kubernetes 的 Prometheus 監控方案概述
1. 核心組件及功能
2. 監控流程詳解
3. 關鍵監控指標說明
二、Prometheus 與相關組件部署
1. 克隆項目代碼
2. 安裝 Prometheus Operator
3. 安裝 Prometheus Stack
4. 查看容器運行狀態
三、ServiceMonitor 配置與應用
1. ServiceMonitor 作用與查看
2. ServiceMonitor 工作原理
四、Grafana 配置與訪問
1. 修改 Grafana Service 類型
2. 訪問 Grafana 并配置數據源
3. 導入監控模板
五、Prometheus 訪問配置
1. 修改 Prometheus Service 類型
2. 訪問 Prometheus 并查看監控目標
六、監控 MySQL 數據庫
1. 部署 MySQL
2. 部署 MySQL Exporter
3. 配置 ServiceMonitor 監控 MySQL
4. 在 Grafana 中添加 MySQL 監控模板
七、對接釘釘報警
1. 部署 DingTalk 組件
2. 修改 DingTalk 配置文件
3. 啟動 DingTalk 服務
4. 配置 Alertmanager 對接 DingTalk
5. 測試釘釘報警
一、基于 Kubernetes 的 Prometheus 監控方案概述
1. 核心組件及功能
在 Kubernetes 監控中,node - exporter + Prometheus + Grafana 組成的組合被廣泛采用,各組件功能如下:
node - exporter:節點級指標導出工具,可采集節點的 CPU、內存、磁盤、網絡等關鍵指標,并通過 Metrics 接口暴露數據,為監控提供基礎數據來源。
Prometheus:集時間序列數據庫與監控報警功能于一身,能夠主動抓取 Cadvisor 和 node - exporter 暴露的 Metrics 接口數據,將容器和節點的時序數據存儲起來,同時提供強大的 PromQL 查詢語言用于監控分析和報警設置。
Grafana:專業的圖表和 Dashboard 工具,可將 Prometheus 作為數據源,通過編寫 PromQL 查詢語句,以直觀的圖表形式展示 K8S 集群的 CPU 使用率、內存使用率、網絡流量等監控指標。
2. 監控流程詳解
Kubernetes 集群的監控流程清晰且有序,主要分為以下步驟:
數據采集層部署:在 Kubernetes 集群的每個節點上安裝 Cadvisor 和 node - exporter,其中 Cadvisor 負責容器級指標采集,node - exporter 負責節點級指標采集。
數據存儲與處理:部署 Prometheus,通過配置使其能夠抓取 Cadvisor 和 node - exporter 的 Metrics 接口數據,將容器(containers)和節點(nodes)的時序數據妥善存儲。
可視化展示:利用 Grafana 構建監控儀表盤,選擇 Prometheus 作為數據源,通過編寫 PromQL 查詢語句,直觀展示 K8S 集群的各類監控指標。
報警機制設置:根據監控需求設置 Prometheus 報警規則,當監控指標超過設定閾值時,及時發送報警信息,保障集群穩定運行。
在實際部署中,node - exporter 以 DaemonSet 形式運行,確保每個節點都能被監控;Prometheus 通過部署 Prometheus Operator 以 Deployment 形式運行,實現 Metrics 抓取和報警功能;Grafana 則通過部署 Grafana Operator 實現儀表盤展示。
3. 關鍵監控指標說明
Kubernetes 集群的監控指標眾多,涵蓋集群運行狀態的各個方面,主要包括:
資源利用率指標:CPU 利用率(節點、Pod、容器級別)、內存利用率(節點、Pod、容器級別)、網絡流量(節點、Pod、容器的收發包大小和帶寬利用率)、磁盤使用率(節點磁盤空間使用情況)。
組件狀態指標:Pod 狀態(Running、Waiting、Succeeded、Failed 等狀態數量)、節點狀態(Ready、NotReady 和 Unreachable 狀態數量)、容器重啟次數(單個容器或 Pod 內所有容器的重啟次數)。
核心組件性能指標:API 服務指標(Kubernetes API Server 的請求 LATENCY、請求 QPS、錯誤碼數量等)、集群組件指標(etcd、kubelet、kube - proxy 等組件的運行指標)。
基于這些指標可設置相應報警規則,例如 CPU 利用率超過 80% 報警、內存利用率超過 90% 報警、Pod / 節點 NotReady 狀態超過 10% 報警、API Server 請求 LATENCY 超過 200ms 報警等,具體閾值需根據集群大小和服務負載評估確定。
二、Prometheus 與相關組件部署
1. 克隆項目代碼
首先需要從 Github 克隆 kube - prometheus 項目的指定分支,命令如下:
[root@k8s - master ~]# git clone -b release - 0.10 https://github.com/prometheus - operator/kube - prometheus.git
命令解釋:??git clone???用于克隆遠程倉庫代碼,??-b release - 0.10??指定克隆的分支為 release - 0.10,該分支包含了適配當前部署需求的穩定版本代碼。
2. 安裝 Prometheus Operator
Prometheus Operator 是 CoreOS 開源項目,提供了 Kubernetes 原生方式運行和管理 Prometheus 的能力,能自動創建、配置和管理 Prometheus 實例,并與 Kubernetes 服務發現機制集成,大幅簡化部署工作量。
安裝命令如下:
[root@k8s - master ~]# cd kube - prometheus/
[root@k8s - master kube - prometheus]# kubectl apply --server - side -f manifests/setup
命令解釋:??cd kube - prometheus/???進入克隆下來的項目目錄;??kubectl apply???用于應用 Kubernetes 資源配置,??--server - side???特性將配置邏輯從 kubectl 移至 API 服務器,解決所有權沖突問題,??-f manifests/setup??指定應用 setup 目錄下的配置文件,完成 Prometheus Operator 的基礎環境部署。
若需刪除 Prometheus Operator,可執行以下命令:
kubectl delete --ignore - not - found=true -f manifests/setup
命令解釋:??kubectl delete???用于刪除 Kubernetes 資源,??--ignore - not - found=true???表示忽略未找到資源的錯誤,??-f manifests/setup??指定刪除 setup 目錄下配置文件對應的資源。
3. 安裝 Prometheus Stack
待 Operator 容器啟動后,安裝 Prometheus Stack,命令如下:
[root@k8s - master kube - prometheus]# kubectl apply --server - side -f manifests/
命令解釋:??-f manifests/??指定應用 manifests 目錄下的所有配置文件,該目錄包含了 Prometheus、Alertmanager、Grafana 等全套監控告警組件的配置,即 kube - prometheus - stack 全家桶。
刪除 Prometheus Stack 的命令為:
kubectl delete --ignore - not - found=true -f manifests/ -f manifests/setup
4. 查看容器運行狀態
安裝完成后,查看監控命名空間下的 Pod 狀態,確認組件是否正常運行:
[root@k8s - master ~]# kubectl get pod -n monitoring
正常情況下,會顯示 alertmanager、blackbox - exporter、grafana、kube - state - metrics、node - exporter、prometheus 等組件的 Pod 處于 Running 狀態,如下所示(部分示例):
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE
alertmanager - main - 0 ? ? ? ? ? ? ? ?2/2 ? ? Running ? 0 ? ? ? ? ?79m
grafana - 5fc7f9f55d - x4gv4 ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ?87m
prometheus - k8s - 0 ? ? ? ? ? ? ? ? ? 2/2 ? ? Running ? 0 ? ? ? ? ?79m
命令解釋:??kubectl get pod???用于獲取 Pod 列表,??-n monitoring??指定查看 monitoring 命名空間下的 Pod,通過 STATUS 列可確認 Pod 是否正常運行。
三、ServiceMonitor 配置與應用
1. ServiceMonitor 作用與查看
ServiceMonitor 用于定義如何監控一組動態服務,通過標簽選擇器確定需要監控的 Service,實現服務的自動發現和監控配置,無需手動重新配置。
查看已有的 ServiceMonitor:
[root@k8s - master ~]# kubectl get servicemonitors -A
執行后會列出 monitoring 命名空間下的各類 ServiceMonitor,如 alertmanager - main、coredns、grafana、kube - apiserver 等,示例如下:
NAMESPACE ? NAME ? ? ? ? ? ? ? ? ? ? AGE
monitoring ?alertmanager - main ? ? ?2m9s
monitoring ?coredns ? ? ? ? ? ? ? ? 2m6s
monitoring ?grafana ? ? ? ? ? ? ? ? 2m7s
命令解釋:??kubectl get servicemonitors???用于獲取 ServiceMonitor 列表,??-A??表示查看所有命名空間下的 ServiceMonitor。
2. ServiceMonitor 工作原理
為使 Prometheus 監控 Kubernetes 內的應用,需存在 Endpoints 對象(本質是 IP 地址列表),通常由 Service 對象通過標簽選擇器匹配 Pod 自動填充。Prometheus Operator 的 ServiceMonitor 會發現這些 Endpoints 對象,并配置 Prometheus 監控對應的 Pod,其 spec.endpoints 部分用于配置需要抓取指標的端口。
四、Grafana 配置與訪問
1. 修改 Grafana Service 類型
默認 Grafana 的 Service 類型為 ClusterIP,僅集群內部可訪問,需修改為 NodePort 類型以便外部訪問:
[root@k8s - master ~]# kubectl edit svc grafana -n monitoring
命令解釋:??kubectl edit svc???用于編輯 Service 配置,??grafana???為 Service 名稱,??-n monitoring??指定命名空間。
在編輯界面中,將??type: ClusterIP???修改為??type: NodePort??,并可指定 nodePort(如 32082),修改后保存退出。
查看修改后的 Grafana Service 信息:
[root@k8s - master ~]# kubectl get svc grafana -n monitoring
輸出如下:
NAME ? ? ?TYPE ? ? ? CLUSTER - IP ? ?EXTERNAL - IP ? PORT(S) ? ? ? ? ?AGE
grafana ? NodePort ? 10.99.26.98 ? ? <none> ? ? ? ? ?3000:32082/TCP ? 28m
命令解釋:??kubectl get svc??用于獲取 Service 信息,可看到 TYPE 已變為 NodePort,以及映射的節點端口 32082。
2. 訪問 Grafana 并配置數據源
通過以下 URL 訪問 Grafana:??http://<K8S集群任意節點的IP>:32082???。
默認登錄賬號密碼為 admin/admin,首次登錄會提示修改密碼,可選擇跳過。
Grafana 默認已配置 Prometheus 數據源,若需手動配置:
單擊首頁左側的 “Add your first data source”。
選擇 Prometheus 數據源。
在 HTTP 配置項下的 URL 填寫 “http://prometheus - k8s:9090”(prometheus - k8s 為 K8s 集群內的 Service 名),點擊 “Save & Test” 保存并測試。
3. 導入監控模板
導入 Node 節點監控模板步驟:
單擊首頁左側 “+” 按鈕,選擇 “Import”。
輸入模板 ID:13105,單擊 “Load” 加載。
最后單擊 “Import” 完成導入,即可在 Dashboard 查看 Node 節點監控數據。
其他常用模板可在 Grafana 官網(??https://grafana.com/grafana/dashboards/??)查找,如 Kubernetes Cluster(7249)、Docker and system monitoring(893)等。
五、Prometheus 訪問配置
1. 修改 Prometheus Service 類型
同樣將 Prometheus 的 Service 類型修改為 NodePort:
[root@k8s - master ~]# kubectl edit svc prometheus - k8s -n monitoring
在編輯界面中,將??type: ClusterIP???修改為??type: NodePort??,并指定 nodePort(如 9090 對應 32370)。
查看修改后的 Prometheus Service 信息:
[root@k8s - master ~]# kubectl get svc -n monitoring prometheus - k8s
輸出示例:
NAME ? ? ? ? ? ? TYPE ? ? ? CLUSTER - IP ? ? ? EXTERNAL - IP ? PORT(S) ? ? ? ? ?AGE
prometheus - k8s ?NodePort ? 10.105.187.25 ? ? <none> ? ? ? ? ?9090:32370/TCP ? 33m
2. 訪問 Prometheus 并查看監控目標
通過 URL??http://<K8S集群任意節點的IP>:32370??訪問 Prometheus。在 Prometheus 界面中,點擊 “Status”->“Targets” 可查看所有監控目標的狀態,確認各 ServiceMonitor 對應的目標是否正常(up 狀態)。
Prometheus 告警規則有三個狀態:
inactive:未被觸發。
pending:已觸發但未達到 for 設定時間。
firing:觸發且達到設定時間,會發送告警。
六、監控 MySQL 數據庫
1. 部署 MySQL
在 Kubernetes 中部署 MySQL:
[root@k8s - master ~]# kubectl create deploy mysql --image=mysql:5.7.23
命令解釋:??kubectl create deploy???用于創建 Deployment,??mysql???為 Deployment 名稱,??--image=mysql:5.7.23??指定使用的鏡像及版本。
設置 MySQL 密碼:
[root@k8s - master ~]# kubectl set env deploy/mysql MYSQL_ROOT_PASSWORD=pd123
命令解釋:??kubectl set env???為 Deployment 設置環境變量,??deploy/mysql???指定 Deployment,??MYSQL_ROOT_PASSWORD=pd123??設置 root 用戶密碼。
查看 MySQL Pod 狀態:
[root@k8s - master ~]# kubectl get pod
輸出示例:
NAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ?RESTARTS ? AGE
mysql - 58dd9c4df4 - 17fgd 1/1 ? ? Running ? 0 ? ? ? ? ?2m53s
創建 Service 暴露 MySQL 端口:
[root@k8s - master ~]# kubectl expose deployment mysql --type NodePort --port=3306
命令解釋:??kubectl expose deployment???為 Deployment 創建 Service,??--type NodePort???指定 Service 類型,??--port=3306??指定服務端口。
查看 MySQL Service 信息:
[root@k8s - master ~]# kubectl get svc -l app=mysql
輸出示例:
NAME ? ?TYPE ? ? ? CLUSTER - IP ? ? EXTERNAL - IP ? PORT(S) ? ? ? ? ?AGE
mysql ? NodePort ? 10.96.116.184 ? ?<none> ? ? ? ? ?3306:31152/TCP ? 37s
訪問測試 MySQL:
[root@k8s - master ~]# dnf -y install mysql ?# 安裝MySQL客戶端
[root@k8s - master ~]# mysql -u root -ppwd123 -h 192.168.207.137 -P31152 ?# 連接測試,IP為K8S節點IP,端口為映射的NodePort
設置 MySQL 訪問權限:
[root@k8s - master ~]# grant all on *.* to exporter@'%' identified by 'exporter';
命令解釋:創建 exporter 用戶并授權,允許其從任意主機(%)訪問所有數據庫,密碼為 exporter,供 exporter 采集數據使用。
2. 部署 MySQL Exporter
創建 mysql - exporter.yaml 配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
? name: mysql - exporter
? namespace: monitoring
spec:
? replicas: 1
? selector:
? ? matchLabels:
? ? ? k8s - app: mysql - exporter
? template:
? ? metadata:
? ? ? labels:
? ? ? ? k8s - app: mysql - exporter
? ? spec:
? ? ? containers:
? ? ? - name: mysql - exporter
? ? ? ? image: registry.cn - beijing.aliyuncs.com/dotbalo/mysqld - exporter
? ? ? ? env:
? ? ? ? - name: DATA_SOURCE_NAME
? ? ? ? ? value: "exporter:exporter@(mysql.default:3306)/" ?# 數據庫連接信息,格式為用戶名:密碼@(服務名:端口)/
? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ports:
? ? ? ? - containerPort: 9104 ?# exporter暴露指標的端口
---
apiVersion: v1
kind: Service
metadata:
? name: mysql - exporter
? namespace: monitoring
? labels:
? ? k8s - app: mysql - exporter
spec:
? type: ClusterIP
? selector:
? ? k8s - app: mysql - exporter
? ports:
? - name: api
? ? port: 9104
? ? protocol: TCP
部署 MySQL Exporter:
[root@k8s - master ~]# kubectl create -f mysql - exporter.yaml
命令解釋:??kubectl create -f??根據配置文件創建 Deployment 和 Service 資源。
查看部署結果:
[root@k8s - master ~]# kubectl get -f mysql - exporter.yaml
測試能否獲取 metrics 數據:
[root@k8s - master ~]# curl 10.109.16.46:9104/metrics | tail -n 5 ?# 10.109.16.46為mysql - exporter Service的ClusterIP
若能獲取到指標數據,說明 Exporter 工作正常。
3. 配置 ServiceMonitor 監控 MySQL
創建 mysql - sm.yaml 配置文件:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
? name: mysql - exporter
? namespace: monitoring
? labels:
? ? k8s - app: mysql - exporter
spec:
? jobLabel: k8s - app
? endpoints:
? - port: api ?# 對應Service中定義的端口名
? ? interval: 30s ?# 抓取間隔
? ? scheme: http
? selector:
? ? matchLabels:
? ? ? k8s - app: mysql - exporter ?# 匹配mysql - exporter Service的標簽
? namespaceSelector:
? ? matchNames:
? ? - monitoring ?# 監控的命名空間
創建 ServiceMonitor:
[root@k8s - master ~]# kubectl create -f mysql - sm.yaml
在 Prometheus 的 “Targets” 頁面中,可查看 mysql - exporter 的監控目標是否正常(up 狀態)。
4. 在 Grafana 中添加 MySQL 監控模板
導入 MySQL 監控模板,模板 ID:6239,步驟同 Node 節點模板導入,完成后即可查看 MySQL 監控數據。
七、對接釘釘報警
1. 部署 DingTalk 組件
下載 Prometheus Webhook DingTalk:
wget https://github.com/timonwong/prometheus - webhook - dingtalk/releases/download/v2.0.0/prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz
解壓并部署:
tar -xf prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz
mv prometheus - webhook - dingtalk - 2.0.0.linux - amd64 /usr/local/dingtalk
2. 修改 DingTalk 配置文件
進入配置目錄并修改配置:
cd /usr/local/dingtalk
mv config.example.yml config.yml
vi config.yml
配置文件內容示例(關鍵部分):
targets:
? webhook1:
? ? url: https://oapi.dingtalk.com/robot/send?access_token=你的機器人access_token
? ? secret: 你的機器人secret(可選)
? # 可配置多個webhook
配置解釋:??url???為釘釘機器人的 Webhook 地址,需替換為實際創建的機器人地址;??secret??用于簽名驗證,增強安全性。
3. 啟動 DingTalk 服務
創建系統服務配置:
cat > /etc/systemd/system/prometheus - webhook - dingtalk.service << 'EOF'
[Unit]
Description=Prometheus Webhook DingTalk
After=network.target
?
[Service]
User=root
Group=root
WorkingDirectory=/usr/local/dingtalk
ExecStart=/usr/local/dingtalk/prometheus - webhook - dingtalk
Restart=always
RestartSec=5
Environment="CONFIG_FILE=/usr/local/dingtalk/config.yml"
?
[Install]
WantedBy=multi - user.target
?
啟動服務并設置開機自啟:
sudo systemctl daemon - reload
sudo systemctl start prometheus - webhook - dingtalk
sudo systemctl enable prometheus - webhook - dingtalk
查看服務狀態:
sudo systemctl status prometheus - webhook - dingtalk
確認服務處于 Running 狀態,同時可通過??ss -n1pt | grep 8060??查看 8060 端口是否被監聽(默認端口)。
4. 配置 Alertmanager 對接 DingTalk
編輯 Alertmanager 配置文件:
cd /root/kube - prometheus/manifests/
vi alertmanager - secret.yaml
修改配置文件中的 receivers 和 route 部分,示例如下:
stringData:
? alertmanager.yml: |
? ? global:
? ? ? resolve_timeout: 5m
? ? inhibit_rules:
? ? - equal:
? ? ? - namespace
? ? ? - alertname
? ? ? source_matchers:
? ? ? - severity = critical
? ? ? target_matchers:
? ? ? - severity =~ info
? ? - equal:
? ? ? - namespace
? ? ? - alertname
? ? ? source_matchers:
? ? ? - severity = info
? ? ? target_matchers:
? ? ? - severity = info
? ? receivers:
? ? - name: webhook
? ? ? webhook_configs:
? ? ? - url: http://192.168.207.137:8060/dingtalk/webhook2/send ?# DingTalk服務地址
? ? ? ? send_resolved: true
? ? route:
? ? ? group_by:
? ? ? - namespace
? ? ? group_interval: 50s
? ? ? group_wait: 30s
? ? ? receiver: webhook
? ? ? repeat_interval: 1h
? ? ? routes:
? ? ? - matchers:
? ? ? ? - alertname = Watchdog
? ? ? ? receiver: webhook
? ? ? - matchers:
? ? ? ? - severity = critical
? ? ? ? receiver: webhook
? ? ? - matchers:
? ? ? ? - alertname = TargetDown
? ? ? ? receiver: webhook
配置解釋:??receivers???定義接收者為 webhook,指定 DingTalk 服務的 URL;??route??定義告警路由規則,將各類告警發送到 webhook 接收者。
應用配置:
kubectl replace -f alertmanager - secret.yaml
若配置修改后未生效,可刪除后重新創建:
kubectl delete -f alertmanager - secret.yaml
kubectl create -f alertmanager - secret.yaml
修改 Alertmanager 的 Service 類型為 NodePort 以便訪問:
kubectl edit svc -n monitoring alertmanager - main
查看 Alertmanager Service 信息:
kubectl get svc -n monitoring alertmanager - main
通過??http://<K8S集群任意節點的IP>:<NodePort>??訪問 Alertmanager 頁面。
5. 測試釘釘報警
停止 MySQL 服務模擬故障:
kubectl scale deployment mysql --replicas=0
命令解釋:??kubectl scale deployment???用于調整 Deployment 的副本數量,??--replicas=0??表示停止所有 MySQL Pod。
等待一段時間后,若報警規則觸發,釘釘機器人會發送報警信息,確認報警功能正常后,可恢復 MySQL 服務:
kubectl scale deployment mysql --replicas=1