【问题标题】:Prometheus cannot scrape kubernetes metricsPrometheus 无法抓取 Kubernetes 指标
【发布时间】:2021-07-16 12:50:56
【问题描述】:

我已经使用 kubeadm 设置了一个 kubernetes 集群。然后,我使用社区 helm 图表在其上部署了 prometheus。 我注意到 prometheus 无法从调度程序、etcd 或控制器管理器中抓取指标。

例如我看到这样的错误:

Get "https://192.168.3.83:10259/metrics": dial tcp 192.168.3.83:10259: connect: connection refused

我收到这些错误的原因是因为实际上没有在 https://192.168.3.83:10259/metrics 上监听。这是因为 kube-scheduler 将 --bind-address 设置为 127.0.0.1

我可以解决此问题的一种方法是手动编辑 /etc/kubernetes/manifests 中的清单文件,将 --bind-address 更改为 0.0.0.0

当我这样做时,prometheus 能够抓取这些指标。

但是,这是正确的解决方案吗?我假设这些清单文件实际上是由 kubernetes 本身管理的,我可能不应该直接编辑这些文件并做其他事情。但是什么?

edit:我注意到我对清单文件所做的更改在升级时确实会被覆盖。现在我又丢失了 etcd 和其他指标。

我必须在这里遗漏一些明显的东西。

我虽然改变“集群配置”配置映射可能会奏效。但是,如果你能做到这一点(以及你应该如何做到这一点),任何地方都没有记录。

我有一个开箱即用的 kubernetes 和开箱即用的 prometheus,它不收集指标。我不能是唯一一个遇到这个问题的人。真的没有办法吗?

【问题讨论】:

  • link也许对你有帮助

标签: kubernetes prometheus


【解决方案1】:

公开 kube-scheduler、etcd 或 kube-controller 管理器(并持久化更改)

可以在 0.0.0.0 上公开指标,就像您通过编辑配置映射然后将这些更改拉到每个控制平面节点所做的那样。然后,这些更改将在升级过程中持续存在。对于 etcd,这也可以通过另一种可能更可取的方式来完成(请参阅下文)

第一步:使用以下命令编辑配置映射:

kubectl edit -n kube-system cm/kubeadm-config

按照here 的描述添加/更改相关的绑定地址,但例如如下概述的 etcd:

kind: ClusterConfiguration
etcd:
  local:
    extraArgs:
      listen-metrics-urls: http://0.0.0.0:2381

第二步注意:请阅读here了解升级命令之前 将其应用于您关心的任何集群,因为它也可能会更新集群组件版本,除非您刚刚进行了升级:)

因此,要反映更改,您需要在每个控制平面节点上运行 kubeadm upgrade node(请每次运行一个)。这将关闭受影响的 Pod(您已对其进行更改的 Pod)并开始一个新的公开指标的实例。您可以在之前和之后进行验证,例如:netstat -tulpn | grep etcd

对于 etcd,Prometheus 中的默认端口是 2379,因此还需要在您的 prometheus 值文件中将其调整为 2381

kubeEtcd:
  service:
    port: 2381
    targetPort: 2381

以上解决方案来源here

访问现有的 etcd 指标而不进一步暴露它

对于 ETCD 指标,还有另一种可能是首选的方式来使用端口 2379 上已经公开的 https 指标端点(需要身份验证)来访问指标。您可以使用 Curl 验证这一点:

curl https://<your IP>:2379/metrics -k --cert /etc/kubernetes/pki/etcd/healthcheck-client.crt --key /etc/kubernetes/pki/etcd/healthcheck-client.key

为此,我们需要为 Prometheus 提供正确的证书作为 kubernetes 中的机密。步骤描述here 并概述如下:

在部署 Prometheus 的命名空间中创建一个 Secret。

kubectl -n monitoring create secret generic etcd-client-cert --from-file=/etc/kubernetes/pki/etcd/ca.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key

将以下内容添加到您的 prometheus helm 值文件中

prometheus:
  prometheusSpec:
    secrets: ['etcd-client-cert']

kubeEtcd:
  serviceMonitor:
   scheme: https
   insecureSkipVerify: false
   serverName: localhost
   caFile: /etc/prometheus/secrets/etcd-client-cert/ca.crt
   certFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.crt
   keyFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.key

Prometheus 现在应该能够使用我们安装在密钥中的证书访问 https 端点。我会说这是 etcd 的首选方式,因为我们不会进一步公开开放的 http 端点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2018-10-15
    • 2022-01-27
    • 2020-02-05
    相关资源
    最近更新 更多