Как получить уведомление внутри приложения в 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 и обновлять развертывание, связанное с ним.

Другие вопросы по тегам