prometheus运算符-启用对所有名称空间中所有内容的监视

时间:2020-03-16 12:49:53

标签: kubernetes monitoring prometheus kubernetes-helm prometheus-operator

我想通过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中运行的所有应用程序/服务/站点?

使用此方法,Service Discovery仅显示一些与prometheus-operator相关的services,但不会显示我正在'生产'名称空间中运行的应用程序,即使prometheus-operator已安装在相同的namespace

我想念什么吗?

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

kubectl版本-v1.17.3 头盔版本-3.1.2

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

4 个答案:

答案 0 :(得分:6)

我遇到了同样的问题。经过一些调查回答更多细节。

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

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

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

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。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

不好,但是您可以创建用于监视的新名称空间并在该位置安装prometheus,这样可以很好地管理与监视有关的事情。

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

答案 3 :(得分:0)

您需要为pod创建一个服务,并创建一个serviceMonitor自定义资源,以配置prometheus需要在哪个服务中发现哪个名称空间。

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和Monitoring(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