一 Prometheus简介

1.1 Prometheus架构

Prometheus是一个开源的服务监控系统和时序数据库

其提供了通用的数据模型和快捷数据采集、存储和查询接口

它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据

当新拉取到的数据大于配置的内存缓存区时,数据就会持久化到存储设备当中

image-20251026223949970

核心组件功能

  • Prometheus server:包含 Retrieval(负责拉取指标,校验指标存入TSDB)、TSDB(时序数据库,存储指标数据在 HDD/SSD 上)、HTTP server(提供查询接口等)。

  • Service discovery:通过 Kubernetes 和 file_sd(文件服务发现)来发现监控目标。

  • Pushgateway:用于接收短生命周期任务(Short-lived jobs)在退出时推送的指标,再供 Prometheusserver 拉取。

    • jobs/exportersshort-lived jobs 可以主动通过Pushgateway主动提供指标数据给Prometheus server
  • Alertmanager:处理 Prometheus server 的告警,通过 Pagerduty、Email 等渠道通知。

  • 数据可视化与导出组件:包括 Prometheus web UI、Grafana(专业可视化工具)、API clients,它们通过 PromQL 查询指标数据。

  • Prometheus targets:Jobs/exporters 与short-lived jobs等被监控的目标,提供指标数据。

1.2 k8s中Prometheus每个service的作用

image-20251026224118174

组件功能:

  • 监控代理程序:如node_exporter:收集主机的指标数据,如平均负载、CPU、内存、磁盘、网络等等多个维度的指标数据。
  • kubelet(cAdvisor):收集容器指标数据,也是K8S的核心指标收集,每个容器的相关指标数据包括:CPU使用率、限额、文件系统读写限额、内存使用率和限额、网络报文发送、接收、丢弃速率等等。
  • API Server:收集API Server的性能指标数据,包括控制队列的性能、请求速率和延迟时长等等
  • etcd:收集etcd存储集群的相关指标数据
  • kube-state-metrics:该组件可以派生出k8s相关的多个指标数据,主要是资源类型相关的计数器和元数据信息,包括制定类型的对象总数、资源限额、容器状态以及Pod资源标签系列等。

工作原理:

  • 每个被监控的主机都可以通过专用的exporter程序提供输出监控数据的接口,并等待Prometheus服务器周期性的进行数据抓取
  • 如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到Alertmanager完成告警的汇总和分发
  • 当被监控的目标有主动推送数据的需求时,可以以Pushgateway组件进行接收并临时存储数据,然后等待Prometheus服务器完成数据的采集
  • 任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示
  • 监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理

二 k8s中部署Prometheus

2.1 下载部署所需资源

1.在线部署

#在helm中添加Prometheus仓库
[root@master prometheus]# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

#下载Prometheus项目
[root@master prometheus]# helm pull prometheus-community/kube-prometheus-stack
[root@master prometheus]# ls
kube-prometheus-stack-62.6.0.tgz

#解压项目包
[root@master prometheus]# tar zxf kube-prometheus-stack-62.6.0.tgz
[root@master prometheus]# ls
kube-prometheus-stack  kube-prometheus-stack-62.6.0.tgz
[root@master prometheus]# cd kube-prometheus-stack/
ls
Chart.lock  charts  Chart.yaml  CONTRIBUTING.md  README.md  templates  values.yaml

#根据所有项目中的values.yaml中指定的image路径下载容器镜像并上传至harbor仓库

2.本地部署

#导入项目包

#本地导入项目包
[root@master prometheus]# tar zxf kube-prometheus-stack-62.6.0.tgz
[root@master prometheus]# ls
kube-prometheus-stack  kube-prometheus-stack-62.6.0.tgz

#导入镜像并上传到私人harbor仓库

#导入本地
[root@master prometheus]# docker load -i prometheus-62.6.0.tar
[root@master prometheus]# docker load -i grafana-11.2.0.tar
[root@master prometheus]# docker load -i kube-state-metrics-2.13.0.tar
[root@master prometheus]# docker load -i node-exporter-v1.8.2.tar

