Prometheus简介 Prometheus组件介绍
Prometheus Server : 用于抓取指标、存取时间序列数据
exporter : 暴露指标让任务job来抓取
pushgateway :push的方式将指标数据推送到该网关
altermanager :处理报警的报警组件
adhoc :用于数据查询
下图是Prometheus 官方提供的架构及其一些相关的生态系统组件:
)
Prometheus 直接接收或者通过中间的 Pushgateway 网关被动获取指标数据,在本地存储所有的获取的指标数据,并对这些数据进行规则整理,通过 Altermanager 进行报警或者通过Granfana 等工具进行展示。
Prometheus Operator介绍 Prometheus Operator
的本职就是一组用户自定义的CRD
资源以及Controller
的实现,Prometheus Operator
负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如Prometheus Server
自身以及配置的自动化管理工作。以下是Prometheus Operator
的架构图
kube-Prometheus 项目介绍 prometheus-operator官方地址:https://github.com/prometheus-operator/prometheus-operator kube-prometheus官方地址:https://github.com/prometheus-operator/kube-prometheus
两个项目的关系:前者只包含了Prometheus Operator
,后者既包含了Operator
,又包含了Prometheus
相关组件的部署及常用的Prometheus
自定义监控,具体包含下面的组件
The Prometheus Operator:创建CRD自定义的资源对象 Prometheus Operator 是一种 Kubernetes 原生的监控解决方案,它基于 Prometheus 和 Kubernetes 进行深度集成,并提供了自动化的配置和管理方式,使得用户可以更加方便地在 Kubernetes 集群中使用 Prometheus 进行监控。
Prometheus Operator 的主要特点包括:
支持自动发现和配置:Prometheus Operator 可以根据 Kubernetes 资源定义自动发现和配置 Prometheus 监控目标;
支持自动缩放:Prometheus Operator 可以自动根据负载情况调整 Prometheus 实例数量;
具有高可用性:Prometheus Operator 支持集群模式部署,保证了监控服务的高可用性;
提供多种资源类型:Prometheus Operator 提供多种 Kubernetes 资源类型,如 ServiceMonitor、Prometheus、Alertmanager 等,便于用户进行监控配置和管理。
通过 Prometheus Operator,用户可以将 Prometheus 与 Kubernetes 紧密地结合起来,快速构建稳定、可靠的监控系统。
Highly available Prometheus:创建高可用的Prometheus Prometheus-k8s 是一个用于在 Kubernetes 环境中部署和运行 Prometheus 的一款组件,它基于 Kubernetes 的 API 资源对象进行配置,并以容器化的方式运行 Prometheus Server 和 Prometheus Alertmanager。
Prometheus-k8s 主要提供以下特性:
部署管理:通过使用 Kubernetes 配置文件和 Helm Chart 部署和管理 Prometheus Server、Prometheus Alertmanager 和其他相关组件;
自动服务发现:通过 Prometheus Operator 进行自动服务发现,并将配置信息与 Kubernetes API 资源对象同步;
指标采集:支持多种指标采集方式,如 Prometheus PushGateway、Kubernetes ServiceDiscovery、Prometheus Node Exporter 等;
监控告警:通过 Prometheus Alertmanager 实现告警管理和通知,并支持多种通知方式,如邮件、Slack 等;
多租户支持:通过 Prometheus Tenant Manager 进行多租户的安全隔离和管理;
可扩展性:支持联邦集群、Horizonal Pod Autoscaler(HPA)等功能,保证了系统的可扩展性和高可用性。
通过 Prometheus-k8s,管理员可以轻松地在 Kubernetes 环境中构建和部署 Prometheus 监控系统,并实现全面的自动化监控和可视化告警通知。 同时,使用 Prometheus-k8s 也可以降低操作复杂性、提高系统稳定性,从而更好地支持容器化应用程序的管理和运营。
Highly available Alertmanager:创建高可用的告警组件
Alertmanager 是一个开源的告警管理系统,它与 Prometheus 搭配使用,主要负责处理由 Prometheus 生成的告警信息。当 Prometheus 监测到某个指标的值超出了预设的阈值或者其他条件时,它会生成一个告警信息并发送给 Alertmanager,然后由 Alertmanager 对这些告警信息进行分组、去重和通知等操作。
Alertmanager 的主要特点包括:
支持多种通知方式,包括电子邮件、Slack、PagerDuty 等;
具有灵活的告警路由规则,可以根据不同的告警源、严重程度、时间等条件来控制告警的发送方式;
提供丰富的告警模板,可以根据用户的需求自定义告警内容的格式;
具备高可用性,支持集群模式部署,保证告警服务的稳定可靠性。
alertmanager-main 是 Alertmanager 的主要配置文件,它包含了 Alertmanager 的全局配置信息、路由规则、通知配置等内容 。
alertmanager-main 配置文件中的一些常见配置项包括:
global 配置项:用于定义全局配置信息,如邮件服务器、安全设置等;
route 配置项:用于定义告警路由规则,可以根据告警标签、匹配表达式等条件来控制告警发送的方式;
receivers 配置项:用于定义通知接收者(receiver),可以通过电子邮件、Slack、PagerDuty 等多种方式发送告警通知;
inhibit_rules 配置项:用于定义告警抑制规则,可以防止多个相似的告警同时发送。
alertmanager-main 配置文件是使用 YAML 格式编写的,用户可以根据自己的需求对其进行自定义配置。在修改配置文件后,需要重新启动 Alertmanager 才能生效
alertmanager-operated 是 Alertmanager Operator 生成的用于部署和管理 Alertmanager 的 Kubernetes 资源 ,它包含了 Alertmanager 的一些配置信息,如路由规则、通知接收者等。 与 alertmanager-main 配置文件不同,alertmanager-operated 文件是由 Prometheus Operator 自动生成的,并且它的内容是动态生成的。当用户对相应的 Kubernetes 资源进行修改时,Prometheus Operator 将会重新生成 alertmanager-operated 文件以更新 Alertmanager 的配置。
alertmanager-operated 文件的主要配置项包括:
podMetadata 配置项:用于定义 Alertmanager Pod 的元数据信息;
replicas 配置项:用于定义 Alertmanager 实例数量;
version 配置项:用于定义 Alertmanager 版本号;
logLevel 配置项:用于定义 Alertmanager 日志级别;
configSecret 配置项:用于定义 Alertmanager 配置文件的 Secret 对象名称;
serviceAccountName 配置项:用于定义 Alertmanager 所属的 ServiceAccount 名称
alertmanager-operated 文件是 Prometheus Operator 管理 Alertmanager 的重要工具之一,通过对其进行修改,可以快速配置和管理 Alertmanager 的运行模式和相关参数。
Prometheus node-exporter:创建主机的监控组件 用于监控 Linux/Unix 主机的操作系统指标信息。它主要通过在目标节点上运行一个守护进程,收集各种主机指标数据,并将这些数据暴露给 Prometheus 进行采集和监控。
node-exporter 监控的主机指标包括:
CPU、内存、磁盘使用率等基本系统指标信息;
网络流量、传输速度等网络相关指标信息;
文件系统、磁盘 I/O、负载均衡等系统性能指标信息;
温度、电压、风扇转速等硬件相关指标信息等。
node-exporter 可以以多种形式运行,如作为二进制文件、Docker 容器、systemd 服务等,同时也支持多种输出格式,如纯文本、JSON、Prometheus 格式等。此外,node-exporter 也可以通过配置文件进行定制化设置,以满足不同场景下的需求。 通过 node-exporter,管理员可以及时了解目标节点的运行状态,优化和调整系统资源分配,以确保容器应用程序和 Kubernetes 集群的顺畅运行。
Prometheus Adapter for Kubernetes Metrics APIs:创建自定义监控的指标工具 Prometheus-adapter 是一个用于将 Prometheus 的指标适配为 Kubernetes API 资源指标的组件。它主要通过将 Prometheus 的查询结果转换为 Kubernetes API 资源指标,并将其合并到 Kubernetes API 服务器中,以便于在 HPA(Horizontal Pod Autoscaler)等 Kubernetes 内部组件中使用。
Prometheus-adapter 支持的资源对象包括:
Deployment:用于自动扩展部署中的容器副本数量;
StatefulSet:用于自动扩展 StatefulSet 中的容器副本数量;
DaemonSet:用于自动扩展 DaemonSet 中的节点数量。
例如,当使用 Prometheus-adapter 和 HPA 结合时,可以根据 Prometheus 中特定指标的值自动调整容器副本的数量,以满足应用程序的负载变化。 同时,在 Prometheus-adapter 中也支持提供多个不同的 Kubernetes API 资源指标对象定义,以便于管理员根据不同的场景需求进行自定义设置和使用。 通过 Prometheus-adapter,管理员可以轻松地将 Prometheus 监控指标集成到 Kubernetes 中,为 Kubernetes 应用程序提供全面的自动扩展和监控能力,提高系统的弹性和可靠性。
kube-state-metrics:监控k8s相关资源对象的状态指标 kube-state-metrics 是 Kubernetes 的一种监控工具,用于监控 Kubernetes 集群的各种状态信息。它主要通过从 Kubernetes API 服务器获取资源对象的指标信息来实现监控。
kube-state-metrics 支持的资源对象包括:
Node:节点资源对象,包含了该节点的 CPU、内存、存储等指标信息;
Pod:Pod 资源对象,包含了该 Pod 的 CPU 使用率、内存使用率、网络流量等指标信息;
Deployment:部署资源对象,包含了该部署的副本数、可用性等指标信息;
Service:服务资源对象,包含了该服务的连接数、请求延迟、流量量等指标信息;
ReplicaSet、StatefulSet、DaemonSet 等其他资源对象。
kube-state-metrics 暴露了一个 HTTP API,可以通过 Prometheus 进行采集和监控,并将数据聚合到 Prometheus 的时序数据库中。通过kube-state-metrics,管理员可以及时发现 Kubernetes 集群中的异常情况,对系统健康状态进行全面监控和管理。
Grafana:进行图像展示 Grafana 是一个用于展示和分析指标数据的开源数据可视化工具。它支持多种数据源,包括 Prometheus、Elasticsearch、InfluxDB 等,可以帮助用户以图形化的方式更好地理解监控数据、日志数据等。 Grafana 的主要特点包括:
支持多种数据源,用户可以方便地将不同的数据源整合在一起进行展示和分析;
提供丰富的可视化功能,包括各种图表类型、仪表盘、报表等;
具备灵活的告警功能,可以根据用户的需求自定义告警规则;
支持多种插件扩展,用户可以根据自己的需要添加适合自己的插件。
配置安装 下载、解压安装文件 KUBE_PROMETHEUS_VERSION = 0.13 .0
wget --content-disposition https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v$KUBE_PROMETHEUS_VERSION .tar.gz
$ tar -zxf kube-prometheus-0.13.0.tar.gz
$ tree -L 1 .
.
├── build.sh
├── CHANGELOG.md
├── code-of-conduct.md
├── CONTRIBUTING.md
├── developer-workspace
├── docs
├── example.jsonnet
├── examples
├── experimental
├── go.mod
├── go.sum
├── jsonnet
├── jsonnetfile.json
├── jsonnetfile.lock.json
├── kubescape-exceptions.json
├── kustomization.yaml
├── LICENSE
├── Makefile
├── manifests
├── README.md
├── RELEASE.md
├── scripts
└── tests
替换组件所需镜像
$ sed -i 's#registry.k8s.io/kube-state-metrics/kube-state-metrics#docker.io/xuxiaoweicomcn/kube-state-metrics#g' manifests/kubeStateMetrics-deployment.yaml
$ sed -i 's#registry.k8s.io/prometheus-adapter/prometheus-adapter#docker.io/xuxiaoweicomcn/prometheus-adapter#g' manifests/prometheusAdapter-deployment.yaml
修改networkpolicy 允许外部访问 $ cat manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/ - from:/ - from: \[\]/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/ - podSelector:/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/ matchLabels:/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/ app.kubernetes\.io\/name: prometheus/#&/' manifests/alertmanager-networkPolicy.yaml
$ sed -i 's/ app.kubernetes\.io\/name: alertmanager/#&/' manifests/alertmanager-networkPolicy.yaml
$ cat manifests/grafana-networkPolicy.yaml
$ sed -i 's/ - from:/ - from: \[\]/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/ - podSelector:/#&/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/ matchLabels:/#&/' manifests/grafana-networkPolicy.yaml
$ sed -i 's/ app.kubernetes\.io\/name: prometheus/#&/' manifests/grafana-networkPolicy.yaml
$ cat manifests/prometheus-networkPolicy.yaml
$ sed -i 's/ - from:/ - from: \[\]/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/ - podSelector:/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/ matchLabels:/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/ app.kubernetes\.io\/name: prometheus/#&/' manifests/prometheus-networkPolicy.yaml
$ sed -i 's/ app.kubernetes\.io\/name: grafana/#&/' manifests/prometheus-networkPolicy.yaml
修改服务组件使用NodePort方式暴漏 $ sed -i '/spec/a \ type: NodePort' manifests/alertmanager-service.yaml
$ sed -i '/spec/a \ type: NodePort' manifests/prometheus-service.yaml
$ sed -i '/spec/a \ type: NodePort' manifests/grafana-service.yaml
修改Prometheus 持久化 prometheus是一种 StatefulSet 有状态集的部署模式,所以直接将 StorageClass 配置到里面,在下面的 yaml 中最下面添加持久化配置。
目录: manifests/prometheus-prometheus.yaml
在文件末尾新增
---
version : 2.46.0
storage :
volumeClaimTemplate :
spec :
storageClassName : qiqios- nfs- storage
resources :
requests :
storage : 5Gi
修改 grafana 持久化配置 由于 Grafana 是部署模式为 Deployment,所以我们提前为其创建一个 grafana-pvc.yaml 文件,加入下面 PVC 配置
目录: manifests/grafana-pvc.yaml
kind : PersistentVolumeClaim
apiVersion : v1
metadata :
name : grafana
namespace : monitoring
spec :
storageClassName : qiqios- nfs- storage
accessModes :
- ReadWriteOnce
resources :
requests :
storage : 5Gi
修改 grafana-deployment.yaml 文件设置持久化配置,应用上面的 PVC(目录:manifests/grafana-deployment.yaml)
修改内容如下:
---
serviceAccountName : grafana
volumes :
- name : grafana- storage
persistentVolumeClaim :
claimName : grafana
- name : grafana- datasources
secret :
secretName : grafana- datasources
修改Grafana-dashboard 显示时区 kube-prometheus项目中,默认dashboard时区是UTC,比中国时间慢了8小时,很不便于日常监控查看。
$ grep -i timezone ./manifests/grafana-dashboardDefinitions.yaml
"timezone" : "utc" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "utc" ,
"timezone" : "utc" ,
"timezone" : "utc" ,
"timezone" : "utc" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "browser" ,
"timezone" : "utc" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
"timezone" : "UTC" ,
sed 命令直接修改,调整时间utc为utc+8
$ sed -i 's/UTC/UTC+8/g' ./manifests/grafana-dashboardDefinitions.yaml
$ sed -i 's/utc/utc+8/g' ./manifests/grafana-dashboardDefinitions.yaml
$ grep -i timezone ./manifests/grafana-dashboardDefinitions.yaml
"timezone" : "utc+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "utc+8" ,
"timezone" : "utc+8" ,
"timezone" : "utc+8" ,
"timezone" : "utc+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "browser" ,
"timezone" : "utc+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
"timezone" : "UTC+8" ,
初始化 安装 安装方式:https://github.com/prometheus-operator/kube-prometheus#quickstart
kubectl apply --server-side -f manifests/setup
kubectl wait --for condition = Established --all CustomResourceDefinition --namespace = monitoring
kubectl apply -f manifests/
kubectl get pod,svc -n monitoring
kubectl get prometheuses -n monitoring
卸载 kubectl delete --ignore-not-found= true -f manifests/ -f manifests/setup
查看pod状态是否正常 $ kubectl get pod - n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager- main- 0 2/2 Running 0 3m50s
alertmanager- main- 1 2/2 Running 0 3m50s
alertmanager- main- 2 2/2 Running 0 3m50s
blackbox- exporter- 6cfc4bffb6- gjxm6 3/3 Running 0 3m59s
grafana- 748964b847- kvjdv 1/1 Running 0 3m58s
kube- state- metrics- bfc54b7f- 8rbpp 3/3 Running 0 3m58s
node- exporter- 88wqk 2/2 Running 0 3m57s
node- exporter- 94r8l 2/2 Running 0 3m57s
node- exporter- mbv9z 2/2 Running 0 3m57s
node- exporter- mjpwc 2/2 Running 0 3m57s
node- exporter- qtsnk 2/2 Running 0 3m57s
prometheus- adapter- c5c768944- hqclp 1/1 Running 0 3m56s
prometheus- adapter- c5c768944- x4mfb 1/1 Running 0 3m56s
prometheus- k8s- 0 2/2 Running 0 3m48s
prometheus- k8s- 1 2/2 Running 0 3m48s
prometheus- operator- 68f6c79f9d- mscbq 2/2 Running 0 3m56s
查看 Service相关端口和暴漏方式 $ kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT( S) AGE
alertmanager-main NodePort 10.68 .153.118 < none> 9093 :32550/TCP,8080:31973/TCP 5m12s
alertmanager-operated ClusterIP None < none> 9093 /TCP,9094/TCP,9094/UDP 5m3s
blackbox-exporter ClusterIP 10.68 .138.74 < none> 9115 /TCP,19115/TCP 5m12s
grafana NodePort 10.68 .78.165 < none> 3000 :31405/TCP 5m11s
kube-state-metrics ClusterIP None < none> 8443 /TCP,9443/TCP 5m11s
node-exporter ClusterIP None < none> 9100 /TCP 5m10s
prometheus-adapter ClusterIP 10.68 .66.173 < none> 443 /TCP 5m9s
prometheus-k8s NodePort 10.68 .187.0 < none> 9090 :31974/TCP,8080:31218/TCP 5m9s
prometheus-operated ClusterIP None < none> 9090 /TCP 5m1s
prometheus-operator ClusterIP None < none> 8443 /TCP 5m9s
修改grafana配置 获取当前grafana配置 kubectl -n monitoring get secrets grafana-config -ojsonpath = '{.data.grafana\.ini}' | base64 --decode ; echo
[ date_formats]
default_timezone = UTC
编写明文配置文件 cat << EOF > grafana.ini
[date_formats]
# 时区:亚洲上海
default_timezone = Asia/Shanghai
[auth.anonymous]
# 匿名访问:开启
enabled = true
[security]
# 允许 iframe 被嵌套
allow_embedding = true
[users]
# 默认语言:中文
default_language = zh-Hans
EOF
使用base64 加密配置文件 cat grafana.ini | base64
W2RhdGVfZm9ybWF0c10KIyDml7bljLrvvJrkuprmtLLkuIrmtbcKZGVmYXVsdF90aW1lem9uZSA9
IEFzaWEvU2hhbmdoYWkKClthdXRoLmFub255bW91c10KIyDljL/lkI3orr/pl67vvJrlvIDlkK8K
ZW5hYmxlZCA9IHRydWUKCltzZWN1cml0eV0KIyDlhYHorrggaWZyYW1lIOiiq+W1jOWllwphbGxv
d19lbWJlZGRpbmcgPSB0cnVlCgpbdXNlcnNdCiMg6buY6K6k6K+t6KiA77ya5Lit5paHCmRlZmF1
bHRfbGFuZ3VhZ2UgPSB6aC1IYW5zCgo =
修改grafana的配置文件 $ kubectl - n monitoring edit secrets grafana- config - o yaml
apiVersion : v1
data :
grafana.ini : W2RhdGVfZm9ybWF0c10KIyDml7bljLrvvJrkuprmtLLkuIrmtbcKZGVmYXVsdF90aW1lem9uZSA9IEFzaWEvU2hhbmdoYWkKClthdXRoLmFub255bW91c10KIyDljL/lkI3orr/pl67vvJrlvIDlkK8KZW5hYmxlZCA9IHRydWUKCltzZWN1cml0eV0KIyDlhYHorrggaWZyYW1lIOiiq+W1jOWllwphbGxvd19lbWJlZGRpbmcgPSB0cnVlCgpbdXNlcnNdCiMg6buY6K6k6K+t6KiA77ya5Lit5paHCmRlZmF1bHRfbGFuZ3VhZ2UgPSB6aC1IYW5zCgo=
kind : Secret
metadata :
annotations :
kubectl.kubernetes.io/last-applied-configuration : |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"grafana","app.kubernetes.io/name":"grafana","app.kubernetes.io/part-of":"kube-prometheus","app.kubernetes.io/version":"9.5.3"},"name":"grafana-config","namespace":"monitoring"},"stringData":{"grafana.ini":"[date_formats]\ndefault_timezone = UTC\n"},"type":"Opaque"}
creationTimestamp : "2023-12-14T09:15:41Z"
labels :
app.kubernetes.io/component : grafana
app.kubernetes.io/name : grafana
app.kubernetes.io/part-of : kube- prometheus
app.kubernetes.io/version : 9.5.3
name : grafana- config
namespace : monitoring
resourceVersion : "2009097"
uid : 402082f7- e647- 4663- a82a- f285d7ec6840
type : Opaque
重启grafana的deployment控制器即可加载 kubectl -n monitoring rollout restart deployment grafana