【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

news2024/12/15 20:26:59

在这里插入图片描述

Prometheus 是一个开源的监控和报警工具,广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes
中的注解配置 Prometheus 的抓取设置,以高效监控服务,并确保系统的可靠性和可维护性。

一、Prometheus 简介

Prometheus 是一个功能强大的监控系统,具有以下主要特点:

  • 多维数据模型:使用时间序列数据,通过标签(labels)进行组织,支持高效查询。
  • 强大的查询语言:PromQL(Prometheus Query Language)允许用户灵活地查询和分析数据。
  • 简单的配置:通过 YAML 文件进行服务配置,易于管理和扩展。
  • 可视化集成:可以与 Grafana 等工具集成,创建丰富的监控仪表盘和报警系统。

二、Kubernetes 中的监控架构

在 Kubernetes 环境中,Prometheus 通过服务发现功能自动识别和监控运行的应用。监控的基本流程如下:

  1. 服务发现:Prometheus 自动识别集群中的服务和 Pod。
  2. 数据抓取:Prometheus 定期抓取应用暴露的监控数据。
  3. 数据存储:抓取的数据存储在时间序列数据库中,供后续查询。
  4. 查询与可视化:使用 PromQL 查询数据,并通过工具如 Grafana 创建可视化仪表盘。
  5. 报警机制:基于监控数据设置报警规则,及时发现和处理问题。

三、使用注解配置 Prometheus

在 Kubernetes 中,您可以通过在服务或 Pod 的 YAML 文件中添加特定的注解来配置 Prometheus 的抓取行为。以下是关键注解的详细说明:

1. prometheus.io/scrape

annotations:
  prometheus.io/scrape: "true"
  • 功能:此注解指示 Prometheus 应当抓取该服务的监控数据。
  • 默认值false,表示不抓取。
  • 重要性:通过将此值设置为 true,您明确告知 Prometheus 需要监控该服务。

2. prometheus.io/path

annotations:
  prometheus.io/path: "/actuator/prometheus"
  • 功能:指定服务上暴露监控数据的路径。
  • 应用场景:许多框架(如 Spring Boot)提供了专门的端点用于暴露监控数据。在此示例中,/actuator/prometheus 是 Spring Boot 应用中常用的路径。
  • 注意事项
    • 确保该路径在应用中正确配置,并且能够返回有效的监控数据。
    • 该路径通常返回格式化的 metrics 数据,Prometheus 可以直接解析。

3. prometheus.io/port

annotations:
  prometheus.io/port: "8080"
  • 功能:指定 Prometheus 应该用来抓取 metrics 的端口号。
  • 用途:如果应用监听的端口与默认的 HTTP 端口(80)不同,您需要通过此注解明确指定。例如,如果应用在 8080 端口上运行,Prometheus 将使用该端口抓取数据。

四、完整 YAML 示例

以下是一个完整的 Kubernetes Service YAML 文件示例,展示了如何配置上述注解,以便 Prometheus 可以监控该服务:

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/path: "/actuator/prometheus"
    prometheus.io/port: "8080"
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

解释

  • metadata.annotations:包含 Prometheus 的配置注解,指示服务应被监控,并提供数据的路径和端口。
  • spec:定义服务的规格,包括选择器和端口映射。
    • type:这里设置为 ClusterIP,表示该服务只能在集群内部访问。
    • selector:用于选择与该服务关联的 Pod。
    • ports:定义服务的端口映射,将外部访问的 80 端口映射到 Pod 的 8080 端口。

五、配置 Prometheus 进行抓取

在 Prometheus 的配置文件中,确保启用 Kubernetes 服务发现功能。以下是 Prometheus 配置的示例片段:

scrape_configs:
  - job_name: 'kubernetes-services'
    kubernetes_sd_configs:
      - role: endpoints
    relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true

解释

  • job_name:定义抓取任务的名称。
  • kubernetes_sd_configs:配置 Prometheus 进行 Kubernetes 服务发现,抓取指定的服务。
  • relabel_configs:通过正则表达式过滤服务,确保仅抓取带有 prometheus.io/scrape: "true" 注解的服务。

六、监控与可视化

一旦配置完成,Prometheus 将开始抓取指定服务的监控数据。您可以通过 Prometheus 的 Web 界面或 Grafana 创建可视化仪表盘,以便更直观地监控应用性能。

1. 使用 Prometheus Web 界面

  • 访问 Prometheus 的 Web 界面,通常在 http://<prometheus-server-ip>:9090
  • 通过 Targets 页签查看抓取目标,确认服务是否被正确抓取。

2. 使用 Grafana 创建仪表盘

  • 配置 Grafana 连接到 Prometheus 作为数据源。
  • 创建新的仪表盘,使用 PromQL 查询数据,并根据需要添加图表和面板。

七、报警机制

Prometheus 提供强大的报警功能。您可以基于监控数据设置报警规则,及时发现和处理问题。以下是一个报警规则的示例:

groups:
- name: example-alerts
  rules:
  - alert: HighErrorRate
    expr: sum(rate(http_requests_total{status="500"}[5m])) by (service) > 0.05
    for: 5m
    labels:
      severity: page
    annotations:
      summary: "High error rate detected in {{ $labels.service }}"
      description: "Service {{ $labels.service }} is experiencing high error rates."

解释

  • alert:报警的名称。
  • expr:使用 PromQL 定义报警条件,这里监控 HTTP 500 错误率。
  • for:在条件满足的情况下持续多长时间后触发报警。
  • labelsannotations:提供报警的元数据和描述信息。

八、总结

