Как получить уведомление внутри приложения в Kubernetes при обновлении конфигурационных карт

У меня есть приложение, работающее внутри kubernetes, у которого есть файл, смонтированный через configmaps. Теперь изнутри приложения я хочу выполнить какое-то действие, когда этот файл (из configmap) будет обновлен (скажем, с помощью команды kubectl update configmaps xyz).

Допустим, я создал конфигурационную карту, используя следующую команду:

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, и мое приложение обновит его конфигурацию. Тот же код из кубернетов с файлом из configmap, он не работает. Я читал другие вопросы по SOF подобные этому и другие, но ничего В частности, есть решение проблемы, с которой я сталкиваюсь.

Я понимаю, что файл (который поступает из configmap) является символической ссылкой, а фактический файл находится в папке с именем ..data/config.json. Я также попытался добавить этот файл, но все еще не получил сигнал fsnotify. Можно ли получить сигнал fsnotify для файлов, поступающих из configmap (а также секретов) в приложении? Если да, может ли кто-нибудь помочь мне и показать, как это сделать (желательно на языке GO)?


person Amudhan    schedule 16.01.2019    source источник


Ответы (2)


Возможно, у вас возникла проблема вроде этой < / а>:

Когда ConfigMap изменяется, реальный путь к файлам конфигурации, которые он содержит, изменяется, но это как бы «скрыто» двумя уровнями символических ссылок: [..]

Итак, похоже, вам нужно следить за цепочкой символических ссылок и следить за этим. Поскольку ваше приложение написано на go, вы можете просто использовать spf13/viper, поскольку функция WatchConfig и Kubernetes были добавлены.

В качестве альтернативы вы можете получать уведомления от Kubernetes API на изменения ConfigMap. Для этого, скорее всего, потребуется заранее настроить некоторые правила доступа .

person webwurst    schedule 06.03.2019
comment
Спасибо! Это именно то, что я хотел. Я еще не тестировал его, но он четко описывает проблему, с которой я столкнулся, и решает именно то, что нужно! Я использовал только библиотеку Viper, но использовал старую версию. Ссылка, на которую вы указали, дает правильную информацию и похоже, что все выпуски после 1.3.0 будут иметь эту функцию / исправление. - person Amudhan; 07.03.2019

Похоже, вы ищете Reloader. Он будет следить за configmap / secret и обновлять относящееся к нему развертывание.

person Cindy    schedule 18.01.2019
comment
Извините, но не. Я не хочу перезагружать развертывание / приложение. Я хочу, чтобы приложение получило уведомление, чтобы оно могло динамически обновлять свое состояние. - person Amudhan; 19.01.2019