【问题标题】:kubernetes cadvisor endpoint is not scraped by prometheusKubernetes cadvisor 端点未被普罗米修斯抓取
【发布时间】:2019-03-27 12:30:03
【问题描述】:

我安装了一个 minikube kubernetes 集群,它通过 prometheus 进行监控。 kubernetes 版本是 v1.13.4,直接在 vm 主机上运行(--vm-driver=none)。我在 Prometheus 配置文件中添加了一个特定的作业,以便抓取 cadvisor 容器指标。问题是 Prometheus 无法从 cadvisor 端点抓取指标。

我在 prometheus.yml 中包含以下配置

- job_name: 'kubernetes-cadvisor'
  kubernetes_sd_configs:
  - role: node
  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - target_label: __address__
    replacement:  kubernetes.default.svc:443
  - source_labels: [__meta_kubernetes_node_name]
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

但在 prometheus 目标 web UI (http://my_ip:30900/targets) 我看到“kubernetes-cadvisor”处于 DOWN 状态并显示以下错误消息

http://kubernetes.default.svc:443/api/v1/nodes/minikube/proxy/metrics/cadvisor: context deadline exceeded

kubernetes.default.svc:443 应该是默认集群 DNS,可以从 pod 中访问,但正如预期的那样,我无法在 prometheus pod 中 ping 它。

幸运的是,我注意到我可以从 url 成功获取所有 cadvisor 容器指标:

http://my_dashboard_ip_and_port/api/v1/nodes/minikube/proxy/metrics/cadvisor

prometheus pod 中的日志是:

kubectl logs prometheus-deployment-6f64ff68f9-8c9xm
level=info ts=2019-03-29T14:33:18.939973334Z caller=main.go:285 msg="no time or size retention was set so using the default time retention" duration=15d
level=info ts=2019-03-29T14:33:18.940326462Z caller=main.go:321 msg="Starting Prometheus" version="(version=2.8.1, branch=HEAD, revision=4d60eb36dcbed725fcac5b27018574118f12fffb)"
level=info ts=2019-03-29T14:33:18.94039376Z caller=main.go:322 build_context="(go=go1.11.6, user=root@bfdd6a22a683, date=20190328-18:04:08)"
level=info ts=2019-03-29T14:33:18.940455316Z caller=main.go:323 host_details="(Linux 4.15.0 #1 SMP Tue Mar 26 02:53:14 UTC 2019 x86_64 prometheus-deployment-6f64ff68f9-8c9xm (none))"
level=info ts=2019-03-29T14:33:18.94050961Z caller=main.go:324 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2019-03-29T14:33:18.940570849Z caller=main.go:325 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2019-03-29T14:33:18.941555805Z caller=main.go:640 msg="Starting TSDB ..."
level=info ts=2019-03-29T14:33:18.941946171Z caller=web.go:418 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2019-03-29T14:33:18.946861683Z caller=main.go:655 msg="TSDB started"
level=info ts=2019-03-29T14:33:18.947193152Z caller=main.go:724 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2019-03-29T14:33:18.948922627Z caller=kubernetes.go:191 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config"
level=info ts=2019-03-29T14:33:18.950164896Z caller=kubernetes.go:191 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config"
level=info ts=2019-03-29T14:33:18.951281382Z caller=kubernetes.go:191 component="discovery manager scrape" discovery=k8s msg="Using pod service account via in-cluster config"
level=info ts=2019-03-29T14:33:18.952276845Z caller=main.go:751 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2019-03-29T14:33:18.952303937Z caller=main.go:609 msg="Server is ready to receive web requests."

但我不知道如何正确配置 Prometheus yml 文件,以便也能够通过 Prometheus 获取公开的指标。

非常感谢。

【问题讨论】:

    标签: prometheus minikube cadvisor


    【解决方案1】:

    我想您可能必须使用 HTTPS 架构来针对 HTTP 抓取请求,这似乎保留在您的配置中:

    - job_name: 'kubernetes-cadvisor'
    
      scheme: https
    
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    
      kubernetes_sd_configs:
      - role: node
    
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    

    为了跳过 API 服务器证书验证,您可以将 insecure_skip_verify: true 参数添加到现有的 tls_config:

    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      insecure_skip_verify: true
    

    【讨论】:

    • 感谢您的帮助!我将 kubernetes 版本升级到 v1.14.0 以获得更稳定的环境,并且我还在 virtualbox 版本 5 上部署了 minikube,以避免所有 (--vm-driver=none) 次要影响。根据您提出的配置,我收到带有以下 https 端点 (kubernetes.default.svc:443/api/v1/nodes/minikube/proxy/metrics/…) 的响应 server returned HTTP status 403 Forbidden 消息。有什么额外的建议吗?
    • 您是否为 Prometheus 服务帐户申请了ClusterRole 和ClusterRoleBinding,如here 所述?
    • 我的略有不同。我还尝试了重新开始的 rbac 示例并 goτ 相同的错误消息:-(
    • 您能否分享来自 prometheus pod 的日志以评估 403 问题的原因?
    • 刚刚用 prometheus pod 日志更新了我的问题。我没有看到任何奇怪的日志消息
    猜你喜欢
    • 2017-09-03
    • 2022-11-02
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多