如何在 Kubernetes 应用程序内部收到配置映射更新通知

9

我有一个应用程序在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 语言编写应用程序,即使我可以看到编辑后文件已更改,但它也无法接收到文件 /myapp/config/config.json 上的 fsnotify 事件。
如果我在笔记本电脑上运行相同的应用程序,当然,代码会得到 fsnotify 并更新配置。但是,从 kubernetes 中运行相同的代码,使用来自 configmap 的文件,它不起作用。我已经阅读了其他类似于这样的 SOF 问题(例如)以及其他各种问题,但没有一个专门针对我面临的问题提供解决方案。
我理解来自 configmap 的文件(符号链接)实际上位于名为 ..data/config.json 的文件夹中。我尝试添加该文件,但仍未收到 fsnotify 信号。是否可能在应用程序内获取来自 configmap(以及 secrets)的文件的 fsnotify 信号?如果可以,请有人帮忙并展示如何实现(最好使用 GO 语言)。
2个回答

6
您可能会遇到类似这样的问题

当ConfigMap更改时,它包含的配置文件的实际路径也会更改,但这种情况被两级符号链接“隐藏”了:[..]

因此,似乎您需要跟踪符号链接链并对其进行监视。由于您的应用程序是使用go编写的,因此您可以使用spf13/viper,因为已添加了功能WatchConfig and Kubernetes
或者,您可以通过Kubernetes API在更改ConfigMap时收到通知。这需要预先配置一些访问规则

2
谢谢!这正是我想要的。我还没有测试过,但它清楚地描述了我所面临的问题并解决了确切的事情!我只使用了Viper库,但是使用的是旧版本。你指出的链接提供了正确的信息,并且看起来1.3.0之后的所有版本都将具有此功能/修复。 - Amudhan
我如何使用 shell 实现这个,我不熟悉 Go? - focus zheng

2
听起来 Reloader就是你要找的工具。它会监视configmap/secret并更新与其相关的deployment。

2
抱歉,不行。我不想重新加载部署/应用程序。我希望应用程序能够收到通知,以便它可以对其状态进行一些动态更新。 - Amudhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接