Kubernetes 定义了一种 ConfigMaps 对象,用来分离 Pod / 容器和它的运行配置,比如你可以在测试环境和生产环境用同个 pod 模板来运行 pod,但是使它们所使用的配置不同。
创建一个 ConfigMaps 对象,在里面定义一组 k-v 对,然后就可以通过环境变量或者 Volumn 中的文件形式供 pod 使用。
一个常见的混淆点是:如果你在某个 k-v 对中,value 使用的是某个文件的内容,即使这个文件是 JSON / YAML 这类结构化数据,Kubernetes 也不会去解析它。它只会把文件内容变成环境变量的值 / Volumn 中的文件,给到 pod 中的应用程序去解析。
Kubernetes 至今(2021 年 6 月)并未提供一种机制,在 ConfigMaps 内容变化时通知容器进程。除非你的容器进程直接访问 kube-api-server(不合理的做法)。
ConfigMaps 的用法很简单,查查文档即可。
你需要慎重考虑修改 ConfigMaps 的影响:
- 如果 Pod 以 mount 一个目录的形式来使用,里面的文件内容会发生改变
- 假如此时你的 Pod 并没有自动用上新内容,有可能使得开发者进入容器内部时有所疑惑,发现容器行为跟配置文件不一致。k8s 在 1.19 版本引入了 immutable ConfigMap 来避免这个问题
- 配置的生效需要一段时间,可能有一段时间内不同 pod 的配置不一样