OpenShift下的JVM监控

去年写过一篇基于jmx监控的文章,此次在Openshift上实现,发现确实很多变化。主要重点问题在java

1. prometheus jmx exporter的改进,再也不须要运行一个独立的进程,不须要把数据输入到influxdb,node

而是直接提供了prometheus数据。连接在 git

https://github.com/prometheus/jmx_exportergithub

2. OpenShift上采用prometheus Operator架构,内置了集群的监控指标,在此基础上如何集成客户化的监控数据。docker

 

接下来咱们就看看具体的实现过程。api

1. 针对应用镜像的修改

下载agent的jmx_prometheus_javaagent-0.12.0.jar包,具体连接在tomcat

https://github.com/prometheus/jmx_exporter架构

以tomcat为例,构建一个镜像app

[root@master jmx]# ls
catalina.sh  config.yaml  Dockerfile  jmx_prometheus_javaagent-0.12.0.jar

Dockerfilejvm

[root@master jmx]# cat Dockerfile 
FROM registry.example.com/tomcat:8-slim 

COPY *.* /usr/local/tomcat/bin/

CMD ["catalina.sh", "run"]

catalina.sh 是从镜像中拷贝出来的,修改了以下地方

CLASSPATH=/usr/local/tomcat/bin

JAVA_OPTS="-javaagent:/usr/local/tomcat/bin/jmx_prometheus_javaagent-0.12.0.jar=8180:/usr/local/tomcat/bin/config.yaml $JAVA_OPTS $JSSE_OPTS"

由于缺省的8080和tomcat启动端口冲突,因此修改成8180

config.yaml, 最简单的配置,什么信息都获取

---   
lowercaseOutputLabelNames: true
lowercaseOutputName: true

 

而后构建部署

docker build -t registry.example.com/tomcatjmx:8-slim .

docker push registry.example.com/tomcatjmx:8-slim

oc import-image tomcatjmx:8-slim --from=registry.example.com/tomcatjmx:8-slim --confirm --insecure=true

完成后在myproject的image下看到有个tomcatjmx:8-slim

 

 

在service下开放8180端口,修改yaml文件,加入8180端口

    - name: 8180-tcp
      port: 8180
      protocol: TCP
      targetPort: 8180

而后应用镜像工做基本完成。

 

2.prometheus 添加target

OpenShift的 prometheus采用Operator进行部署,基于servicemonitor的模式对服务进行监控。

 

 在OpenShift环境中内置了servicemonitor

[root@master jmx]# oc -n openshift-monitoring get servicemonitor
NAME                          AGE
alertmanager                  175d
cluster-monitoring-operator   175d
etcd                          6d
kube-apiserver                175d
kube-controllers              175d
kube-state-metrics            175d
kubelet                       175d
node-exporter                 175d
prometheus                    175d
prometheus-operator           175d

service monitor经过namespace肯定工做范围,同时基于Label对服务(Service)进行监控

 

 

咱们若是须要对本身的服务进行监控,就须要创建一个客户化的Service monitor

[root@master ~]# cat myservicemonitor.yaml 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: tomcatmonitor 
  labels:
    k8s-app: tomcatmonitor
  namespace: openshift-monitoring
spec:
  namespaceSelector:
    any: true
  selector:
    matchLabels:
      app: tomcatjmx
  endpoints:
    - interval: 30s
      path: /metrics
      port: 8180-tcp

比较核心的地方是selector, 决定对哪一个服务进行监控,另外就是endpoint,针对哪一个port获取指标。

建立后能够经过下面命令看到

[root@master ~]# oc -n openshift-monitoring get servicemonitor
NAME                          AGE
alertmanager                  175d
cluster-monitoring-operator   175d
etcd                          6d
kube-apiserver                175d
kube-controllers              175d
kube-state-metrics            175d
kubelet                       175d
node-exporter                 175d
prometheus                    175d
prometheus-operator           175d
tomcatmonitor                 1h

但这时候在prometheus的target上是看不到咱们tomcatmonitor的,由于缺乏了受权工做,添加RBAC的受权

oc adm policy add-cluster-role-to-user view system:serviceaccount:openshift-monitoring:prometheus-k8s

oc adm policy add-role-to-user view system:serviceaccount:openshift-monitoring:prometheus-k8s -n myproject

完成后,在prometheus target界面上看到tomcatjmx服务已经启动

 

 转去指标界面看到一系列指标

 

 

3. 集成grafana

这部分工做比较耗时,主要是要找到合适的图标导入,

我在

https://grafana.com/grafana/dashboards?search=jmx

上找了好几个,最后发现 https://grafana.com/grafana/dashboards/8878

比较合适。导入后展示结果,好处是能够直接选择project,service,而后选择相应的pod

 

 

 

 heap和non-heap的指标

 

GC time

 

 改进:

可让servicemonitor监听全部打了jmx: jvm标签的服务。这样只要在服务上加上标签,就能够被监控。

 

至此工做完成. Enjoy! 

相关文章
相关标签/搜索