《Kubernetes监控篇:Kubernetes集群之微服务JVM内存监控》



一、背景信息

复杂和高并发下的服务,必须保证每次gc不会出现性能下降,各种性能指标不会出现波动,gc回收规律而且干净,所以必须找到合适的jvm设置。而要找到合适的jvm设置,必须要了解当前java服务的jvm使用情况。所以我觉得非常有必要对java服务的jvm使用情况实时监控。

业务系统涉及到的java服务分为:tomcat类型、jar包类型、k8s微服务类型。


二、监控方案

方案一:业务系统java服务采用的是SpringBoot框架,SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息、健康检查、审计、统计和HTTP追踪等。Actuator同时还可以与外部应用监控系统整合,比如Prometheus,可以选择使用HTTP端点或JMX来管理和监视应用程序。

方案二:通过JMX Exporter来暴露 Java 应用的JVM监控指标,JMX Exporter有两种用法。

# 方法一:启动独立进程
JVM启动时指定参数,暴露JMX的RMI接口,JMX-Exporter调用RMI获取JVM运行时状态数据,
转换为Prometheus metrics格式,并暴露端口让Prometheus采集。

# 方法二:JVM进程内启动(in-process)
JVM启动时指定参数,通过javaagent 的形式运行JMX-Exporter 的jar包,
进程内读取JVM运行时状态数据,转换为Prometheus metrics格式,并暴露端口让Prometheus采集。

说明:官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程,而这个进程本身的监控又成了新的问题,所以本文重点围绕第二种用法讲如何在K8S 环境下使用JMX Exporter暴露JVM监控指标。


三、部署架构

1、监控系统架构图
在这里插入图片描述
2、监控系统说明
由于kubernetes集群中有多个业务系统,分别部署在不同的namespace空间,针对不同的监控类型数据,如主机资源监控数据、容器监控数据、应用程序监控数据,分别采用不同的prometheus来采集数据。


四、部署操作

4.1、资源下载

jmx_prometheus_javaagent-0.16.1.jar和prometheus-jmx-config.yaml
在这里插入图片描述


4.2、修改Dockerfile

# 修改前
FROM java:8u111-jdk
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' >/etc/timezone
ADD mpmt-cp-adapter.jar adapter.jar
EXPOSE 8083
ENTRYPOINT ["java","-Xmx2048m","-Xms512m","-XX:MaxMetaspaceSize=512m","-XX:MetaspaceSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/adapter.jar","--spring.profiles.active=test"]

# 修改后
FROM java:8u111-jdk
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' >/etc/timezone
ADD mpmt-cp-adapter.jar adapter.jar
ADD prometheus-jmx-config.yaml /prometheus-jmx-config.yaml
ADD jmx_prometheus_javaagent-0.16.1.jar /jmx_prometheus_javaagent-0.16.1.jar
EXPOSE 8083
EXPOSE 7070
ENTRYPOINT ["java","-javaagent:/jmx_prometheus_javaagent-0.16.1.jar=7070:prometheus-jmx-config.yaml","-Xmx2048m","-Xms512m","-XX:MaxMetaspaceSize=512m","-XX:MetaspaceSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/adapter.jar","--spring.profiles.active=test"]

4.3、修改yaml文件

# 修改前
---
apiVersion: v1
kind: Service
metadata:
  name: mpmt-adapter-svc
  labels:
    app: mpmt-adapter
spec:
  type: NodePort
  ports:
  - port: 8083
    targetPort: 8083
    protocol: TCP
    nodePort: 31087
  selector:
    app: mpmt-adapter
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mpmt-adapter

spec:
  serviceName: "mpmt-adapter"
  podManagementPolicy: Parallel    
  replicas: 1
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: mpmt-adapter
  template:
    metadata:
      labels:
        app: mpmt-adapter
    spec:
      containers:
      - name: mpmt-adapter
        image: server.harbor.com:8888/library/mpmt-adapter:202107191029
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8083
        resources:
          requests:
            cpu: "500m"
            memory: "4Gi"
          limits:
            cpu: "1000m"
            memory: "6Gi"

