【问题标题】:Add Kubernetes scrape target to Prometheus instance that is NOT in Kubernetes将 Kubernetes 抓取目标添加到不在 Kubernetes 中的 Prometheus 实例
【发布时间】:2022-01-24 03:57:59
【问题描述】:

我以 http://localhost:9090/targets 的身份在本地运行 prometheus

docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus

并希望将其连接到我们拥有的多个 Kubernetes(集群)实例。 看到抓取有效,试试Grafana dashboards 等。

然后我将在专门用于监控的专用服务器上执行相同的操作。 然而,所有谷歌搜索都为我提供了所有不同的方式来配置已经在一个 Kubernetes 实例中的 prometheus,并且无法从外部 Kubernetes 读取指标。

如何将 Kubernetes 抓取目标添加到不在 Kubernetes 中的 Prometheus 实例?


我已阅读 Where Kubernetes metrics come from 并检查了我的(第一个)Kubernetes 集群是否具有 Metrics Server

kubectl get pods --all-namespaces | grep metrics-server 

将 Prometheus 实例添加到每个 Kubernetes(集群)实例中绝对没有意义。一个 Prometheus 必须能够从许多 Kubernetes 集群和其中的每个节点读取指标。

附:一些old question 的答案是在每个 Kubernetes 中安装 Prometheus,然后使用联合,这与我正在寻找的正好相反。

附言我也很奇怪,为什么作为 Cloud Native Foundation 的 #1 和 #2 项目的 Kubernetes 和 Prometheus 没有简单的“在 Prometheus 中添加 Kubernetes 目标”按钮或简单的步骤。

【问题讨论】:

  • 您的问题现在解决了吗?
  • 您使用的是哪个版本的 Kubernetes,您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。

标签: kubernetes prometheus target


【解决方案1】:

如果我理解您的问题,您想监控远程 kubernetes 集群上未安装 prometheus 的 kubernetes 集群。

我从一个 prometheus 监控许多不同的 kubernetes 集群 安装在独立服务器上。

您可以通过使用具有访问 kubernetes api 适当权限的服务帐户在 kubernetes 服务器上生成一个令牌来做到这一点。

Kubernetes-api:

以下是配置 prometheus 抓取作业所需的详细信息。

  1. 创建一个有权读取和观看 豆荚。
  2. 从服务帐户生成令牌。
  3. 如下创建抓取作业。
- job_name: kubernetes
  kubernetes_sd_configs:
  - role: node
    api_server: https://kubernetes-cluster-api.com
    tls_config:
      insecure_skip_verify: true
      bearer_token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  bearer_token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  scheme: https
  tls_config:
    insecure_skip_verify: true
  relabel_configs:
  - separator: ;
    regex: __meta_kubernetes_node_label_(.+)
    replacement: $1
    action: labelmap

我已经在文章中详细解释过
“使用 prometheus 监控远程 kubernetes 集群”。 https://amjadhussain3751.medium.com/monitor-remote-kubernetes-cluster-using-prometheus-a3781b041745

【讨论】:

  • 我已经浏览了该链接。我创建了 ServiceAccount,安装了 Prometheus 并创建了 scrape。我是否应该在主节点上安装 cAdvisor 来收集指标?请指教
【解决方案2】:

在我看来,在每个集群中部署一个 Prometheus 实例是一种比组织外部访问更简单、更干净的方式。主要问题是使用kubernetes_sd_configs 发现的目标是集群内部的 DNS 名称和 IP 地址(或者至少在我的 AWS EKS 集群中是这样)。要解决这些问题,您必须在集群内。

这个问题可以通过使用代理来解决,因此下面的配置使用 API-server 的代理端点来到达目标。我不确定它在大型集群中的性能,但在这种情况下,部署一个内部 Prometheus 实例是非常值得的。

通过 API-server 代理进行外部访问

你需要的东西(每个集群):

  1. 用于 HTTPS 的 API-server CA 证书(请参阅下文如何获取)。
  2. 具有适当权限的服务帐户令牌(取决于您的需要)。

假设你已经有了这些,这里是一个 Prometheus 配置示例:

- job_name: 'kubelet-cadvisor'
  scheme: https

  kubernetes_sd_configs:
  - role: node
    api_server: https://api-server.example.com

    # TLS and auth settings to perform service discovery
    authorization:
      credentials_file: /kube/token  # the file with your service account token
    tls_config:
      ca_file: /kube/CA.crt  # the file with the CA certificate

  # The same as above but for actual scrape request.
  # We're going to send scrape requests back to the API-server
  # so the credentials are the same.
  bearer_token_file: /kube/token
  tls_config:
    ca_file: /kube/CA.crt

  relabel_configs:
  # This is just to drop this long __meta_kubernetes_node_label_ prefix
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)

  # By default Prometheus goes to /metrics endpoint.
  # This relabeling changes it to /api/v1/nodes/[kubernetes_io_hostname]/proxy/metrics/cadvisor
  - source_labels: [kubernetes_io_hostname]
    replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor
    target_label: __metrics_path__

  # This relabeling defines that Prometheus should connect to the
  # API-server instead of the actual instance. Together with the relabeling
  # from above this will make the scrape request proxied to the node kubelet.
  - replacement: api-server.example.com
    target_label: __address__

以上内容是为抓取role: node量身定做的。要使其与其他角色一起使用,您必须更改 __metrics_path__ 标签。 "Manually constructing apiserver proxy URLs" 文章可以帮助构建路径。

如何获取 API-server CA 证书

有几种方法可以得到它,但从kubeconfig 得到它在我看来是最简单的:

❯ kubectl config view --raw
apiVersion: v1
clusters:
- cluster:                      # you need this ⤋ long value 
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJ...
    server: https://api-server.example.com
  name: default
...

kubeconfig 中的证书是 base64 编码的,因此您必须先对其进行解码才能使用:

echo LS0tLS1CRUdJTiBDRVJUSUZJ... | base64 -d > CA.crt

【讨论】:

    【解决方案3】:

    有许多代理能够将 k8s 中收集的指标保存到集群外的远程 Prometheus 服务器,例如 Prometheus 本身现在支持agent modeOpentelemetry 的导出器或使用managed Prometheus 等。

    【讨论】:

    • 请参阅 github.com/prometheus/prometheus 上的架构概述并了解 Prometheus 可以执行 pulling,因此无需安装任何能够执行 pushing 的代理。这个答案再次建议安装一些东西,而prometheus.io/docs/instrumenting/exporters 说 Kubernetes(直接)“以 Prometheus 格式公开指标,因此不需要单独的导出器”。尽管此建议可能有价值,但它不能成为公认的答案。
    • 另外,Prometheus 代理是 v2.32.0 的新实验性功能,它不是最初应该使用的 Prometheus。
    • 尝试从顶部阅读,作者解释得很好,有理有据。人们可以等待 Prometheus 代理模式进入 GA,或者无论如何已经有许多代理软件已经在这样做了。以 Prometheus 格式公开并不意味着指标会自动保存到 Prometheus 服务器。如果您想不时公开所有可能的 /metrics 端点,更不用说那些私有集群......并继续从外部拉取,这取决于您。
    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2020-11-18
    • 2018-01-30
    • 2019-01-30
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多