文档 · 2021年7月28日 0

K8s使用prometheus监控pod的jvm内存

 

基础环境:

k8s集群,集群中已经安装prometheus。

第一步:下载监控使用的agent github连接:jmx_exporter

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar

第二步:编辑prometheus-jmx-config.yaml文件

vim jmx-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: prometheus-jmx-config
 namespace: default
data:
 prometheus-jmx-config.yaml: |
    lowercaseOutputLabelNames: true
    lowercaseOutputName: true
    whitelistObjectNames: ["java.lang:type=OperatingSystem"]
    blacklistObjectNames: []
    rules:
      - pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
        name: os_$1_bytes
        labels: {}
        type: GAUGE
        attrNameSnakeCase: true
      - pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
        name: os_$1
        labels: {}
        type: GAUGE
        attrNameSnakeCase: true

第三步:在启动的java程序中配置agent,通常配置在JAVA_OPTS中,因为java在启动时会读取JAVA_OPTS中的配置。

在环境变量中添加如下内容
JAVA_OPTS="-javaagent:/data/jmx_exporter/jmx_prometheus_javaagent-0.16.1.jar=12345:/jmx/jmx-config.yaml"

启动方式: java ${JAVA_OPTS} -jar app.jar

官方给出的例子是:
java -javaagent:./jmx_prometheus_javaagent-0.16.1.jar=8080:config.yaml -jar yourJar.jar

因为我们是在pod中可选的方法有很多:

第一种方法:
   直接在制作dockerImage时将jmx_prometheus_javaagent-0.16.1.jar和jmx-config.yaml 打包进去,在启动java项目时直接引用即可。

第二种方法(本文主要介绍):
   使用configmap挂载jmx-config.yaml配置文件,将jmx_prometheus_javaagent-0.16.1.jar放在存储中挂载到容器内使用。

第四步:在prometheus配置文件中增加监控job

注意:如果正在使用新版的kube-prometheus那么他的资源对象都是由CRDs定义和控制的,建议自己定义个ServiceMonitor暴露给prometheus-Operator实现自动发现和监控功能。

参考:自定义ServiceMonitor监控jvm

vim prometheus-configmap.yaml

......

    - job_name: jvm
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_jvm]
        action: keep
        regex: true
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        regex: (.+)
        target_label: application
        replacement: $1
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)

第五步:修改services 标签:

1.直接修改yaml文件: kubectl edit svc 你的service名字 
例:kubectl edit svc app
apiVersion: v1
kind: Service
metadata:
  annotations:                         #这是新增的annotate
    prometheus.io/jvm: "true"          #这是新增的lable
    prometheus.io/port: "12345"        #这是新增的lable
  labels:
    app: app
    name: app
  name: app
  namespace: default
spec:
  clusterIP: 10.247.4.104
  externalTrafficPolicy: Cluster
  ports:
  - name: cce-service-0
    nodePort: 30000
    port: 30000
    protocol: TCP
    targetPort: 30000
  selector:
    app: app
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

2.直接命令行修改:

kubectl annotate svc 你的service名字 prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite

例:
kubectl annotate svc app prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite

第六步:检查prometheus 监控Targets (指标)是否存在job名为jvm的Targets

第七步:grafana添加模板

模板ID:8563

打赏