更新配置映射后如何在kubernetes中的应用程序内部获取通知

时间:2019-01-16 15:17:22

标签: go kubernetes configmap

我有一个在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编辑configmap并更改内容,则在pod中运行的应用程序不会收到文件更改通知。我正在为该应用程序使用GO Lang,即使我看到编辑后文件已更改,它也没有在文件/myapp/config/config.json上收到fsnotify。

当然,如果我在笔记本电脑上运行相同的应用程序,则代码会得到fsnotify,并且我的应用程序会更新其配置。来自kubernetes的相同代码与来自configmap的文件相同,它不起作用。我已经阅读了其他SOF问题like this和其他各种问题,但是没有什么可以解决我面临的问题。

我知道该文件(来自configmap)是一个符号链接,实际文件位于名为..data/config.json的文件夹中。我也尝试添加该文件,但仍然没有收到fsnotify信号。是否有可能从应用程序中的configmap(以及机密文件)获取fsnotify信号?如果是这样,有人可以帮助我并演示如何做到这一点(最好在GO lang中)?

2 个答案:

答案 0 :(得分:1)

您可能遇到问题like this

  

当ConfigMap更改时,它所包含的配置文件的真实路径也会更改,但这有点被2个级别的符号链接“隐藏”:[..]

因此,您似乎需要遵循符号链接链并加以注意。由于您的应用是用go编写的,因此您可以使用spf13/viper,因为已添加了功能WatchConfig and Kubernetes

或者,您可以在changes of a ConfigMap上通过Kubernetes API收到通知。这很可能需要预先配置一些access rules

答案 1 :(得分:0)

您正在寻找类似Reloader的声音。它将监视configmap / secret并更新与其相关的部署。