我如何 运行 一个简单的容器来触发 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 容器。
当 运行 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 容器。