# 修改后
---
apiVersion: v1
kind: Service
metadata:
  name: mpmt-adapter-svc
  labels:
    app: mpmt-adapter 
    system: pasz #增加内容
    owner: sdjw #增加内容
    env: test #增加内容
spec:
  type: NodePort
  ports:
  - port: 8083
    targetPort: 8083
    protocol: TCP
    nodePort: 31087
  selector:
    app: mpmt-adapter
    system: pasz #增加内容
    owner: sdjw #增加内容
    env: test #增加内容
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mpmt-adapter
spec:
  serviceName: "mpmt-adapter"
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: mpmt-adapter
      system: pasz #增加内容
      owner: sdjw #增加内容
      env: test #增加内容
  template:
    metadata:
      labels:
        app: mpmt-adapter
        system: pasz #增加内容
        owner: sdjw #增加内容
        env: test  #增加内容       
    spec:
      containers:
      - name: mpmt-adapter
        image: server.harbor.com:8888/library/mpmt-adapter:202107191029
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 8083
            name: jdk #增加内容
          - containerPort: 7070
            name: jvm #增加内容
        resources:
          requests:
            cpu: "500m"
            memory: "4Gi"
          limits:
            cpu: "1000m"
            memory: "6Gi"

问题一:为什么需要添加lables标签?
1、在不同的namespace空间下,部署着不同的业务系统,同时将不同业务系统的监控数据通过grafana展示,那如果对服务进行细化区分会不会更好呢?比如说同样的monitor服务,不同namespace空间下都有,如果加上多种标签,系统名称、系统属主、系统环境等等,这样在告警时,是不是就能更好的知道当前什么系统、是哪家客户的,是生产环境还是测试环境以及什么服务出现了问题呢,这样就可以快速响应并处理问题。

效果如下图所示:
在这里插入图片描述
2、添加lables标签还有一个目的就是实现告警分组,试想一下如果k8s集群中有多种业务系统,如A、B系统,A系统的告警信息发送到A系统告警钉钉群,B系统的告警信息发送到B系统告警钉钉群,这样A系统告警钉钉群成员就可以收到负责业务的告警信息,B系统告警钉钉群就不会收到。在企业中,告警分组也是常见的需求。

以下是alertmanager的配置文件,效果如下图所示:
在这里插入图片描述
问题二:为什么需要对容器端口增加name标签?
2、对pod中多个容器端口进行name设置,如果上面jdk和name,jdk表示微服务容器业务端口名称,jvm是jvm进程监控端口名称,这里所有业务系统中所有的服务的jvm进程监控端口都未7070,并且name值均为jvm。设置不同的name名称是为了在prometheus.yaml文件中精准匹配jvm进程端口。


4.4、部署prometheus

4.4.1、配置yaml文件

# 在master节点
mkdir -p /data/pkgs/jvm_exporter
vim prometheus.yaml
CSDN下载地址:https://download.csdn.net/download/m0_37814112/20480830

4.4.2、配置文件详解

问题一:如何重写变量名称?
在这里插入图片描述
说明:__meta_kubernetes_pod_host_ip、__meta_kubernetes_pod_container_port_name、__meta_kubernetes_namespace、__meta_kubernetes_pod_name、__meta_kubernetes_pod_node_name、__meta_kubernetes_pod_phase、__meta_kubernetes_pod_ready、__meta_kubernetes_pod_label_system、__meta_kubernetes_pod_label_owner、__meta_kubernetes_pod_label_env等这些变量是kubernetes自带的原生标签名称。通过action: replace,可替换__meta_kubernetes_namespace变成kubernetes_namespace,其它依次类推。

原生标签,如下图所示:
在这里插入图片描述
重新替换标签后,效果如下图所示:
在这里插入图片描述
问题二:如何新增标签?
说明:__meta_kubernetes_pod_label_app、__meta_kubernetes_pod_label_system、__meta_kubernetes_pod_label_owner、__meta_kubernetes_pod_label_env等这些标签不是kubernetes自带的原生标签,而是在微服务yaml文件里定义的,通过kubernetes转换成的。
在这里插入图片描述


