背景概述:
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 的要点解释:
- 自定义资源(Custom Resources):CRDs 允许用户定义自己的资源类型,这些资源类型在 Kubernetes 原生资源之外。例如,用户可以定义一个名为
MyApp
的自定义资源类型,用来描述他们应用程序的特定配置。 - 自定义控制器(Custom Controllers):用户可以编写自定义控制器来处理他们定义的自定义资源。这些控制器负责监视和对自定义资源进行操作,以实现用户定义的逻辑。通过自定义控制器,用户可以定义自己的业务逻辑、自动化流程等。
- CRD 对象:当用户创建一个新的 CRD 时,Kubernetes 会在 API Server 中注册这个新资源类型。然后,用户可以使用 kubectl 或其他 Kubernetes API 来管理这个自定义资源。
- 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