【问题标题】:prometheus node-exporter on kubernetesKubernetes 上的 prometheus 节点导出器
【发布时间】:2019-11-19 10:08:07
【问题描述】:

我已经在 kubernetes 集群 (EKS) 上部署了 prometheus。我能够通过以下方式成功抓取prometheustraefik

scrape_configs:
  # A scrape configuration containing exactly one endpoint to scrape:

  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    static_configs:
      - targets: ['prometheus.kube-monitoring.svc.cluster.local:9090']

  - job_name: 'traefik'
    static_configs:
      - targets: ['traefik.kube-system.svc.cluster.local:8080']

但部署为DaemonSet 并具有以下定义的节点导出器并未公开节点指标。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      name: node-exporter
      labels:
        app: node-exporter
    spec:
      hostNetwork: true
      hostPID: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.18.1
        args:
        - "--path.procfs=/host/proc"
        - "--path.sysfs=/host/sys"
        ports:
        - containerPort: 9100
          hostPort: 9100
          name: scrape
        resources:
          requests:
            memory: 30Mi
            cpu: 100m
          limits:
            memory: 50Mi
            cpu: 200m
        volumeMounts:
        - name: proc
          readOnly:  true
          mountPath: /host/proc
        - name: sys
          readOnly: true
          mountPath: /host/sys
      tolerations:
        - effect: NoSchedule
          operator: Exists
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys

并在 prometheus 中关注 scrape_configs

scrape_configs:
  - job_name: 'kubernetes-nodes'
    scheme: http
    kubernetes_sd_configs:
    - role: node
    relabel_configs:
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.+)
    - target_label: __address__
      replacement: kubernetes.kube-monitoring.svc.cluster.local:9100
    - source_labels: [__meta_kubernetes_node_name]
      regex: (.+)
      target_label: __metrics_path__
      replacement: /api/v1/nodes/${1}/proxy/metrics 

我也尝试从其中一个容器中curl http://localhost:9100/metrics,但得到了curl: (7) Failed to connect to localhost port 9100: Connection refused

我在这里缺少什么配置?

在建议通过 helm 安装 Prometheus 后,我没有在测试集群上安装它,并尝试将我的原始配置与 helm 安装的 Prometheus 进行比较。

以下 pod 正在运行:

NAME                                                     READY   STATUS    RESTARTS   AGE
alertmanager-prometheus-prometheus-oper-alertmanager-0   2/2     Running   0          4m33s
prometheus-grafana-66c7bcbf4b-mh42x                      2/2     Running   0          4m38s
prometheus-kube-state-metrics-7fbb4697c-kcskq            1/1     Running   0          4m38s
prometheus-prometheus-node-exporter-6bf9f                1/1     Running   0          4m38s
prometheus-prometheus-node-exporter-gbrzr                1/1     Running   0          4m38s
prometheus-prometheus-node-exporter-j6l9h                1/1     Running   0          4m38s
prometheus-prometheus-oper-operator-648f9ddc47-rxszj     1/1     Running   0          4m38s
prometheus-prometheus-prometheus-oper-prometheus-0       3/3     Running   0          4m23s

我在 /etc/prometheus/prometheus.yml 的 pod prometheus-prometheus-prometheus-oper-prometheus-0 中没有找到节点导出器的任何配置

【问题讨论】:

  • 好像你在使用prometheus operator,你是否为node-exporter创建了一个servicemonitor?运行 kubectl get servicemonitors --all-namespaces 来解决这个问题。

标签: kubernetes prometheus amazon-eks prometheus-node-exporter


【解决方案1】:

之前使用 Helm 的建议非常有效,我也建议这样做。

关于您的问题:问题是您不是直接抓取节点,而是为此使用 node-exporter。所以role: node 不正确,你应该改用role: endpoints。为此,您还需要为 DaemonSet 的所有 pod 创建服务。

这是我的环境中的工作示例(由 Helm 安装):

- job_name: monitoring/kube-prometheus-exporter-node/0
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - monitoring
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_label_app]
    separator: ;
    regex: exporter-node
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_endpoint_port_name]
    separator: ;
    regex: metrics
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_pod_name]
    separator: ;
    regex: (.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: (.*)
    target_label: job
    replacement: ${1}
    action: replace
  - separator: ;
    regex: (.*)
    target_label: endpoint
    replacement: metrics
    action: replace

【讨论】:

    【解决方案2】:

    您是如何部署 Prometheus 的?每当我使用 helm-chart (https://github.com/helm/charts/tree/master/stable/prometheus) 时,都会部署节点导出器。也许这是一个更简单的解决方案。

    【讨论】:

    • 我没有使用helm。我知道大部分教程都使用 helm。
    • 我的建议:使用它。 helm 为您做的所有事情都由手工完成,这并不有趣。相信我,您不想维护多个标准应用程序部署。
    【解决方案3】:

    我被困在类似的地方。但是在这里,我的节点导出器不是 helm 部署的一部分,因为我们从 Tanzu kubernetes 网格(k8s 集群)中获得了附加节点导出器。所以我创建了服务监视器,现在我可以看到服务发现和计数应该是什么。但在目标部分它说的是 0/4 计数。无法看到节点的指标,但是当我可以 curl localhost:9100/metrics 时,我可以看到数据。有些地方我错过了逻辑。

    我检查了 helm 部署的 node-exporter 数据,它看起来一样,但我在这里缺少什么?

    请忽略缩进,因为它们在移动中复制粘贴时会丢失。

     - job_name: node-exporter
       scrape_interval: 15s
       scrape_timeout: 10s
       metrics_path: /metrics
       scheme: http
       kubernetes_sd_configs:
         - role: endpoints
           namespaces:
           names:
            - monitoring
      relabel_configs:
       - source_labels: 
           [__meta_kubernetes_service_label_app]
          separator: ;
          regex: exporter-node
          replacement: $1
          action: keep
       - source_labels: 
           [__meta_kubernetes_endpoint_port_name]
          separator: ;
          regex: metrics
          replacement: $1
          action: keep
      - source_labels: [__meta_kubernetes_namespace]
         separator: ;
         regex: (.*)
         target_label: namespace
         replacement: $1
         action: replace
     - source_labels: [__meta_kubernetes_pod_name]
       separator: ;
       regex: (.*)
       target_label: pod
       replacement: $1
       action: replace
    - source_labels: [__meta_kubernetes_service_name]
       separator: ;
       regex: (.*)
       target_label: service
       replacement: $1
       action: replace
     - source_labels: [__meta_kubernetes_service_name]
       separator: ;
        regex: (.*)
       target_label: job
       replacement: ${1}
       action: replace
      - separator: ;
        regex: (.*)
        target_label: endpoint
        replacement: metrics
        action: replace
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2020-04-21
      • 2021-03-13
      相关资源
      最近更新 更多