通过在 Kubernetes 中使用 Prometheus 的注解配置,您可以轻松实现对服务的监控。注解 prometheus.io/scrapeprometheus.io/pathprometheus.io/port 使得 Prometheus 能够自动发现和抓取服务的监控数据。这种灵活的配置方式不仅提高了监控的可用性,还简化了整个监控流程。

在生产环境中,监控系统的建立是确保应用高可用性和性能的关键。通过 Prometheus 的强大功能,结合 Kubernetes 的灵活性,您可以构建出一个高效、可靠的监控体系,为您的微服务架构提供有力支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来&#xff0c;随着城市化进程的…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…

KMP 字符串匹配详解

一、KMP 的作用 KMP 用于解决字符串匹配问题&#xff0c;当出现字符串不匹配时&#xff0c;可以知道一部分之前已经匹配的文本内容&#xff0c;可以利用这些信息避免从头再去做匹配了。 二、题目 链接&#xff1a;28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;Lee…

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack &#xff08;1&#xff09;简介 官网地址&#xff1a;https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际…

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用&#xff0c;而不能在服务器组件中使用。Next.js 的新架构&#xff08;App Router&#xff09;中&#xff0c;默认情况下&#xff0c;页面和布局组件是服务器组件&#xff0c;因此不能直接使…

MySQL相关文件

配置文件 — — — — — — /etc/my.cnf datadir/var/lib/mysql //数据目录 socket/var/lib/mysql/mysql.sock //定义套接字文件存储位置&#xff0c;套接字文件&#xff08;IP&#xff1a;port&#xff09;,用于接收客户端连…

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…

3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级

汽车行业已迎来智能化的汹涌浪潮&#xff0c;在此背景下&#xff0c;零部件制造商唯有积极应对&#xff0c;以智能制造为核心驱动力&#xff0c;方能跟上行业发展步调&#xff0c;在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一&#xff0c;汽车钣金件亦需紧…

基于Sharding-jdbc实现水平分库、垂直分库、读写分离

一、实现水平分库 需求说明 水平分库是把同一个表的数据按一定规则拆到不同的数据库中&#xff0c;每个库可以放在不同的服务器上。 接下来咱们继续对快速入门中的例子进行完善。 实现步骤 将原有order_db库拆分为order_db_1、order_db_2 CREATE DATABASE order_db_1 CHAR…

MATLAB中Simulink的信号线

Simulink以模块为最小单位,通过信号线互相连接&#xff0c;用户可通过GUI调配每个模块的参数,且仿真的结果能够以数值和图像等形象化方式具现出来。信号线可以传递一维数据、多维数据、向量数据或矩阵数据,甚至Bus型数据。Simulink使用不同的线形表示传递不同数据类型的信号线,…

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误&#xff1a;HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1&#xff1a;提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…

Flutter 内嵌 unity3d for android

前言&#xff1a; 最近刚整完 unity3d hybridCLR 更新代码和资源&#xff0c;我们 趁热打铁 将 Unity3D 嵌入 Flutter 应用中。实现在 Flutter 使用 Unity3D, 可以做 小游戏 大游戏&#xff1b; 之前都是 内嵌 Webview 来实现的。虽然 CocosCreator 做出来的效果也不错&#xf…

鸿蒙开发:一个轻盈的上拉下拉刷新组件

前言 老早之前开源了一个刷新组件&#xff0c;提供了很多常见的功能&#xff0c;也封装了List&#xff0c;Grid&#xff0c;WaterFlow&#xff0c;虽然功能多&#xff0c;但也冗余比较多&#xff0c;随着时间的前去&#xff0c;暴露的问题就慢慢增多&#xff0c;虽然我也提供了…

Oracle plsqldev1106 安装及TNS配置

Oracle plsqldev1106 安装及TNS配置 下载好安装包&#xff0c;直接双击安装 点击 I Agree 默认是C盘的&#xff0c;我改了D盘&#xff0c;根据自己实际情况修改 这里用默认的for current user 也可以&#xff0c;我选了for all user 点Finish&#xff0c;等待安装完成即可 …

【卷积神经网络】AlexNet实践

构建模型 模版搭建 # 定义一个AlexNet模型类def __init__(self):# 调用父类的构造函数&#xff08;如果继承自nn.Module的话&#xff09;super(AlexNet, self).__init__()# ReLU激活函数self.ReLU nn.ReLU()# 卷积层1&#xff1a;输入1个通道&#xff08;灰度图&#xff09;&a…

Linux驱动开发(13):输入子系统–按键输入实验

计算机的输入设备繁多&#xff0c;有按键、鼠标、键盘、触摸屏、游戏手柄等等&#xff0c;Linux内核为了能够将所有的输入设备进行统一的管理&#xff0c; 设计了输入子系统。为上层应用提供了统一的抽象层&#xff0c;各个输入设备的驱动程序只需上报产生的输入事件即可。 下…

计算机毕设-基于springboot的某学院兼职平台的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Unity3D仿星露谷物语开发3之动画系统初探

1、目标 我们希望使用已有的资源建一个动画demo&#xff0c;以此熟悉基于已有Animator/Animation资源的使用方法。 以Tree的动画系统为例&#xff0c;资源位于&#xff1a; 2、创建流程 &#xff08;1&#xff09;创建tree空对象 上面两个都是空对象。 &#xff08;2&#…

怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev

本文引用怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev 在 vscode 设置项中配置 gopls 的 ui.navigation.importShortcut 为 Definition 即可。 "gopls": {"ui.navigation.importShortcut": "Definition" }ui.navigation.i…