OpenShift下的JVM监控
去年写过一篇基于jmx监控的文章,这次在Openshift上实现,发现确实不少变化。主要重点问题在
1. prometheus jmx exporter的改进,不再需要运行一个独立的进程,不需要把数据输入到influxdb,
而是直接提供了prometheus数据。链接在
https://github.com/prometheus/jmx_exporter
2. OpenShift上采用prometheus Operator架构,内置了集群的监控指标,在此基础上如何集成客户化的监控数据。
接下来我们就看看具体的实现过程。
1. 针对应用镜像的修改
下载agent的jmx_prometheus_javaagent-0.12.0.jar
包,具体链接在
https://github.com/prometheus/jmx_exporter
以tomcat为例,构建一个镜像
[root@master jmx]# ls catalina.sh config.yaml Dockerfile jmx_prometheus_javaagent-0.12.0.jar
Dockerfile
[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!