当基础ConfigMap发生变化时,如何运行一个简单的容器触发Prometheus重新加载其配置?

时间:2017-02-02 00:18:46

标签: kubernetes prometheus

在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

2 个答案:

答案 0 :(得分:2)

(编辑:我花了一些时间才能完全开始工作) 这适用于小型边车容器。配置可能如下所示:

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 $1)"
   echo "[$(date +%s)] Trigger refresh"
   curl -sSL -X POST "$2" > /dev/null
done

所有内容都可以在this container on Dockerhub

中找到

由于inotifywait更改后由Kubernetes完成的符号链接杂耍,保留-m ConfigMap的单traceback.print_exc()无法正常工作。

答案 1 :(得分:0)

另一种选择是使用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

一个缺点可能是这样你放松了在内存中缓存的数据,但它是直接的,并且不需要边车容器。