在 Prometheus Operator 中使用自定义配置

在 Prometheus Operator 我们通过声明式的创建如 Prometheus, ServiceMonitor 这些自定义的资源类型来自动化部署和管理 Prometheus 的相关组件以及配置。而在一些特殊的情况下,对于用户而言,可能还是希望能够手动管理 Prometheus 配置文件,而非通过 Prometheus Operator 自动完成。 为什么? 实际上 Prometheus Operator 对于 Job 的配置只适用于在 Kubernetes 中部署和管理的应用程序。如果你希望使用 Prometheus 监控一些其他的资源,例如 AWS 或者其他平台中的基础设施或者应用,这些并不在 Prometheus Operator 的能力范围之内。

为了能够在通过 Prometheus Operator 创建的 Prometheus 实例中使用自定义配置文件,我们只能创建一个不包含任何与配置文件内容相关的 Prometheus 实例

  1. apiVersion: monitoring.coreos.com/v1
  2. kind: Prometheus
  3. metadata:
  4. name: inst-cc
  5. namespace: monitoring
  6. spec:
  7. serviceAccountName: prometheus
  8. resources:
  9. requests:
  10. memory: 400Mi

将以上内容保存到prometheus-inst-cc.yaml文件中,并且通过kubectl创建:

  1. $ kubectl -n monitoring create -f prometheus-inst-cc.yaml
  2. prometheus.monitoring.coreos.com/inst-cc created

如果查看新建Prometheus的Pod实例YAML定义,我们可以看到Pod中会包含一个volume配置:

  1. volumes:
  2. - name: config
  3. secret:
  4. defaultMode: 420
  5. secretName: prometheus-inst-cc

Prometheus的配置文件实际上是保存在名为prometheus-<name-of-prometheus-object>的Secret中,当用户创建的Prometheus中关联ServiceMonitor这类会影响配置文件内容的定义时,Promethues Operator会自动管理。而如果Prometheus定义中不包含任何与配置相关的定义,那么Secret的管理权限就落到了用户自己手中。

通过修改prometheus-inst-cc的内容,从而可以让用户可以使用自定义的Prometheus配置文件,作为示例,我们创建一个prometheus.yaml文件并添加以下内容:

  1. global:
  2. scrape_interval: 10s
  3. scrape_timeout: 10s
  4. evaluation_interval: 10s

生成文件内容的base64编码后的内容:

  1. $ cat prometheus.yaml | base64
  2. Z2xvYmFsOgogIHNjcmFwZV9pbnRlcnZhbDogMTBzCiAgc2NyYXBlX3RpbWVvdXQ6IDEwcwogIGV2YWx1YXRpb25faW50ZXJ2YWw6IDEwcw==

修改名为prometheus-inst-cc的Secret内容,如下所示:

  1. $ kubectl -n monitoring edit secret prometheus-inst-cc
  2. # 省略其它内容
  3. data:
  4. prometheus.yaml: "Z2xvYmFsOgogIHNjcmFwZV9pbnRlcnZhbDogMTBzCiAgc2NyYXBlX3RpbWVvdXQ6IDEwcwogIGV2YWx1YXRpb25faW50ZXJ2YWw6IDEwcw=="

通过port-forward在本地访问新建的Prometheus实例,观察配置文件变化即可:

  1. kubectl -n monitoring port-forward statefulsets/prometheus-inst-cc 9091:9090