4.4.3、部署prometheus服务

# 1、根据yaml文件定义的prometheus服务部署在k8s-worker-112节点上,在该节点上创建数据存储目录
[root@k8s-worker-112 ~]# mkdir -pv /data/basic-data/prometheus

# 2、在k8s-master-111节点上执行
# 把default账号通过clusterrolebing绑定到clusterrole上
kubectl create clusterrolebinding nfs-clusterrolebinding -n default --clusterrole=cluster-admin  --user=system:serviceaccount:default:default
# 注意:nfs-clusterrolebinding可自定义设置

# 3、在k8s-master-111节点上执行
[root@k8s-master-111 ~]# cd /data/pkgs/jvm_exporter
[root@k8s-master-111 ~]# kubectl create -f prometheus.yaml

# 4、查看pod状态(如下图所示)
[root@k8s-master-111 ~]# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
prometheus-server-54dd9f5568-wc44l   1/1     Running   0          8

4.4.3、检查prometheus服务

1、检查rules规则是否生效,如下图所示:
在这里插入图片描述
2、检查目标target是否为up,如下图所示:
在这里插入图片描述


4.5、部署alertmanager服务

《八、企业级监控系统之实现多节点Altermanager告警分组》


4.6、grafana部署配置

说明:这里默认grafana是已经安装了的,如果需要安装请参考《一、企业级监控之使用docker容器化部署grafana》

4.6.1、grafana模板下载

JVM监控模板

4.6.2、grafana导入数据源

说明:这里就不介绍了。

4.6.3、grafana模板导入

说明:这里就不介绍了。

4.7、grafana效果展示

效果如下图所示:
在这里插入图片描述
在这里插入图片描述

4.8、钉钉告警信息展示

效果如下图所示:
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 可以使用Zabbix的Java Gateway来监控Spring微服务JVM。首先需要在Zabbix Server上安装Java Gateway,并在Zabbix Web界面上配置Java Gateway的主机和端口。然后在Spring微服务JVM参数中添加JMX监控参数,并在Zabbix Web界面上添加JMX监控项和触发器来监控JVM的性能指标。具体的配置方法可以参考Zabbix官方文档或者相关的技术博客。 ### 回答2: Zabbix是一款流行的开源监控工具,可以用于监控各种服务器和应用程序。如果我们想要监控Spring微服务JVM,可以通过以下步骤来实现。 首先,我们需要在Zabbix服务器上安装并配置Zabbix Agent。Zabbix Agent是一个在被监控主机上运行的软件,可以收集各种指标并将其发送到Zabbix服务器。 接下来,我们需要在Spring微服务的服务器上安装并配置Zabbix Agent。这样,Zabbix Agent将能够连接到Zabbix服务器,并传输JVM的指标数据。 然后,我们需要在Zabbix服务器上创建一个新的主机,用于监控Spring微服务JVM。我们需要指定主机的IP地址和其他相关信息,并将其与之前安装的Zabbix Agent关联起来。 一旦主机创建完毕,我们可以开始配置监控项。监控项定义了我们希望收集的特定指标,如内存使用情况、垃圾回收时间等。对于JVM监控,常见的监控项包括堆内存使用率、线程数、垃圾回收时间等。 配置完监控项后,我们还可以创建触发器和动作。触发器用于定义何时触发警报,而动作则定义了在触发警报时采取的操作,如发送电子邮件或短信通知。 最后,我们可以将监控结果以图表或图形的形式展示在Zabbix的仪表板上。这样,我们就可以实时监控Spring微服务JVM性能,并及时进行故障排除和性能优化。 总而言之,通过安装并配置Zabbix Agent,创建主机、监控项、触发器和动作,并展示监控结果,我们可以使用Zabbix来监控Spring微服务JVM。这样,我们可以及时发现和解决潜在的性能问题,提高应用程序的可靠性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值