#打标签,上传到仓库
[root@master prometheus]# docker tag reg.timinglee.org/prometheus/node-exporter:v1.8.2 reg.fy.org/prometheus/node-exporter:v1.8.2
[root@master prometheus]# docker push reg.fy.org/prometheus/node-exporter:v1.8.2

#在所有项目中修改values.yaml的仓库地址跟镜像路径

[root@master prometheus]# cd kube-prometheus-stack/
[root@master kube-prometheus-stack]# ls
Chart.lock  charts  Chart.yaml  CONTRIBUTING.md  README.md  templates  values.yaml
[root@master kube-prometheus-stack]# vim values.yaml

[root@master charts]# ls
crds  grafana  kube-state-metrics  prometheus-node-exporter  prometheus-windows-exporter

[root@master kube-prometheus-stack]# vim charts/grafana/values.yaml 
[root@master kube-prometheus-stack]# vim charts/kube-state-metrics/values.yaml 
[root@master kube-prometheus-stack]# vim charts/prometheus-node-exporter/values.yaml 

3.利用helm安装Prometheus

#创建管理Prometheus的命令空间
[root@master kube-prometheus-stack]# kubectl create namespace kube-prometheus-stack

#开始安装
[root@master kube-prometheus-stack]# helm  -n kube-prometheus-stack install kube-prometheus-stack  .
NAME: kube-prometheus-stack
LAST DEPLOYED: Tue Sep 10 20:56:53 2024
NAMESPACE: kube-prometheus-stack
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace kube-prometheus-stack get pods -l "release=kube-prometheus-stack"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
#安装成功

4.查看是否运行

[root@master kube-prometheus-stack]# kubectl -n kube-prometheus-stack get pods

image-20250823000917651

[root@master prometheus]# kubectl -n kube-prometheus-stack  get svc

image-20251027120433906

5.修改暴露方式提供访问

#修改暴漏方式,把grafana,Prometheus主程序,alertmanager告警设置为loadbalancer可以通过http访问查看
[root@master kube-prometheus-stack]# kubectl -n kube-prometheus-stack edit svc kube-prometheus-stack-grafana
  type: LoadBalancer
  
[root@master prometheus]# kubectl -n kube-prometheus-stack edit svc kube-prometheus-stack-alertmanager
	type: LoadBalancer

[root@master prometheus]# kubectl -n kube-prometheus-stack edit svc kube-prometheus-stack-prometheus
	type: LoadBalancer

#可以通过loadbalancer暴露的EXTERNAL-IP访问
[root@master prometheus]# kubectl -n kube-prometheus-stack get svc
NAME                                             TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                         AGE
alertmanager-operated                            ClusterIP      None             <none>          9093/TCP,9094/TCP,9094/UDP      32m
kube-prometheus-stack-alertmanager               LoadBalancer   10.104.86.139    172.25.254.53   9093:31518/TCP,8080:30882/TCP   32m
kube-prometheus-stack-grafana                    LoadBalancer   10.97.73.239     172.25.254.51   80:31137/TCP                    32m
kube-prometheus-stack-kube-state-metrics         ClusterIP      10.100.217.186   <none>          8080/TCP                        32m
kube-prometheus-stack-operator                   ClusterIP      10.111.213.74    <none>          443/TCP                         32m
kube-prometheus-stack-prometheus                 LoadBalancer   10.105.44.75     172.25.254.52   9090:30811/TCP,8080:30891/TCP   32m
kube-prometheus-stack-prometheus-node-exporter   ClusterIP      10.101.248.55    <none>          9100/TCP                        32m
prometheus-operated                              ClusterIP      None             <none>          9090/TCP                        32m 

image-20251027120226926

[!NOTE]

各个svc的作用

alertmanager-operated 告警管理

kube-prometheus-stack-grafana 展示prometheus采集到的指标

kube-prometheus-stack-prometheus-node-exporter 收集节点级别的指标的工具

kube-prometheus-stack-prometheus 主程序

2.2 登录grafana

1 查看登录密码

