kubernetes里prometheus-operator 监控jvm

在配置prometheus-operator 监控jvm之前,我们必须要了解prometheus-operator的4个crd不然后续会蒙蔽。

这四个CRD作用如下

  • Prometheus: 由 Operator 依据一个自定义资源kind: Prometheus类型中,所描述的内容而部署的 Prometheus Server 集群,可以将这个自定义资源看作是一种特别用来管理Prometheus Server的StatefulSets资源。
  • ServiceMonitor: 一个Kubernetes自定义资源(和kind: Prometheus一样是CRD),该资源描述了Prometheus Server的Target列表,Operator 会监听这个资源的变化来动态的更新Prometheus Server的Scrape targets并让prometheus server去reload配置(prometheus有对应reload的http接口/-/reload)。而该资源主要通过Selector来依据 Labels 选取对应的Service的endpoints,并让 Prometheus Server 通过 Service 进行拉取(拉)指标资料(也就是metrics信息),metrics信息要在http的url输出符合metrics格式的信息,ServiceMonitor也可以定义目标的metrics的url.
  • Alertmanager:Prometheus Operator 不只是提供 Prometheus Server 管理与部署,也包含了 AlertManager,并且一样通过一个 kind: Alertmanager 自定义资源来描述信息,再由 Operator 依据描述内容部署 Alertmanager 集群。
  • PrometheusRule:对于Prometheus而言,在原生的管理方式上,我们需要手动创建Prometheus的告警文件,并且通过在Prometheus配置中声明式的加载。而在Prometheus Operator模式中,告警规则也编程一个通过Kubernetes API 声明式创建的一个资源.告警规则创建成功后,通过在Prometheus中使用想servicemonitor那样用ruleSelector通过label匹配选择需要关联的PrometheusRule即可

监控后端jvm内存,我们需要下载jmx_prometheus_javaagent-0.11.0.jar

下载地址:

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

config.yaml下载例子:

https://github.com/prometheus/jmx_exporter/tree/master/example_configs

下载之后重命名为config.yaml

之后将以上两个文件封装在dockerfile里

并在docker启动参数环境变量里加入JAVA_OPTS="$JAVA_OPTS -Duser.timezone=GMT+08 -javaagent:$PWD/jmx_prometheus_javaagent-0.2.0.jar=1234:$PWD/config.yaml -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"

之后通过k8s启动之后通过curl http://127.0.0.1:1234/metrics 去访问是否已经成功

 因为svc的负载均衡,所以在K8S里监控metrics基本最小单位都是一个svc背后的pod为target,所以prometheus-operator创建了对应的CRD: kind: ServiceMonitor ,创建的ServiceMonitor里声明需要监控选中的svc的label以及metrics的url路径的和namespaces即可

在需要获取jvm的应用的svc里配置相应的端口 也就是以上的1234端口 后续ServiceMonitor 会根据name的值对应相应的target

之后创建ServiceMonitor :

因ServiceMonitor 与监控的服务不再同一个namespace 所以需要加namespaceSelector

默认情况下ServiceMonitor和监控对象必须是在相同Namespace下的,如果要关联非同ns下需要下面这样设置值

spec:

namespaceSelector:

matchNames:

- target_ns_name

如果希望ServiceMonitor可以关联任意命名空间下的标签,则通过以下方式定义:

spec:

namespaceSelector:

any: true

创建完成之后 这里有一个坑:如果监控的服务不在同一个namespace 那么会出现无权限获取的问题:

User \"system:serviceaccount:monitoring:prometheus-k8s\" cannot list pods in the namespace \"pre\""

这里我们根据提示创建rbac认证

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
  namespace: monitoring

之后我们可以通过prometheus的ui界面查看到对应的target

总的来说就是创建自己的监控数据需要ServiceMonitor,通过ServiceMonitor去对应的label里找对应svc下的metrics的port。并且不同的namespace下的监控需要设置好rbac权限(在k8s集群中有配置rbac的集群里)

下载grafana的模版

https://grafana.com/dashboards/8878/revisions

导入到grafana的服务里最后查看对应的ui

发布了49 篇原创文章 · 获赞 39 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_22543991/article/details/88405322