我如何 运行 一个简单的容器来触发 Prometheus 在底层 ConfigMap 更改时重新加载其配置?

How would I run a simple container the triggers Prometheus to reload its config when the underlying ConfigMap changes?

当 运行 Kubernetes 中的 Prometheus 时,我正在通过 ConfigMap 推出新配置。 ConfigMaps 在容器中作为文件公开。

我希望 Prometheus 在文件更改时自动重新加载其配置。

这样的东西行得通吗?

inotifywait -q -m -e close_write /etc/prometheus/config.yml |
while read -r filename event; do
  curl -X POST http://localhost:9090/-/reload
done

(编辑:我花了一些时间让它完全发挥作用) 这适用于一个小的 sidecar 容器。配置可能如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  template:
    ....
    spec:
      containers:
        ... (your actual container config goes here) ...
      - name: refresh
        imagePullPolicy: Always
        args:
        - /etc/prometheus/config.yml
        - http://localhost:9090/-/reload
        image: tolleiv/k8s-prometheus-reload
        volumeMounts:
          - name: config-volume
            mountPath: /etc/prometheus
      volumes:
        - name: config-volume
          configMap:
            name: prometheus

实际检查是使用此脚本完成的,其中观察到的文件和 URL 作为参数传递:

#!/bin/sh
while true; do
   inotifywait "$(readlink -f )"
   echo "[$(date +%s)] Trigger refresh"
   curl -sSL -X POST "" > /dev/null
done

一切尽在this container on Dockerhub

保持单个 inotifywait-m 不工作,因为当 ConfigMap 更改时 Kubernetes 会进行符号链接处理。

另一种选择是使用 livenessProbe 命令,并在配置更改时触发 Pod 的重新启动。

可能看起来像这样:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        ports:
        - containerPort: 9090
        volumeMounts:
          - name: config-volume
            mountPath: /etc/prometheus
        livenessProbe:
          exec:
            command:
            - /bin/sh
            - -c
            - "test -z $(find /etc/prometheus -mmin -2)"
          initialDelaySeconds: 300
          periodSeconds: 10
      volumes:
        - name: config-volume
          configMap:
            name: prometheus

一个缺点可能是这样你会丢失缓存在内存中的数据,但它很简单,不需要 sidecar 容器。