Как получить уведомление внутри приложения в kubernetes при обновлении configmaps - PullRequest
0 голосов
/ 16 января 2019

У меня есть приложение, работающее внутри 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)?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Возможно, у вас возникла проблема , например, :

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

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

В качестве альтернативы вы можете получить уведомление отAPI Kubernetes на изменениях ConfigMap .Это требует настройки некоторых правил доступа с наибольшей вероятностью.

0 голосов
/ 18 января 2019

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

...