prometheus operator - 启用对所有命名空间中所有内容的监控

Posted

技术标签:

【中文标题】prometheus operator - 启用对所有命名空间中所有内容的监控【英文标题】:prometheus operator - enable monitoring for everything in all namespaces 【发布时间】:2020-06-27 14:05:57 【问题描述】:

我想通过 prometheus-operator 在名为 developmentproduction 的命名空间中监控 Kubernetes 集群上运行的几个应用程序。

使用的安装命令(根据Github)是:

helm install prometheus-operator stable/prometheus-operator -n production --set prometheusOperator.enabled=true,prometheus.service.type=NodePort,prometheusOperator.service.type=NodePort,alertmanager.service.type=NodePort,grafana.service.type=NodePort,grafana.service.nodePort=30906

为了让prometheus-operator 发现和监控在所有namespaces 中运行的所有应用程序/服务/pod,我需要在上面的命令中添加哪些参数?

有了这个,Service Discovery 只显示一些与prometheus-operator 相关的services,而不是我在“生产”命名空间中运行的应用程序,即使prometheus-operator 安装在同一个namespace 中。

我缺少什么吗?

注意 - 我正在使用同一用户(使用 $HOME/.kube/config file)执行所有操作,所以我认为权限不是问题。

kubectl 版本 - v1.17.3 掌舵版本 - 3.1.2

附:在不同的论坛上有很多关于此的文章,但我仍然没有找到简单直接的答案。

【问题讨论】:

您的环境是什么:本地(Minikube、Kubeadm)、本地?你想得到什么指标? CPU/内存指标或更复杂?您的集群中有 custom.metrics 吗? 本地 kubeadm(不是 minikube)。我想先看看 Prometheus 和 Grafana 上的基本 CPU、内存相关指标,然后再考虑复杂的指标。此时,Prometheus UI 中没有显示与应用的服务或 pod 相关的任何内容。 kubeadm 集群中有多少个节点?您的指标服务器是否也收集了信息?几天前,我遇到了与指标服务器相关的服务发现问题(如果您有 2 个或更多节点,则需要修改指标服务器部署)。您能否检查this 并提供您的指标服务器 YAML?还使用 --v=6 从指标服务器记录日志 【参考方案1】:

我遇到了同样的问题。经过一些调查并提供更多详细信息。

我已经通过Helm charts 安装了 Prometheus 堆栈,其中直接将 Prometheus 操作符图表作为子项目包含在内。 Prometheus 操作员监控由以下 helm 值指定的命名空间:

prometheusOperator:
  namespaces: ''
  denyNamespaces: ''
  prometheusInstanceNamespaces: ''
  alertmanagerInstanceNamespaces: ''
  thanosRulerInstanceNamespaces: ''

namespaces 值指定 ServiceMonitor 和 PodMonitor CRD 的受监控命名空间。其他 CRD 有自己的设置,如果没有设置,默认为namespaces。 Helm 值作为命令行参数传递给操作员。请参阅here 和here。

Prometheus CRD 由操作员从上述命名空间中提取,默认情况下 - 无处不在。但是,由于 operator 在设计时考虑了多个同时发布的 Prometheus,因此特定 Prometheus 应用程序实例获取的内容由相应的 Prometheus CRD 控制。 CRD 选择器和相应的命名空间选择器通过以下 Helm 值控制:

prometheus:
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: true
    serviceMonitorSelector: 
    serviceMonitorNamespaceSelector: 

其他 CRD 也存在类似的值:alertmanagerConfigXXX、ruleNamespaceXXX、podMonitorXXX、probeXXX。 XXXSelectorNilUsesHelmValues 设置为 true,表示查找具有特定发布标签的 CRD,例如release=myrelease。见here。

空选择器(对于命名空间、CRD 或任何其他对象)意味着没有过滤。因此,要让 Prometheus 对象从其他命名空间中获取 ServiceMonitor,有几个选项:

设置serviceMonitorSelectorNilUsesHelmValues: false。这会将 serviceMonitorSelector 留空。 应用发布标签,例如release=myrelease,发送到您的 ServiceMonitor CRD。 设置与您的 ServiceMonitor 匹配的非空 serviceMonitorSelector。

对于好奇的,这里是运营商来源的链接:

Enqueue of Prometheus CRD processing Processing of Prometheus CRD

【讨论】:

【参考方案2】:

我使用了来自https://github.com/helm/charts/blob/master/stable/prometheus-operator/values.yaml 的 values.yaml,将参数 *NilUsesHelmValues 修改为 False,它似乎可以正常工作。 helm install prometheus-operator stable/prometheus-operator -n monitoring -f values.yaml

此外,就像https://***.com/users/7889479/anish-kumar-mourya 所述,服务确实显示在 Grafana 仪表板中,即使它们没有出现在服务发现或目标下的 Prometheus UI 中。

希望这对像我这样的其他新手有所帮助。

【讨论】:

【参考方案3】:

没关系,但您可以创建新的命名空间进行监控,并在那里安装 prometheus,这样可以很好地管理与监控相关的事情。

helm install prometheus-operator stable/prometheus-operator -n monitoring

【讨论】:

但是为什么 Production 和 Development 命名空间下的应用程序没有被发现并显示在 Service Discovery 或 Targets 下? 它的发现萌芽,转到 Home ,选择 "kubernetes-compute-resources-pod" 现有仪表板,然后在此处查看命名空间选项。 In My course,我讲了prometheus-operator和其他的集成(nginx-ingress, cluster-autoscaler,...) 检查 helm chart 选项中的 prometheusOperator.namespaces,默认情况下它应该采用所有 namespaces 。您的集群上的 helm 安装状态如何?因为它对我有用。【参考方案4】:

你需要为pod创建一个service和一个serviceMonitor自定义资源来配置prometheus需要在哪个namespace中发现哪些服务。

kube-state-metrics 服务示例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: kube-state-metrics
    k8s-app: kube-state-metrics
  annotations:
    alpha.monitoring.coreos.com/non-namespaced: "true"
  name: kube-state-metrics
spec:
  ports:
  - name: http-metrics
    port: 8080
    targetPort: metrics
    protocol: TCP
  selector:
    app: kube-state-metrics

此服务以标签为 k8s-app: kube-state-metrics 的所有 Pod 为目标。

通用 ServiceMonitor 示例

此 ServiceMonitor 以命名空间 kube-system 和监控 (spec.namespaceSelector) 中带有任何值的标签 k8s-app (spec.selector) 的所有服务为目标。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: k8s-apps-http
  labels:
    k8s-apps: http
spec:
  jobLabel: k8s-app
  selector:
    matchExpressions:
    - key: k8s-app, operator: Exists
  namespaceSelector:
    matchNames:
    - kube-system
    - monitoring
  endpoints:
  - port: http-metrics
    interval: 15s

https://github.com/coreos/prometheus-operator/blob/master/Documentation/user-guides/running-exporters.md

【讨论】:

以上是关于prometheus operator - 启用对所有命名空间中所有内容的监控的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus-operator架构详解

prometheus-operator监控Kubernetes

kubernetes1.23.1部署prometheus-operator

Kubernetes更优雅的监控工具Prometheus Operator

如何使用 helm chart 向 prometheus-operator 添加 smtp 设置?

Prometheus Operator - 每天5分钟玩转 Docker 容器技术(177)