#密码保存在这个secrets中导出yaml文件进行转码查看
[root@master prometheus]# kubectl -n kube-prometheus-stack get secrets kube-prometheus-stack-grafana -o yaml
apiVersion: v1
data:
  admin-password: cHJvbS1vcGVyYXRvcg==
  admin-user: YWRtaW4=
......

#查看用户跟密码
[root@master prometheus]# echo -n "cHJvbS1vcGVyYXRvcg==" | base64 -d
prom-operator
[root@master prometheus]# echo -n "YWRtaW4=" | base64 -d
admin
#如果要更改密码可以把要更改的密码进行转码填入secret中即可

2.在图形化界面登录

在浏览器访问暴露的IP,172.25.254.51

image-20250823002343703

#登录成功

image-20250823002414816

2.3 导入面板

官方监控模板:https://grafana.com/grafana/dashboards

导入步骤如下:

image-20250823002823449

image-20250823002828481

image-20250823002837194

image-20251027120704944

导入后效果如下

image-20250823002853515

三 监控使用实例

3.1 建立监控项目

在线下载所需helm项目

#下载示例所需helm项目
[root@master prometheus]# helm  pull  bitnami/nginx --version 18.1.11
[root@master prometheus]# ls
nginx-18.1.11.tgz  nginx-exporter-1.3.0-debian-12-r2.tar

[root@master prometheus]# tar zxf nginx-18.1.11.tgz
[root@master prometheus]# cd nginx/

离线建立

#本地传输所需镜像与项目包
[root@master prometheus]# ls
nginx-18.1.11.tgz  nginx-exporter-1.3.0-debian-12-r2.tar

[root@master prometheus]# docker load -i nginx-exporter-1.3.0-debian-12-r2.tar
[root@master prometheus]# docker tag bitnami/nginx-exporter:1.3.0-debian-12-r2 reg.fy.org/bitnami/nginx-exporter:1.3.0-debian-12-r2
[root@master prometheus]# docker push reg.fy.org/bitnami/nginx-exporter:1.3.0-debian-12-r2

[root@master prometheus]# tar zxf nginx-18.1.11.tgz
[root@master prometheus]# cd nginx/

修改项目开启监控

[root@master prometheus]# vim values.yaml
......
metrics:
  ## @param metrics.enabled Start a Prometheus exporter sidecar container
  ##
  enabled: true
  ## Bitnami NGINX Prometheus Exporter image
  ## ref: https://hub.docker.com/r/bitnami/nginx-exporter/tags/
......
  serviceMonitor:
    ## @param metrics.serviceMonitor.enabled Creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`)
    ##
    enabled: true
    ## @param metrics.serviceMonitor.namespace Namespace in which Prometheus is running
    ##
namespace: "kube-prometheus-stack"
......
    labels:
      release: kube-prometheus-stack			#指定监控标签
      
[root@master prometheus]# kubectl -n kube-prometheus-stack get servicemonitors.monitoring.coreos.com --show-labels

#安装项目,在安装之前一定要上传镜像到仓库中
[root@master nginx]# helm install testnginx .
NAME: testnginx
LAST DEPLOYED: Sun Oct 26 23:22:21 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 18.1.11
APP VERSION: 1.27.1

[root@master nginx]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
testnginx-5b75c79fbb-r29hg   2/2     Running   0          10m
[root@master nginx]# kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                     AGE
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP                                     14d
testnginx    LoadBalancer   10.109.33.174   172.25.254.54   80:30994/TCP,443:30573/TCP,9113:31055/TCP   10m
[root@master nginx]# curl 172.25.254.52
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#压力测试
[root@master nginx]# dnf install httpd-tools -y
[root@master nginx]# ab -c 5 -n 100 http://172.25.254.54/index.html

3.2 监控调整

访问Prometheus主程序

image-20251027125653620

image-20251027130220002

image-20251027130024466

image-20251027130303648

image-20251027130330185

进行压测后

image-20251027130449260

这是Prometheus告警系统
image-20251027130618472

更多推荐