如何在 Kubernetes 里部署 JMX Exporter

news/2024/11/15 10:34:30/文章来源:https://www.cnblogs.com/ulricqin/p/18334561

本文会通过一个 Java 应用,演示 Prometheus JMX Exporter 在 Kubernetes 里的部署和配置方式。为了更好地理解 JMX Exporter,我们将使用 Spring Boot Java 应用程序并将所有 JMX 指标导出给 Prometheus。在本指南结束时,您将学习:

  • 使用 Java 应用镜像启动 JMX Exporter
  • 将 JMX 指标导出给 Prometheus
  • 使用 Prometheus SD 配置抓取应用程序的 JMX 指标
  • 从 Prometheus 仪表板验证和查询 JMX 指标

先决条件

  • 具有部署权限的 Kubernetes 集群
  • 在 Kubernetes 上运行的 Prometheus

JMX Exporter

首先,让我们了解一下 JMX Exporter 是如何工作的。下图显示了在 Kubernetes 上部署 JMX Exporter 时的工作流。

jmx-on-kubernetes-1

MBean(Managed Bean)Server 位于 Java 应用程序的 Java 虚拟机 (JVM) 中,充当与应用程序的运行状况和性能相关的数据存储库。MBean 组件公开应用程序指标,例如状态、动作和操作信息。

javaagent 可以访问 Mbean Server 并获取运行状况和性能数据。Prometheus JMX Exporter 也是一个 javaagent,它能够访问 MBean Server 的数据并将该数据转换为 Prometheus 指标格式。然后,Prometheus 从 JMX Exporter 的默认指标路径(即 /metrics)中抓取指标。

在 Kubernetes 中部署 JMX Exporter

步骤 1:使用 JMX agent 构建应用程序 Docker 镜像

JMX Exporter 的 javaagent 要和应用程序一起运行(Java 程序通过 java -javaagent 参数指定 JMX Exporter 的 jar 包路径)。您可以从此处下载 JMX exporter agent jar 文件 -> JMX Exporter Download。构建 Java 程序镜像时,将 JMX Exporter jar 文件一并添加到镜像中。

