博客 / 詳情

返回

在 Kubernetes 裏部署 JMX Exporter 監控 Java 應用

本文會通過一個 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.0

ENV APP_NAME=jmx-java-app
ENV JMX_PORT=5556

WORKDIR /app

COPY /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-config
  namespace: monitoring
data:
  config.yaml: |-
    lowercaseOutputName: true
    lowercaseOutputLabelNames: true
    whitelistObjectNames: ["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-app
  namespace: monitoring
spec:
  replicas: 2
  selector:
    matchLabels:
      app: jmx-java-app
  template:
    metadata:
      labels:
        app: jmx-java-app
    spec:
      containers:
        - name: jmx-java-app-container
          image: techiescamp/jmx-pet-clinic-app:latest
          ports:
            - containerPort: 8080
            - containerPort: 5556
          volumeMounts:
            - name: jmx-exporter-config-volume
              mountPath: /app/config.yaml
              subPath: config.yaml
      volumes:
        - name: jmx-exporter-config-volume
          configMap:
            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-nodeport
  namespace: monitoring
spec:
  selector:
    app: jmx-java-app
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 30750  
  - name: jmx
    protocol: TCP
    port: 5556
    targetPort: 5556
    nodePort: 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: pod
    namespaces:
      names:
        - monitoring
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_label_app]
    action: keep
    regex: '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: keep
  regex: '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 的創始團隊。如果您想要採購監控/可觀測性相關的產品方案,歡迎 聯繫我們做產品技術交流。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.