整體架構圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLiJGO4QDM2MjN4EmY1EGOidTZ5QDNwkDNxcTY2ADM5YzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
prometheus
簡介:
官方位址:https://prometheus.io/
Prometheus是基于go語⾔開發的⼀套開源的監控、報警和時間序列資料庫的組合,是由SoundCloud公司開發的開源監控系統,Prometheus于2016年加⼊CNCF(Cloud Native Computing Foundation,雲原⽣計算基⾦會),2018年8⽉9⽇prometheus成為CNCF繼kubernetes 之後畢業的第⼆個項⽬,prometheus在容器和微服務領域中得到了⼴泛的應⽤,其特點主要如下:
- 使⽤key-value的多元度(多個⻆度,多個層⾯,多個⽅⾯)格式儲存資料
- 資料不使⽤MySQL這樣的傳統資料庫,⽽是使⽤時序資料庫,⽬前是使⽤的TSDB
- ⽀持第三⽅dashboard實作更絢麗的圖形界⾯,如grafana(Grafana 2.5.0版本及以上)
- 元件子產品化
- 不需要依賴存儲,資料可以本地儲存也可以遠端儲存
- 平均每個采樣點僅占3.5 bytes,且⼀個Prometheus server可以處理數百萬級别的的metrics名額資料。
- ⽀持服務⾃動化發現(基于consul等⽅式動态發現被監控的⽬标服務)
- 強⼤的資料查詢語句功(PromQL,Prometheus Query Language)
- 資料可以直接進⾏算術運算
- 易于橫向伸縮
- 衆多官⽅和第三⽅的exporter(“資料”導出器)實作不同的名額資料收集
為什麼使用prometheus?
容器監控的實作⽅對⽐虛拟機或者實體機來說⽐⼤的差別,⽐如容器在k8s環境中可以任意橫向擴容與縮容,那麼就需要監控服務能夠⾃動對新建立的容器進⾏監控,當容器删除後⼜能夠及時的從監控服務中删除,⽽傳統的zabbix的監控⽅式需要在每⼀個容器中安裝啟動agent,并且在容器⾃動發現注冊及模闆關聯⽅⾯并沒有⽐較好的實作⽅式。
prometheus架構圖
部署prometheus監控系統
二進制方式部署Prometheus Server
mkdir /apps
wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz
tar -xvf prometheus-2.38.0.linux-amd64.tar.gz
ln -sv prometheus-2.38.0.linux-amd64 prometheus
建立prometheus service 啟動腳本
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle
[Install]
WantedBy=multi-user.target
動态(熱)加載配置:
# vim /etc/systemd/system/prometheus.service
--web.enable-lifecycle
curl -X POST http://192.168.2.132:9090/-/reload
啟動prometheus服務
systemctl daemon-reload && systemctl restart prometheus && systemctl enable
prometheus
驗證prometheus web界⾯:
prometheus存儲系統
Prometheus 有着非常高效的時間序列資料存儲方法,每個采樣資料僅僅占用3.5byte 左右空間,上百萬條時間序列,30 秒間隔,保留 60 天,大概 200 多 G空間。
prometheus 本地存儲簡介:
預設情況下,prometheus将采集到的資料存儲在本地的 TSDB資料庫中,路徑預設為prometheus安裝目錄的 data目錄,資料寫入過程為先把資料寫入 wal日志并放在記憶體,然後 2小時後将記憶體資料儲存至一個新的 block塊,同時再把新采集的資料寫入記憶體并在 2小時後再儲存至一個新的 block塊,以此類推。
本地配置參數
--config.file="prometheus.yml" #指定配置檔案
--web.listen-address="0.0.0.0:9090" #指定監聽位址
--storage.tsdb.path="data/" #指定數存儲目錄
--storage.tsdb.retention.size=B, KB, MB, GB, TB, PB, EB #指定 chunk大小,預設 512MB
--storage.tsdb.retention.time= #資料儲存時長,預設 15天
--query.timeout=2m #最大查詢逾時時間
-query.max-concurrency=20 #最大查詢并發數
--web.read-timeout=5m #最大空閑逾時時間
--web.max-connections=512 #最大并發連接配接數
--web.enable-lifecycle #啟用 API動态加載配置功能
prometheus 聯邦
- job_name: 'prometheus-federate-2.102'
scrape_interval: 10s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- '172.31.2.102:9090'
## 注意對于k8s内部的prometheus節點資料的收集,要寫容器中對應的job資訊,不然prometheus service節點根據比對條件,無法比對到
'match[]':
- '{job="kubernetes-service-endpoints"}'
二進制安裝node-exporter
k8s各node節點使⽤⼆進制或者daemonset⽅式安裝node_exporter,⽤于收集各k8s node節點主控端的監控名額資料,預設監聽端⼝為9100。
解壓二進制程式
cd /apps
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar -xvf node_exporter-1.3.1.linux-amd64.tar.gz
ln -sv node_exporter-1.3.1.linux-amd64 node_exporter
建立node_exporter service 啟動檔案
vim /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
啟動node_exporter服務
systemctl daemon-reload && systemctl start node_exporter && systemctl enable node_exporter
添加node節點資料收集
vim /apps/prometheus/prometheus.yml
- job_name: 'promethues-node'
static_configs:
- targets: ['192.168.2.131:9100','192.168.2.132:9100']
grafana
grafana是⼀個可視化元件,⽤于接收用戶端浏覽器的請求并連接配接到prometheus查詢資料,最後經過渲染并在浏覽器進⾏體系化顯示,需要注意的是,grafana查詢資料類似于zabbix⼀樣需要⾃定義模闆,模闆可以⼿動制作也可以導⼊已有模闆。
官網:https://grafana.com/
模闆下載下傳:https://grafana.com/grafana/dashboards/
安裝Grafana Server
https://grafana.com/grafana/download #下載下傳位址
https://grafana.com/docs/grafana/latest/installation/requirements/ #安裝⽂檔
cd /apps
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.1.6-1.x86_64.rpm
或sudo yum install grafana-enterprise-9.1.6-1.x86_64.rpm
grafana server配置⽂件:
vim /etc/grafana/grafana.ini
[server]
# Protocol (http, https, socket)
protocol = http
# The ip address to bind to, empty will bind to all interfaces
http_addr = 0.0.0.0
# The http port to use
http_port = 3000
啟動grafana服務
systemctl daemon-reload && systemctl restart grafana-server && systemctl enable grafana-server
插件管理
餅圖插件未安裝,需要提前安裝
https://grafana.com/grafana/plugins/grafana-piechart-panel/
線上安裝:
# grafana-cli plugins install grafana-piechart-panel
離線安裝:
# pwd
/var/lib/grafana/plugins
wget https://grafana.com/api/plugins/grafana-piechart-panel/versions/1.6.2/download
unzip grafana-piechart-panel-1.6.2.zip
mv grafana-piechart-panel-1.6.2 grafana-piechart-panel
systemctl restart grafana-server
alertmanager
prometheus觸發一條告警的過程
prometheus—>觸發門檻值—>超出持續時間—>alertmanager—>分組|抑制|靜默—>媒體類型—>郵件|釘釘|企業微信|飛書等。
安裝 alertmanager:
cd /apps
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
tar -xvf alertmanager-0.24.0.linux-amd64.tar.gz
ln -sv alertmanager-0.24.0.linux-amd64 alertmanager
建立alertmanager service啟動檔案
vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Prometheus alertmanager
After=network.target
[Service]
ExecStart=/apps/alertmanager/alertmanager --config.file="/apps/alertmanager/alertmanager.yml"
[Install]
WantedBy=multi-user.target
啟動alertmanager服務
systemctl daemon-reload && systemctl restart alertmanager && systemctl enablealertmanager
告警通知
郵件告警通知
官方配置文檔:https://prometheus.io/docs/alerting/configuration/
alertmanager配置檔案說明:
vim /apps/alertmanager/alertmanager.yml
global:
resolve_timeout: 1m #單次探測逾時時間
smtp_from: #發件人郵箱位址
smtp_smarthost: #郵箱 smtp位址。
smtp_auth_username: #發件人的登陸使用者名,預設和發件人位址一緻。
smtp_auth_password: #發件人的登陸密碼,有時候是授權碼。
smtp_require_tls: #是否需要 tls協定。預設是 true。
wechart_api_url: #企業微信 API位址。
wechart_api_secret: #企業微信 API secret。
wechart_api_corp_id: #企業微信 corp id資訊。
resolve_timeout: 60s #當一個告警在 Alertmanager持續多長時間未接收到新告警後就标記告警狀态為resolved(已解決/已恢複)。
配置詳解:
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '[email protected]'
smtp_auth_username: '[email protected]'
smtp_auth_password: '********' #一般為開啟pop3/smtp服務的授權碼
smtp_hello: '@qq.com'
smtp_require_tls: false
route:
group_by: [alertname] #通過 alertname的值對告警進行分類,- alert:實體節點 cpu使用率
group_wait: 10s #一組告警第一次發送之前等待的延遲時間,即産生告警後延遲 10秒鐘将組内新産生的消息一起合并發送(一般設定為 0秒 ~幾分鐘)。
group_interval: 2m #一組已發送過初始通知的告警接收到新告警後,下次發送通知前等待的延遲時間(一般設定為 5分鐘或更多)。
repeat_interval: 5m #一條成功發送的告警,在最終發送通知之前等待的時間(通常設定為 3小時或更長時間)。
receiver: default-receiver #其它的告警發送給 default-receiver
routes: #将 critical的報警發送給 myalertname
- receiver: myalertname
group_wait: 10s
match_re:
severity: critical
receivers: #定義多接收者
- name: 'default-receiver'
email_configs:
- to: '[email protected]'
send_resolved: true #通知已經恢複的告警
- name: myalertname
webhook_configs:
- url: 'http://172.30.7.101:8060/dingtalk/alertname/send'
send_resolved: true #通知已經恢複的告警
配置并啟動alertmanager
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '[email protected]'
smtp_auth_username: '[email protected]'
smtp_auth_password: '********' #一般為開啟pop3/smtp服務的授權碼
smtp_hello: '@qq.com'
smtp_require_tls: false
route:
group_by: [alertname] #采用哪個标簽來作為分組依據
group_wait: 10s 。
group_interval: 10s
repeat_interval: 2m
receiver: web.hook.qq #設定接收人
receivers: #定義多接收者
- name: 'web.hook.qq'
email_configs:
- to: '[email protected]'
send_resolved: true #通知已經恢複的告警
inhibit_rules: #抑制的規則
- source_match: #源比對級别,當比對成功發出通知,但是其它'alertname', 'dev', 'instance'産生的warning級别的告警通知将被抑制
severity: 'critical' #報警的事件級别
target_match:
severity: 'warning' #調用 source_match的 severity即如果已經有'critical'級别的報警,那麼将比對目标為新産生的告警級别為'warning'的将被抑制
equal: ['alertname', 'dev', 'instance'] #比對那些對象的告警
釘釘告警通知
告警流程
prometheus—>alertmanager—>dingtalk—>dingdingServer
cd /apps
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
ln -sv prometheus-webhook-dingtalk-2.1.0.linux-amd64 prometheus-webhook-dingtalk
源端存儲之victoriametrics
官方位址:
https://github.com/VictoriaMetrics/VictoriaMetrics
https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html
單機版部署
cd /app
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.81.2/victoria-metrics-linux-amd64-v1.81.2.tar.gz
tar -xvf victoria-metrics-linux-amd64-v1.81.2.tar.gz
參數:
-httpListenAddr=0.0.0.0:8428 #監聽位址及端口
-storageDataPath #VictoriaMetrics将所有資料存儲在此目錄中,預設為執行啟動 victoria的目前目錄下的 victoria-metrics-data目錄中。
-retentionPeriod #存儲資料的保留,較舊的資料會自動删除,預設保留期為 1個月,預設機關為 m(月),支援的機關有 h (hour), d (day), w (week), y (year)。
mv victoria-metrics-prod /usr/local/bin/
cp victoria-metrics-prod /usr/local/bin/
啟動service檔案
vim /etc/systemd/system/victoria-metrics-prod.service
[Unit]
Description=For Victoria-metrics-prod Service
After=network.target
[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod -httpListenAddr=0.0.0.0:8428 -storageDataPath=/data/victoria -retentionPeriod=3
[Install]
WantedBy=multi-user.target
啟動服務
systemctl daemon-reload && systemctl restart victoria-metrics-prod.service
systemctl enable victoria-metrics-prod.service
prometheus配置檔案
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
remote_write:
- url: http://192.168.2.131:8428/api/v1/write
grafana配置
添加資料源,類型為 prometheus,位址及端口為 VictoriaMetrics:
victoriametrics-data-source #資料源名稱
http://192.168.2.131:8428 #victoriametrics server位址
叢集版部署
元件介紹:
vminsert :
寫入元件(寫),vminsert負責接收資料寫入并根據對度量名稱及其所有标簽的一緻 hash結果将資料分散寫入不同的後端 vmstorage節點之間 vmstorage,vminsert預設端口 8480
vmstorage :
存儲原始資料并傳回給定時間範圍内給定标簽過濾器的查詢資料,預設端口 8482
vmselect:
查詢元件(讀),連接配接 vmstorage,預設端口 8481
注意:下載下傳對應的叢集版本
部署叢集
分别在各個VictoriaMetrics伺服器進行安裝配置:
cd /app
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.81.2/victoria-metrics-linux-amd64-v1.81.2-cluster.tar.gz
tar xvf victoria-metrics-linux-amd64-v1.81.2-cluster.tar.gz
vminsert-prod
vmselect-prod
vmstorage-prod
mv vminsert-prod vmselect-prod vmstorage-prod /usr/local/bin/
部署vmstorage-prod元件
負責資料持久化,監聽端口為8482,資料寫入端口為8400,資料讀取端口為8401
啟動service檔案
vim /etc/systemd/system/vmstorage.service
[Unit]
Description=Vmstorage Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath/data/vmstorage-data -httpListenAddr :8482 -vminsertAddr :8400 -vmselectAddr :8401
[Install]
WantedBy=multi-user.target
服務啟動
systemctl daemon-reload && systemctl restart vmstorage.service && systemctl enable vmstorage.service
其他兩個節點執行同樣的操作
部署 vminsert-prod元件
接收外部的寫請求,預設端口 8480
vim /etc/systemd/system/vminsert.service
[Unit]
Description=Vminsert Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vminsert-prod -httpListenAddr :8480-storageNode=192.168.2.131:8400,192.168.2.132:8400,192.168.2.133:8400
[Install]
WantedBy=multi-user.target
啟動服務
systemctl daemon-reload && systemctl restart vminsert && systemctl enable vminsert
其他兩個節點執行相同的操作
部署 vmselect-prod元件
負責接收外部的讀請求,預設端口 8481
vim /etc/systemd/system/vmselect.service
[Unit]
Description=Vminsert Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmpExecStart=/usr/local/bin/vmselect-prod -httpListenAddr :8481 -storageNode=192.168.2.131:8401,192.168.2.132:8401,192.168.2.133:8401
[Install]
WantedBy=multi-user.target
啟動服務
systemctl daemon-reload && systemctl restart vmselect && systemctl enable vmselect
其他兩個節點執行相同的操作
驗證服務端口
192.168.2.131:
# curl http://192.168.2.131:8480/metrics
# curl http://192.168.2.131:8481/metrics
# curl http://192.168.2.131:8482/metrics
192.168.2.132:
# curl http://192.168.2.132:8480/metrics
# curl http://192.168.2.132:8481/metrics
# curl http://192.168.2.132:8482/metrics
192.168.2.133:
# curl http://192.168.2.133:8480/metrics
# curl http://192.168.2.133:8481/metrics
# curl http://192.168.2.133:8482/metrics
prometheus配置遠端寫入
#叢集寫入
remote_write:
- url: http://192.168.2.131:8480/insert/0/prometheus
- url: http://192.168.2.132:8480/insert/0/prometheus
- url: http://192.168.2.133:8480/insert/0/prometheus
grafana資料源配置
victoriametrics-clusterdata-source #資料源名稱
http://192.168.2.131:8481/select/0/prometheus #叢集資料源位址,可以寫成vip實作高可用
開啟資料複制
https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety
預設情況下,資料被 vminsert的元件基于 hash算法分别将資料持久化到不同的vmstorage節點,可以啟用 vminsert元件支援的-replicationFactor=N複制功能,将資料分别在各節點儲存一份完整的副本以實作資料的高可用。
prometheus-operator
官方位址:https://github.com/prometheus-operator/prometheus-operator
Operator部署器基于已經編寫好的yaml檔案,可以将prometheus server、alertmanager、grafana、node-exporter等元件一鍵批量部署。
下載下傳位址:
驗證pod狀态
驗證prometheus web界面:
驗證grafana web界面
alertmanager
k8s元件監控
cadvisor監控pod的資源使用率
ingress-nginx監控
kube-state-metrics監控叢集狀态
參見部落格:http://t.zoukankan.com/deny-p-14328900.html