Как получить уведомление внутри приложения в kubernetes при обновлении configmaps
У меня есть приложение, работающее внутри kubernetes
который имеет файл, смонтированный через configmaps
, Теперь внутри приложения я хочу выполнить какое-то действие, когда этот файл (из configmap) будет обновлен (скажем, через kubectl update configmaps xyz
команда).
Допустим, я создал configmap с помощью следующей команды:
kubectl create configmap myy-config --from-file=config.json
и мое развертывание создано так:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
-
image: "xyz"
name: myapp
ports:
-
containerPort: 5566
volumeMounts:
-
mountPath: /myapp/config
name: config
dnsPolicy: ClusterFirstWithHostNet
volumes:
-
name: config
configMap:
name: my-config
Теперь, если я сделаю kubectl exec -it <pod> sh
Я могу видеть файл. Если я редактирую конфигурационную карту, используя kubectl edit configmap my-config
и изменить содержимое, приложение, запущенное в моем модуле, не получает уведомление об изменении файла. Я использую GO Lang для приложения, и он не получает fsnotify в файле /myapp/config/config.json
хотя я вижу, что после редактирования файл изменился.
Конечно, если я запускаю одно и то же приложение на своем ноутбуке, код получает fsnotify, а мое приложение обновляет его конфигурацию. Тот же код из kubernetes с файлом, полученным из configmap, он не работает. Я читал другие вопросы SOF, такие как этот, и другие, но ни у кого нет конкретного решения проблемы, с которой я сталкиваюсь.
Я понимаю, что файл (который приходит из configmap) является символической ссылкой, а фактический файл находится в папке с именем ..data/config.json
, Я также попытался добавить этот файл, но все еще не получил сигнал fsnotify. Можно ли получить сигнал fsnotify для файлов, которые приходят из configmap (а также из секретов) в приложении? Если да, может кто-нибудь, пожалуйста, помогите мне и покажите, как это сделать (желательно в GO lang)?
1 ответ
Вы могли бы быть возникли проблемы, как это:
Когда ConfigMap изменяется, реальный путь к файлам конфигурации, которые он содержит, изменяется, но это как бы "скрыто" двумя уровнями символических ссылок: [..]
Кажется, вам нужно следить за цепочкой символических ссылок и следить за этим. Поскольку ваше приложение написано наgo
ты мог бы просто использовать spf13/viper
поскольку была добавлена функция WatchConfig и Kubernetes.
В качестве альтернативы вы можете получать уведомления от Kubernetes API об изменениях в ConfigMap. Скорее всего, это потребует предварительной настройки некоторых правил доступа.
Похоже, что Reloader это тот, который вы ищете. Он будет смотреть configmap/secret и обновлять развертывание, связанное с ним.