乐趣区

kubernetes-configmap热加载

在 kubernetes 中,configmap 的用途用来传递参数给应用,主要的用法:
1、使用 configmap 挂载 env
2、使用 configmap 挂载 volume
具体的 yaml 文件不写了,具体的可以搜索一下
使用上述两种方法给应用传递参数之后,会有两种结果:
第一种:使用 env 方式挂载的 configmap,在 configmap 更改之后,再次去查看变量的值,此时,变量的值是没有改变的。
第二种:使用 volume 的方式挂载 configmap 之后,当 configmap 更新之后,变量的值会发生变化,但是中间会存在一定的时间间隔,大约是 10 左右,这主要是因为 kubelet 对 pod 的同步间隔是 10 秒,另外需要注意的是当使用 subpath 将 configmap 中的某个文件单独挂载到目录下,那这个文件是无法热更新的,这是 configmap 本身的逻辑决定的。

上述两种方式配置参数的方式可以根据自己的需要进行选择,如果对实时性没有要求可以使用 volume 进行挂载。当参数更新之后并不代表业务逻辑更新了,需要通知业务重新通知业务进行逻辑上的更新。

应用本身可能不存在热加载的逻辑,可能要考虑别的方式来对配置参数进行热加载:
第一种:使用 sidecar 方式来对配置参数监听,然后根据各自应用本身业务的逻辑来对参数进行热架子啊
第二种:不适用上述 sidecar 的方式,直接将主进程和 sidecar 进程打进同一个镜像中,然后进行热加载
第三种:应用本身监听配置的变化,在逻辑中处理热加载或者是使用第三方封装好的库。

上述方式可能会存在这样那样的限制,换一种解决思路就是对应用进行滚动更新操作,当 pod 发生滚动更新时,配置参数肯定会重新进行加载,这样就可以保证配置参数更新了,滚动更新实现方式:可以在 yaml 文件中添加 annotation,每次更新参数时,更新该注解,也可以在 CI 流程中实现(将 configmap 计算一个 hash 值,每次更新都会改变,然后触发滚动更新操作)

参考链接:
https://aleiwu.com/post/confi…
https://jimmysong.io/kubernet…

退出移动版