在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
答案 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
一个缺点可能是这样你放松了在内存中缓存的数据,但它是直接的,并且不需要边车容器。