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! 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM