go – 当configmaps更新时,如何在kubernetes中获取应用程序内的通知

我有一个在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>我可以看到该文件.如果我使用kubectl编辑configmap my-config编辑配置图并更改内容,则在我的pod中运行的应用程序不会获得文件更改通知.我正在使用GO Lang进行应用程序,它没有收到文件/myapp/config/config.json上的fsnotify,即使我可以看到编辑后文件已更改.

如果我在我的笔记本电脑中运行相同的应用程序,当然,代码获取fsnotify并且我的应用程序更新它的配置.来自kubernetes的相同代码,来自configmap的文件,它不起作用.我已经阅读了其他SOF问题like this和其他各种问题,但没有具体解决我面临的问题.

据我所知,该文件(来自configmap)是一个符号链接,实际文件位于一个名为..data / config.json的文件夹中.我也尝试添加该文件,但仍未获取fsnotify信号.是否有可能获得来自应用程序中的configmap(以及机密)的文件的fsnotify信号?如果是这样,有人可以帮助我并说明如何做(最好是在GO朗)?

最佳答案 您可能遇到问题
like this

When a ConfigMap changes, the real path to the config files it contains changed, but this is kinda “hidden” by 2 levels of symlinks: [..]

因此,似乎您需要遵循符号链接链并观察它.由于您的应用程序是用go编写的,因此您可以使用spf13/viper,因为添加了功能WatchConfig and Kubernetes.

或者,您可以在changes of a ConfigMap获得Kubernetes API的通知.这需要最先配置一些access rules.

点赞