提问者:小点点

Helm Prometheus操作员不会向目标添加新的ServiceMonitorendpoint


我正在尝试使用helm prometheus监控我的应用程序https://github.com/prometheus-community/helm-charts.我已经成功安装了这个helm图表。

prometheus-kube-prometheus-operator-5d8dcd5988-bw222   1/1     Running   0          11h
prometheus-kube-state-metrics-5d45f64d67-97vxt         1/1     Running   0          11h
prometheus-prometheus-kube-prometheus-prometheus-0     2/2     Running   0          11h
prometheus-prometheus-node-exporter-gl4cz              1/1     Running   0          11h
prometheus-prometheus-node-exporter-mxrsm              1/1     Running   0          11h
prometheus-prometheus-node-exporter-twvdb              1/1     Running   0          11h

这些yml配置在同一命名空间中创建的应用服务和部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: appservice
  namespace: monitoring
  labels:
    app: appservice
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/path: '/actuator/prometheus'
spec:
  replicas: 1
  selector:
    matchLabels:
      app: appservice
  template:
    metadata:
      labels:
        app: appservice
...
apiVersion: v1
kind: Service
metadata:
  name: appservice
  namespace: monitoring
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/path: '/actuator/prometheus'
spec:
  selector:
    app: appservice
  type: ClusterIP
  ports:
    - name: web
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: jvm-debug
      protocol: TCP
      port: 5005
      targetPort: 5005

部署应用程序后,我创建了ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: appservice-servicemonitor
  namespace: monitoring
  labels:
    app: appservice
    release: prometheus-repo
spec:
  selector:
    matchLabels:
      app: appservice # target app service
  namespaceSelector:
    matchNames:
      - monitoring
  endpoints:
  - port: web
    path: '/actuator/prometheus'
    interval: 15s

我希望添加此ServiceMonitor后,我的prometheus实例创建新的目标"'like"超文本传输协议://appservice: 8080/执行器/prometheus",但事实并非如此,新的endpoint不会出现在prometheusUI中。

我试图通过添加附加服务监视器来更改helm值

namespaceOverride: "monitoring"
nodeExporter:
  enabled: true

prometheus:
  enabled: true
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelector:
      matchLabels:
       release: prometheus-repo
    additionalServiceMonitors:
      namespaceSelector:
        any: true
    replicas: 1
    shards: 1
    storageSpec:
      ...
    securityContext:
      ...
    nodeSelector:
      assignment: monitoring

  nodeSelector:
    assignment: monitoring

prometheusOperator:
  nodeSelector:
    assignment: monitoring
  admissionWebhooks:
    patch:
      securityContext:
        ...
  securityContext:
    ...

global:
  alertmanagerSpec:
    nodeSelector:
      assignment: monitoring

但是没有帮助。真的很难说出了什么问题,没有错误日志,所有配置都应用成功。


共3个答案

匿名用户

我发现这个指南非常有用。

请记住,根据prometheus堆栈,您使用的标签和名称可以有不同的默认值(对我来说,使用库贝-prometheus堆栈,例如秘密名称是prometheus-库贝-prometheus-stack-prometheus而不是prometheus-k8s)。

基本报价:

ServiceMonitor对象和它们所属的命名空间由Prometheus对象的serviceMonitor orSelector和serviceMonitor NamespaceSelector选择。ServiceMonitor的名称被编码在Prometheus配置中,因此您可以简单地grep它是否存在于那里。Prometheus算子生成的配置存储在库伯内特斯秘密中,以Prometheus对象名称为前缀的Prometheus命名,并且与Prometheus对象位于相同的命名空间中。例如,对于名为k8s的Prometheus对象,您可以了解名为my-service-itor的ServiceMonitor是否已被拾取:

kubectl -n monitoring get secret prometheus-k8s -ojson | jq -r '.data["prometheus.yaml.gz"]' | base64 -d | gunzip | grep "my-service-monitor

匿名用户

您可以使用prometheus Web界面进行分析:

(1)检查ServiceMonitor配置是否出现在prometheus配置中:http://localhost:9090/config如果您找不到您的配置,我会检查您的配置是否有效并部署到集群。

(2)检查prometheus是否可以通过此配置发现pod:http://localhost:9090/service-discovery

如果服务发现找不到您的pod,我会将配置所需的所有值与您的pod提供的标签进行比较。

(3)如果服务发现选择了您的服务,请检查目标页面:http://localhost:9090/targets

在这里,您将看到prometheusendpoint是否健康且可由prometheus访问。

匿名用户

最近我有一个案例,在升级ArgoCD后,他们用来确定哪些资源是应用程序形式的默认注释发生了变化。

现在是app.kubernetes.io/instance,它可能会冲突(覆盖)Helm生成的“预期”版本名称。作为结果,版本名称可以与ArgoCD应用程序实例名称混合。在这种情况下,您可以以注释值结束,例如my-release ase-namedev-my-release ase-name(如果您的ArgoCD应用程序与应用程序中定义的版本名称不同)。

从那以后,我的大多数服务监视器不再作为服务监视器工作CRD注释与服务注释不匹配。解决方案是不使用app.kubernetes.io/instance注释来标记该工具管理的资源。

由于上述原因,如果您为ArgoCD应用程序设置了发布名称,我建议始终使用argocd.argoproj.io/instance而不是默认名称。

https://argo-cd.readthedocs.io/en/stable/faq/#why-is-my-app-out-of-sync-even-after-syncing