文档 · 2024年2月20日 0

自定义ServiceMonitor监控jvm

背景概述:

kube-prometheus的相关配置全部都通过自定义资源来控制,包括自定kind类型,Prometheus-Operater的statefulset类型实际是由自定义的Prometheus的kind控制,而Prometheus的配置文件是由名为prometheus-k8s的Opaque类型的secret控制。数据全部写入CRD内。prometheus-operator 中的每个 Prometheus CRD 资源,Operator 都会以 StatefulSet 形式在相同的命名空间下部署对应配置的资源,Prometheus Pod 的配置是通过一个包含 Prometheus 配置的名为 的 Secret 对象声明挂载的。

Kubernetes 中的 Custom Resource Definitions(CRDs)允许用户自定义资源和控制器,并将其作为 Kubernetes API 的一部分进行管理。通过 CRDs,用户可以扩展 Kubernetes API,以便支持自定义的资源类型和控制器。

下面是一些关于 CRDs 的要点解释:

  1. 自定义资源(Custom Resources):CRDs 允许用户定义自己的资源类型,这些资源类型在 Kubernetes 原生资源之外。例如,用户可以定义一个名为 MyApp 的自定义资源类型,用来描述他们应用程序的特定配置。
  2. 自定义控制器(Custom Controllers):用户可以编写自定义控制器来处理他们定义的自定义资源。这些控制器负责监视和对自定义资源进行操作,以实现用户定义的逻辑。通过自定义控制器,用户可以定义自己的业务逻辑、自动化流程等。
  3. CRD 对象:当用户创建一个新的 CRD 时,Kubernetes 会在 API Server 中注册这个新资源类型。然后,用户可以使用 kubectl 或其他 Kubernetes API 来管理这个自定义资源。
  4. API 扩展:CRDs 提供了一种扩展 Kubernetes API 的机制,使用户能够根据其特定需求定义和管理自定义资源类型。

下面开始正题,创建ServiceMonitor:

1.创建一个ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
annotations:
meta.helm.sh/release-name: cceaddon-cie-collector
meta.helm.sh/release-namespace: monitoring
generation: 2
labels:
app: jvm-endpoints
app.kubernetes.io/managed-by: Helm
release: cceaddon-cie-collector
name: jvm-endpoints
namespace: monitoring
uid: 9a5abc83-5df6-4122-9945-d7f9be0d544e
spec:
endpoints:
- honorLabels: true
interval: 60s
relabelings:
- targetLabel: environment
replacement: "测试环境"
- sourceLabels: [__meta_kubernetes_service_annotation_prometheus_io_jvm]
action: keep
regex: "true"
- sourceLabels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
targetLabel: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- sourceLabels: [__meta_kubernetes_service_name]
action: replace
regex: (.+)
targetLabel: application
replacement: $1
- action: labelmap
regex: __meta_kubernetes_serviceLabel_(.+)
jobLabel: jvm-endpoints
namespaceSelector:
any: true
selector: {}
2.修改Services的标签
1.直接修改yaml文件: kubectl edit svc 你的service名字 
例:kubectl edit svc app
apiVersion: v1
kind: Service
metadata:
  annotations:                         #这是新增的annotate
    prometheus.io/jvm: "true"          #这是新增的lable
    prometheus.io/port: "12345"        #这是新增的lable
  labels:
    app: app
    name: app
  name: app
  namespace: default
spec:
  clusterIP: 10.247.4.104
  externalTrafficPolicy: Cluster
  ports:
  - name: cce-service-0
    nodePort: 30000
    port: 30000
    protocol: TCP
    targetPort: 30000
  selector:
    app: app
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

2.直接命令行修改:

kubectl annotate svc 你的service名字 prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite

例:
kubectl annotate svc app prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite
3.检查prometheus 监控Targets (指标)是否存在job名为jvm的Targets

4.推荐grafana模板

8563

打赏