Kubernetes 中 Prometheus 的动态目标?

Dynamic targets for Prometheus in Kubernetes?

在我的 docker 设置中,我维护了 targets.json 文件,该文件动态更新了要探测的目标。该文件一开始是空的,但在某些用例中附加了目标。

样本targets.json

[
  {
    "targets": [
      "x.x.x.x"
    ],
    "labels": {
      "app": "testApp1"
    }
  },
  {
    "targets": [
      "x.x.x.x"
    ],
    "labels": {
      "app": "testApp2"
    }
  }
]

此文件随后作为 file_sd_configs 提供给 prometheus 配置。一切正常,由于应用程序中的某些事件,目标被添加到 targets.json 文件,并且普罗米修斯开始与黑盒一起监控以进行健康检查。

scrape_configs:
  - job_name: 'test-run'
    metrics_path: /probe
    params:
      module: [icmp]
    file_sd_configs:
      - files:
        - targets.json
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox:9115

在我的 node.js 应用程序中,我可以将数据附加到 targets.json 文件, 但是 现在我试图在 minikube 上的 Kubernetes 中复制它。我尝试如下添加 ConfigMap 并且它有效,但我不想在配置中填充目标,而是维护一个 json 文件。

这可以使用持久卷来完成吗? pod 运行 Prometheus 将始终读取目标文件,而 pod 运行 应用程序将写入目标文件。

kind: ConfigMap
apiVersion: v1
metadata:
  name: prometheus-cm
data:
  targets.json: |-
    [
      {
        "targets": [
          "x.x.x.x"
        ],
        "labels": {
          "app": "testApp1"
        }
      }
    ]

简单地说,Kubernetes 中推荐使用什么策略,以便一个 pod 可以读取 json 文件而另一个 pod 可以写入该文件。

为了实现您的目标,您需要使用 PVC:

A PersistentVolume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. It is a resource in the cluster just like a node is a cluster resource. PVs are volume plugins like Volumes, but have a lifecycle independent of any individual pod that uses the PV. This API object captures the details of the implementation of the storage, be that NFS, iSCSI, or a cloud-provider-specific storage system.

A PersistentVolumeClaim (PVC) is a request for storage by a user. It is similar to a pod. Pods consume node resources and PVCs consume PV resources. Pods can request specific levels of resources (CPU and Memory). Claims can request specific size and access modes (e.g., can be mounted once read/write or many times read-only).

如果一个 pod 必须写入它而另一个 pod 必须读取它,则需要保留 json 文件。有一个 official guide 描述了这个概念的步骤:

  • 创建一个PersistentVolume

  • 创建一个PersistentVolumeClaim

  • 创建一个 Pod 将您的 PersistentVolumeClaim 用作卷

我还推荐阅读这篇文章:Create ReadWriteMany PersistentVolumeClaims on your Kubernetes Cluster 作为补充。