- 監控內容
- Prometheus特點:
- 多維度數據模型:由度量名稱和鍵值對標識的時間序列數據
- PromSQL:一種靈活的查詢語言,可以利用多維數據完成複雜的查詢
- 不依賴分佈式存儲,單個服務器節點可直接工作
- 基於HTTP的pull方式採集時間序列數據
- 推送時間序列數據通過PushGateway組件支持
- 通過服務發現或靜態配置發現目標
- 多種圖形模式及儀表盤支持(grafana)
- Prometheus組成與架構
Prometheus Server:收集指標和存儲時間序列數據,並提供查詢接口
ClientLibrary:客戶端庫
Push Gateway:短期存儲指標數據,主要用於臨時性的任務
Exporters:採集已有的第三方服務監控指標並暴露metrics
Alertmanager:告警
Web UI:簡單的Web控制檯 - 數據模型
- Prometheus將所有數據存儲爲時間序列;具有相同度量名稱以及標籤屬於同一個指標。
- 每個時間序列都由
度量標準名稱
和一組鍵值對
(標籤)作爲唯一標識。 - 時間序列格式:
<metric name>{<label name>=<label value>,...)}
飯粒:api_http_requests_total{method=“POST”, handle="/messages"}
- 指標類型
- counter:遞增的計數器
- Gauge:可以任意變化的數值
- Histogram:對一段時間範圍內數據進行採樣,並對所有數值求和與同級數量
- Summary:與Histogram類似
- 實例:可以抓取的目標稱爲實例(instances)
- 作業:具有相同目標的實例集合稱爲作業(Job)
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node' static_configs: - targets: ['192.168.1.10:9090']
部署Prometheus
- 安裝
- 二進制
下載 解壓後執行同名可執行文件即可(注意:2.18.1不可用)
進入解壓目錄執行./prometheus --config.file=prometheus.yml
- docker
docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus
在瀏覽器訪問 http://192.168.33.7:9090
- 二進制
- 使用systemd管理Prometheus服務(二進制部署適用)
# vim /usr/lib/systemd/system/prometheus.service [Unit] Description=prometheus.io [Service] Restart=on-failure ExecStart=/usr/local/src/prometheus-2.18.0.linux-amd64/prometheus --config.file=/usr/local/src/prometheus-2.18.0.linux-amd64/prometheus.yml [Install] WantedBy=multi-user.target # systemctl daemon-reload # systemctl start prometheus # ps -ef
- 配置文件 官文
- 檢查配置文件是否有問題
./promtool check config [配置文件]
- 基於文件的服務發現
- 添加本機監控
- 將默認配置文件中
static_configs
兩行配置註釋 - 同級加上以下配置
file_sd_configs: - files: ['/usr/local/src/prometheus-2.18.0.linux-amd64/sd_config/local.yml'] refresh_interval: 5s
- 創建服務發現目錄
mkdir /usr/local/src/prometheus-2.18.0.linux-amd64/sd_config
- 重啓prometheus服務
systemctl restart prometheus
- 添加服務發現配置文件
在web端查看:# vim sd_config/local.yml - targets: ['localhost:9090'] labels: idc: sz
- 添加其他服務器節點監控(在上面的基礎下操作)
- 在需要被監控的node節點下載node_exporter並解壓 官文
- 配置systemd管理,啓動
# /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_exporter [Service] Restart=on-failure ExecStart=/usr/local/src/node_exporter-1.0.0.linux-amd64/node_exporter [Install] WantedBy=multi-user.target # systemctl daemon-reload # systemctl start node_exporter # curl 192.168.33.6:9100/metrics
- 服務端:配置文件中加入
- job_name: 'node' file_sd_configs: - files: ['/usr/local/src/prometheus-2.18.0.linux-amd64/sd_config/server_*.yml'] refresh_interval: 5s
- 重啓prometheus服務
systemctl restart prometheus
- 添加服務發現配置文件
在web端查看:# vim sd_config/server_node.yml - targets: ['192.168.33.6:9100', '192.168.33.9:9100']
- 監控資源消耗情況
- cpu使用率:
100 - irate(node_cpu_seconds_total{instance="192.168.33.6:9100", mode="idle", job="node"}[5m]) * 100
- 內存使用率:
100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
- 根分區剩餘空間:
node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs" } / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs" } * 100
- cpu使用率:
- 監控服務運行狀態
- 修改node_exporter.service啓動腳本,寫入需要監控的服務(可以使用正則匹配),重啓
# vim /usr/lib/systemd/system/node_exporter.service ... ExecStart=/usr/local/src/node_exporter-1.0.0.linux-amd64/node_exporter --collector.systemd --collector.systemd.unit-whitelist=(docker|etcd).service ... # systemctl daemon-reload # systemctl restart node_exporter
- 稍等片刻到web端查找:
node_systemd_unit_state{state="active"}
監控數據圖形化展示 Grafana
-
安裝grafana:
docker run -d -p 3000:3000 --name grafana grafana/grafana
在瀏覽器訪問 192.168.33.9:3000,初識賬號密碼都是admin
添加Prometheus數據源
- 手動添加dashboard:
左邊點擊添加Dashboard -> 右上點擊Add panel
下面填入Prometheus公式(如計算CPU使用率),左邊填入監控標題,Apply應用即可
- 手動添加dashboard:
-
導入模板:
在官網查找對應數據源的模板,輸入模板ID -> load
9276模板:基礎監控
-
常見監控項
- 監控容器運行
- 在被監控的機器運行cadvisor:
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg google/cadvisor
測試瀏覽器訪問:192.168.33.6:8080/metrics - 在Prometheus服務端配置文件加入數據監控
# vim prometheus.yml - job_name: 'docker' static_configs: - targets: ['192.168.33.6:8080', '192.168.33.9:8080'] # systemctl restart prometheus
- 在web端查看監控情況(搜索以container開頭的數據)
- grafana中配置模板監控docker容器:模板
193
- 監控MySQL服務器
- 在被監控服務器安裝運行mysqld_exporter
注意:docker運行不好使。# 1. 授權用戶 # mysql -uroot -p > CREATE USER 'exporter'@'localhost' IDENTIFIED BY '111111' WITH MAX_USER_CONNECTIONS 3; > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost'; # 2. 創建免交互登陸文件 # vim /usr/local/src/mysqld_exporter-0.12.1.linux-amd64/.my.cnf [client] user=exporter password=111111 # 3. 創建systemd管理配置文件 # vim /usr/lib/systemd/system/mysqld_exporter.service [Unit] Description=mysqld-exporter [Service] Restart=on-failure ExecStart=/usr/local/src/mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter --config.my-cnf=/usr/local/src/mysqld_exporter-0.12.1.linux-amd64/.my.cnf [Install] WantedBy=multi-user.target # systemctl daemon-reload # systemctl start mysqld_exporter # curl 192.168.33.6:9104/metrics
- grafana中配置監控模板
7362
監控告警Alertmanager
- 下載 安裝
- 配置Prometheus與Alertmanager通信
- 修改alertmanager配置並啓動
# 1. 編輯配置文件 # vim alertmanager.yml global: resolve_timeout: 5m # 郵件告警配置 smtp_smarthost: 'mail.xxx.com:25' smtp_from: 'xxx' smtp_auth_username: 'xxx' smtp_auth_password: 'xxx' smtp_require_tls: false route: group_by: ['alertname'] # 根據標籤進行分組 group_wait: 10s # 發送告警等待時間(在這個時間內如果有同類告警就合併以後一起發送) group_interval: 10s # 發送告警間隔時間(兩個告警的間隔) repeat_interval: 5m # 重複告警的間隔時間 receiver: 'mail' receivers: - name: 'mail' email_configs: - to: '[email protected]' # 告警收斂,暫時不用,先註釋 #inhibit_rules: # - source_match: # severity: 'critical' # target_match: # severity: 'warning' # equal: ['alertname', 'dev', 'instance'] # 2. 保存退出,檢查配置文件是否正確 # ./amtool check-config alertmanager.yml # 3. 配置systemd管理文件 # vim /usr/lib/systemd/system/alertmanager.service [Unit] Description=alertmanager [Service] Restart=on-failure ExecStart=/usr/local/src/alertmanager-0.20.0.linux-amd64/alertmanager --config.file=/usr/local/src/alertmanager-0.20.0.linux-amd64/alertmanager.yml [Install] WantedBy=multi-user.target # 4. 啓動alertmanager # systemctl daemon-reload # systemctl start alertmanager
- 修改Prometheus配置開啓alertmanager告警
在web端查看告警配置信息# vim prometheus.yml # 修改12行 - 127.0.0.1:9093 # 修改16行 - "rules/*.yml" # mkdir rules # vim rules/alert_test.yml groups: - name: general.rules # 注意不同規則文件的這個值要用不同值 rules: - alert: InstanceDown expr: up == 0 # 檢測條件,可以在Prometheus中執行的公式 for: 1m # 持續1分鐘up值爲0就報警 labels: severity: error # 告警級別 annotations: description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' summary: 'Instance {{ $labels.instance }} down' # ./promtool check config prometheus.yml # systemctl restart prometheus
- 測試告警
關閉docker cadvisor服務,觀察web端界面
告警郵件:
編寫服務器基礎告警內容:
/usr/local/src/prometheus-2.18.0.linux-amd64/rules/base_node.ymlgroups: - name: node.rules rules: - alert: DiskWillFull expr: node_filesystem_free_bytes{fstype=~"ext4|xfs" } / node_filesystem_size_bytes{fstype=~"ext4|xfs" } * 100 > 85 for: 1m labels: severity: warning annotations: description: '{{ $labels.instance }} 磁盤使用率過高' summary: 'Instance {{ $labels.instance }} :分區 {{ $labels.mountpoint }} 使用率超過85%。(當前值:{{ $value }})' - alert: CPUTooHigh expr: 100 - irate(node_cpu_seconds_total{mode="idle", job="node"}[5m]) * 100 > 80 for: 2m labels: severity: error annotations: description: '{{ $labels.instance }} CPU使用率過高' summary: 'Instance {{ $labels.instance }} CPU使用率超過80%。(當前值:{{ $value }})' - alert: MemoryTooHigh expr: 100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 80 for: 2m labels: severity: error annotations: description: '{{ $labels.instance }} 內存使用率過高' summary: 'Instance {{ $labels.instance }} 內存使用率超過80%。(當前值:{{ $value }})'
- 測試告警
- 告警狀態
Inactive:無事發生。
Pending:已觸發閾值,但未滿足告警持續時間。
Firing:已觸發閾值且滿足告警持續時間,警報發送給接收者。 - 告警通知分組發送
route: # 當所有的規則都不匹配時使用默認的 default-receiver receiver: 'default-receiver' group_wait: 30s group_interval: 5m repeat_interval: 4h group_by: [cluster, alertname] routes: - receiver: 'database-pager' group_wait: 10s # 正則匹配 match_re: service: mysql|cassandra - receiver: 'frontend-pager' group_by: [product, environment] match: team: frontend
- 告警收斂
告警分發流程:
- 分組(group):將類似性質的警報分類爲單個通知。
作用:
- 減少告警消息的數量
- 同類告警的聚合,幫助運維排查問題
- 抑制(inhibition):當告警發出後,停止重複發送由此警報引發的其他警報。
作用:消除冗餘告警。 - 靜默(silences):一種簡單的特定時間靜音提醒的機制。
作用:在維護階段阻止相應告警。
在alertmanager後臺web界面 192.168.33.8:9093 右上角創建靜默規則
- 分組(group):將類似性質的警報分類爲單個通知。
- 告警觸發流程:
- Prometheus告警規則rules/alert_test.yml
expr: up == 0 for: 5m
- alertmanager配置文件
... route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 5m ... inhibit_rules: ...
- Prometheus告警規則rules/alert_test.yml
K8s監控
-
監控方案
- cAdvisor + Heapster + InfluxDB + Grafana(淘汰)
劣勢:僅對k8s資源級對象進行監控,無法對業務進行監控;在報警方面也有諸多不足。
- cAdvisor/exporter + Prometheus + Grafana(目前主流)
- cAdvisor + Heapster + InfluxDB + Grafana(淘汰)
-
Kubernetes監控指標:
- Kubernetes本身監控:
Node資源利用率
node數量
pods數量
資源對象監控 - Pod監控
Pod數量(項目)
容器資源利用率
應用程序
官文 - 服務發現
- Kubernetes本身監控:
-
在K8s中部署Prometheus
Yaml文件 (官方github中已下線)
應用/啓動順序:kubectl apply -f prometheus-rbac.yaml kubectl apply -f prometheus-configmap.yaml kubectl apply -f prometheus-statefulset.yaml kubectl apply -f prometheus-service.yaml
通過
kubectl get pod, svc -n kube-system
查看啓動情況,並在瀏覽器訪問service/prometheus暴露端口進入Prometheus web界面。
kubelet的節點使用cadvisor提供的metrics接口獲取該節點所有容器相關的性能指標數據。
暴露接口地址:
http://[NodeIp]:10255/metrics/cadvisor
http://[NodeIp]:10255/metrics
進入Prometheus容器:kubectl exec -it prometheus-0 sh -c prometheus-server -n kube-system
-
在k8s中部署grafana
apiVersion: apps/v1 kind: StatefulSet metadata: name: grafana namespace: kube-system spec: serviceName: "grafana" replicas: 1 selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: containers: - name: grafana image: grafana/grafana ports: - containerPort: 3000 protocol: TCP resources: limits: cpu: 100m memory: 256Mi requests: cpu: 100m volumeMounts: - name: grafana-data mountPath: /var/lib/grafana subPath: grafana securityContext: fsGroup: 472 runAsUser: 472 volumeClaimTemplates: - metadata: name: grafana-data spec: storageClassName: managed-nfs-storage accessModes: - ReadWriteOnce resources: requests: storage: "1Gi" --- apiVersion: v1 kind: Service metadata: name: grafana namespace: kube-system spec: type: NodePort ports: - port: 80 nodePort: 30007 targetPort: 3000 selector: app: grafana
通過
kubectl get pod,svc -n kube-system
查看狀態
在瀏覽器訪問192.168.33.8:30007進入(默認用戶名密碼都是admin)- 推薦模板:
集羣資源監控:3119
集羣資源狀態監控:6417
Node監控:9276
- 推薦模板:
-
監控K8s集羣Node
-
監控k8s集羣資源對象 (查看所有對象信息
kubectl get all
)
使用上文提到的 Yaml文件 部署kube-state-metrics,應用/啓動順序:# kubectl apply -f kube-state-metrics-rbac.yaml # vim kube-state-metrics-deployment.yaml # 下面內容全部覆蓋 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kube-state-metrics namespace: kube-system labels: k8s-app: kube-state-metrics kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile version: v1.3.0 spec: selector: matchLabels: k8s-app: kube-state-metrics version: v1.3.0 replicas: 1 template: metadata: labels: k8s-app: kube-state-metrics version: v1.3.0 annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: priorityClassName: system-cluster-critical serviceAccountName: kube-state-metrics containers: - name: kube-state-metrics image: lizhenliang/kube-state-metrics:v1.3.0 ports: - name: http-metrics containerPort: 8080 - name: telemetry containerPort: 8081 readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 timeoutSeconds: 5 - name: addon-resizer image: lizhenliang/addon-resizer:1.8.3 resources: limits: cpu: 100m memory: 30Mi requests: cpu: 100m memory: 30Mi env: - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumeMounts: - name: config-volume mountPath: /etc/config command: - /pod_nanny - --config-dir=/etc/config - --container=kube-state-metrics - --cpu=100m - --extra-cpu=1m - --memory=100Mi - --extra-memory=2Mi - --threshold=5 - --deployment=kube-state-metrics volumes: - name: config-volume configMap: name: kube-state-metrics-config --- apiVersion: v1 kind: ConfigMap metadata: name: kube-state-metrics-config namespace: kube-system labels: k8s-app: kube-state-metrics kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration # kubectl apply -f kube-state-metrics-deployment.yaml # kubectl apply -f kube-state-metrics-service.yaml # kubectl get pod.svc -n kube-system -o wide # 檢查
在Prometheus web界面查找以
kube_
開頭的數據,如果可以匹配則表示kube-state-metrics部署成功。
在grafana中導入模板6417 -
在K8s中部署alertmanager實現告警
- 部署alertmanager
使用上文提到的 Yaml文件 部署alertmanager,應用/啓動順序:# vim alertmanager-pvc.yaml # 將存儲改爲部署的nfs(通過kubectl get sc查看) storageClassName: managed-nfs-storage # kubectl apply -f alertmanager-configmap.yaml # kubectl apply -f alertmanager-pvc.yaml # kubectl apply -f alertmanager-deployment.yaml # kubectl apply -f alertmanager-service.yaml
- 配置Prometheus與alertmanager通信
在Prometheus構建配置的yaml文件中修改最底的alerting配置,重新構建讓他生效
在瀏覽器Prometheus web界面 Status - Configuration 查看配置是否生效# vim prometheus-configmap.yaml alerting: alertmanagers: - static_configs: - targets: ["alertmanager:80"] # kubectl apply -f prometheus-configmap.yaml
- 配置告警
- Prometheus指定rules目錄
在Prometheus構建配置的yaml文件中添加規則匹配,重新構建讓他生效(檢查方法同上)# vim prometheus-configmap.yaml data: prometheus.yml: | # 加入以下兩行 rule_files: - /etc/config/rules/*.rules # kubectl apply -f prometheus-configmap.yaml
- configmap存儲告警規則
# vim prometheus-rules.yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-rules namespace: kube-system data: general.rules: | groups: - name: general.rules rules: - alert: InstanceDown expr: up == 0 for: 5m labels: severity: error annotations: description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' summary: 'Instance {{ $labels.instance }} down' - name: node.rules rules: - alert: DiskWillFull expr: node_filesystem_free_bytes{fstype=~"ext4|xfs" } / node_filesystem_size_bytes{fstype=~"ext4|xfs" } * 100 > 85 for: 2m labels: severity: warning annotations: description: '{{ $labels.instance }} 磁盤使用率過高' summary: 'Instance {{ $labels.instance }} :分區 {{ $labels.mountpoint }} 使用率超過85%。(當前值:{{ $value }})' - alert: CPUTooHigh expr: 100 - irate(node_cpu_seconds_total{mode="idle", job="node"}[5m]) * 100 > 80 for: 2m labels: severity: error annotations: description: '{{ $labels.instance }} CPU使用率過高' summary: 'Instance {{ $labels.instance }} CPU使用率超過80%。(當前值:{{ $value }})' - alert: MemoryTooHigh expr: 100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 80 for: 2m labels: severity: error annotations: description: '{{ $labels.instance }} 內存使用率過高' summary: 'Instance {{ $labels.instance }} 內存使用率超過80%。(當前值:{{ $value }})' # kubectl apply -f prometheus-rules.yaml
- configmap掛載到容器rules目錄
在數據卷位置加上rules的配置並重新構建
注意:這裏加入的name要與規則文件base_node.yml內容中的name對應,否則會出錯。# vim prometheus-statefulset.yaml ... volumeMounts: - name: config-volume mountPath: /etc/config - name: prometheus-data mountPath: /data subPath: "" # 加上以下兩行 - name: prometheus-rules mountPath: /etc/config/rules terminationGracePeriodSeconds: 300 volumes: - name: config-volume configMap: name: prometheus-config # 加上以下三行 - name: prometheus-rules configMap: name: prometheus-rules # kubectl apply -f prometheus-statefulset.yaml # kubectl get pod -n kube-system
在瀏覽器Prometheus web界面 Status - Rules 查看規則配置是否生效
- alertmanager加入發送郵件配置並生效
# vim alertmanager-configmap.yaml alertmanager.yml: | global: # 加入以下6行 resolve_timeout: 5m smtp_smarthost: 'mail.xxx.com:25' smtp_from: '[email protected]' smtp_auth_username: '[email protected]' smtp_auth_password: 'xxx' smtp_require_tls: false receivers: - name: default-receiver # 加入以下兩行:接收人 email_configs: - to: '[email protected]' # kubectl apply -f alertmanager-configmap.yaml
- 分別進入Prometheus和alertmanager容器查看規則是否寫入
手動關閉某個服務測試告警功能。# kubectl exec -it prometheus-0 sh -c prometheus-server -n kube-system /prometheus $ ls /etc/config/rules/ general.rules /prometheus $ vi /etc/config/rules/general.rules /prometheus $ exit # kubectl exec -it alertmanager-5bb796cb48-fbp77 sh -n kube-system /alertmanager # ls /etc/config/ alertmanager.yml /alertmanager # vi /etc/config/alertmanager.yml /alertmanager # exit
- Prometheus指定rules目錄
- 總結
- 標籤很重要:可以按照環境、部門、項目、管理者劃分資源標籤
- Grafana靈活配置模板
- PromSQL
- 利用服務發現動態加入目標
- 拓展:對業務監控