FROM techiescamp/jre-17:1.0.0ENV APP_NAME=jmx-java-app
ENV JMX_PORT=5556WORKDIR /appCOPY /java-agent/*.jar /app/jmx-agent.jar
COPY /java-app/*.jar /app/java.jar
COPY config.yaml /app/CMD java -javaagent:jmx-agent.jar=${JMX_PORT}:config.yaml -jar java.jar

我已经构建了 docker 镜像并将其推送到 Dockerhub。如果您正在学习测试 JMX,则可以直接使用下面的镜像。

techiescamp/jmx-pet-clinic-app:latest

步骤 2:为 JMX Exporter 创建 ConfigMap

我们需要为 JMX 配置创建一个名为 jmx-exporter-configmap.yaml 的 ConfigMap 对象。在此文件中,我们将提供信息以从 MBean Server 中过滤所需的指标。此配置避免了不必要的指标收集,将其限制为仅我们需要的指标。

创建 jmx-exporter-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: jmx-exporter-confignamespace: monitoring
data:config.yaml: |-lowercaseOutputName: truelowercaseOutputLabelNames: truewhitelistObjectNames: ["java.lang:type=Memory", "java.lang:type=GarbageCollector,*"]

在这里,您可以看到我已经提到命名空间值是 monitoring,这是因为我的所有监控组件都位于该特定命名空间中。如果要使用相同的配置,请在开始配置之前创建具有相同名称的命名空间。

在数据部分,我们可以定义 JMX Exporter 必须从 MBean Server 收集的指标类型。在此配置中,我给出了一个小示例来过滤应用程序的内存相关指标。要了解有关配置的更多信息,请访问官方文档。

要在 Kubernetes 中部署此配置,请使用以下命令。

kubectl apply -f jmx-exporter-configmap.yaml

查看 monitoring 命名空间中的 ConfigMap。

kubectl get configmaps -n monitoring

步骤 3:为应用程序创建部署清单

创建部署 YAML 文件 app-deployment.yaml。

apiVersion: apps/v1
kind: Deployment
metadata:name: jmx-java-appnamespace: monitoring
spec:replicas: 2selector:matchLabels:app: jmx-java-apptemplate:metadata:labels:app: jmx-java-appspec:containers:- name: jmx-java-app-containerimage: techiescamp/jmx-pet-clinic-app:latestports:- containerPort: 8080- containerPort: 5556volumeMounts:- name: jmx-exporter-config-volumemountPath: /app/config.yamlsubPath: config.yamlvolumes:- name: jmx-exporter-config-volumeconfigMap:name: jmx-exporter-config

在这里,您可以看到我在容器外部公开端口 8080 和 5556。这里很重要的一点是 volumeMounts 部分。mountPath 使用 configmap 作为卷。它覆盖容器默认的 /app/config.yaml。现在我们 apply 一下:

kubectl apply -f app-deployment.yaml

查看 monitoring 命名空间中的 Deployment。

kubectl get deployments -n monitoring

查看 monitoring 命名空间中的 Pod。

kubectl get pods -n monitoring -o wide

出于测试目的,我提供了两个副本,因此我们可以看到两个 Java 应用程序 Pod 在 monitoring namespace 中运行。

步骤 4:为应用程序创建服务

为应用程序创建服务清单:app-service.yaml

apiVersion: v1
kind: Service
metadata:name: jmx-java-app-nodeportnamespace: monitoring
spec:selector:app: jmx-java-appports:- name: httpprotocol: TCPport: 8080targetPort: 8080nodePort: 30750  - name: jmxprotocol: TCPport: 5556targetPort: 5556nodePort: 30850  type: NodePort

我想通过网络访问应用程序和指标,因此我使用 spec.type: NodePort,并定义 nodePort 端口号,例如应用程序的 30750 和指标的 30850。

下面 apply 一下:

kubectl apply -f app-service.yaml

在 monitoring namespace 中查看服务列表。

kubectl get svc -n monitoring

现在,让我们尝试通过网络访问应用程序和指标,为此,您需要任意一个 Node 的 IP 和端口号。

应用程序的输出:

SpringBoot Java Application using JMX Exporter jar

指标的输出:

SpringBoot Java Application Expose Metrics

步骤 5:在 Prometheus 中添加 Scrape 配置

注意:此配置必须在 Prometheus Server 上完成。

JMX Exporter 已成功公开 Java 应用程序的度量指标。现在我们在 Prometheus 服务器配置文件中添加一个作业来抓取这些指标,然后只有我们可以将它们存储在 TSDB 中或进行查询。

找到 Prometheus ConfigMap,在我的设置中,文件名是 config-map.yaml。使用文本编辑器打开它。

vim config-map.yaml

如果想查看 monitoring 命名空间中的 ConfigMap,请使用以下命令:kubectl get configmaps -n monitoring

在 Prometheus 的配置文件的 scrape_configs 部分添加以下配置。

scrape_configs:
- job_name: 'jmx-java-app'kubernetes_sd_configs:- role: podnamespaces:names:- monitoringrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]action: keepregex: 'jmx-java-app'- source_labels: [__meta_kubernetes_namespace]target_label: namespace- source_labels: [__meta_kubernetes_pod_name]target_label: pod_name- target_label: __address__replacement: "jmx-java-app-nodeport:5556"

在此 Promtheus 配置中,我使用的是 kubernetes_sd_configs 服务发现方法,该方法使用 jmx-java-app 标签自动识别属于 jmx-java-app 部署的 pod。即 relabel 的 keep 部分起到了这个过滤效果:

- source_labels: [__meta_kubernetes_pod_label_app]action: keepregex: 'jmx-java-app'

下面我们 apply 一下:

kubectl apply -f config-map.yaml

在 Prometheus 仪表板中复制更改可能需要几分钟时间。如果看不到更改,请使用以下命令执行部署。将 prometheus-deployment 更改为实际的 Prometheus Deployment 名称。

kubectl rollout restart deployment prometheus-deployment -n monitoring

步骤 6:从 Prometheus Dashboard 验证 JMX 指标

您可以从 Prometheus 仪表板验证 JMX 目标。在“目标”菜单下,我们可以看到 endpoint 详细信息、状态和其他信息,如下所示。

JMX: Prometheus targets

在 Graph 部分,我们可以进行查询并获得结果。例如,以下仪表板显示了应用中 jvm_memory_bytes_used 指标。

JMX: Prometheus Graph

步骤 7:Grafana 仪表板

我们可以根据自己的要求在 Grafana 仪表板中可视化 JMX 指标。如果您已设置 Grafana 并将 Prometheus 添加为数据源,则可以使用 JMX 指标模板 创建仪表板。您可以在 Grafana 博客上查看可视化 Promtheus 指标以了解更多信息。

JMX Exporter Dashboard

总结

在这篇博客中,我们介绍了在 Kubernetes 集群上实现 JMX Exporter 的步骤。此外,在导出器 Configmap 中,您可以为 JMX Exporter 添加其他过滤器设置,以收集其他指标。

原文:https://devopscube.com/jenkins-architecture-explained/
译文:https://flashcat.cloud/blog/jenkins-architecture-explained/
译者:巴辉特

本博客出自快猫星云的小伙伴们,快猫星云是一家专注在监控/可观测性领域的初创公司,其团队是开源项目 Open-Falcon、Nightingale 的创始团队。如果您想要采购监控/可观测性相关的产品方案,欢迎 联系我们做产品技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 双向绑定 dialog

父组件:<ViewPopupForm v-model="isView"/> 子组件: const emit = defineEmits([update:modelValue])const props = defineProps({isView: Boolean,//接收父组件ParentComponent传过来的数组 });

服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】

服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】 服务注册中心+配置中心-NacosNacos 有两大功能: 注册中心[替代Eureka]+配置中心[替代Config] 架构理论基础: CAP 理论(支持AP【高可用、分区容错性】 和CP【分区容错性和数据一致性】, 可以切换)Nacos 结构…

Oracle数据库自动备份

1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% set CURTIME=%time:~0,2% if "%CURTIME%"==" 0" set CURTIME=00 if "%CURTIME%"==" 1" set CURTIME=01 if "%CURT…

老式移动和联通标准SIM卡在2024的今天

前言 在我手里的,是一张普通联通和一张移动M-ZONE标准SIM卡桌上散落的SIM卡碎片已经说明了一切——— 我要把这些00后的SIM卡装入2024年的手机(图中为大卡的测试机,没那么有风险)联通 输入123456,直接被锁,提示要用puk码解锁我后来再搜索puk码的时候才知道默认pin码是123…

我的编程经历,从天桥地摊Basic到西藏阿里的.Net AOT。(一,从井到Sharp)

撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联。依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球最高山脉。 从前我在博客园不叫这个名字,今天很多自己的早…

计算机网络基础第五讲 传输层

计算机网络基础第五讲 传输层 第一节:传输层概述 1. 运输层概述2. 运输层功能两种不同协议:TCP:面向连接,全双工可靠信道;仅支持单播;复杂 UDP:无连接不可靠;支持单播,多播,广播;应用层来负责可靠;简单 第二节:端口号 1. 运输层的端口 进程标识符来标记进程; 不应…

计算机网络基础第六讲 应用层

计算机网络基础第六讲 应用层 第一节:应用层概述第二节:DNS 1. 域名系统DNS实现域名到IP的映射2. 域名服务器3. 域名的解析过程迭代+递归解析递归解析4. 提高可靠性和速度的方法第三节:FTP 1.FTP概述2. FTP工作模式3. FTP两个连接控制连接必须先于数据连接建立 数据连接必须…

TCP状态转移图说明及使用tcpdump进行观测

一、TCP状态转移图说明图1.TCP状态转移图这张图展示了 TCP(Transmission Control Protocol,传输控制协议)的状态转移图,描述了 TCP 连接在不同阶段之间的状态变化和相互转换。 (一)、建立连接(三次握手)图2.TCP三次握手示意图1、服务器准备好接受外来连接,通常通过soc…

git学习笔记1

记录学习过程: git是如何运行工作的,先把文件从工作区传输到暂存区,之后再从暂存区传输到本地仓库git仓库的初始化,在需要的文件夹中右键鼠标"Open Git Bash Here",然后输入git init:git把文件先存放到暂存区之后git才能把文件存放到本地仓库可以查看当前git文件的…

彻底卸载Python

前言通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装。所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Python软件卸载方法1:首先,在安装python时,下载了一个可执行文件,也就是Python的安装包,我们双击它,点击uni…

java覆盖率检测-jacoco

一、Jacoco 简介 官网地址:https://www.jacoco.org/jacoco/trunk/index.html一、Jenkins集成jacoco 1、安装JaCoCo插件 jenkins->系统管理->管理插件在可用插件搜索Jacoco,搜索到安装即可 2、在job中增加“构建后操作”,选择Record JaCoCo coverage report 3、修改Ja…