我有一个在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中)?
答案 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并更新与其相关的部署。