配置管理需解决的问题:
- 可变的配置参数如何打包到镜像中
- 敏感信息防止泄露,如密码、密钥等
- 每次配置更新都要重新打包,镜像版本过多也给镜像存储管理带来负担
- 定制化太严重、可扩展能力差,且不容易复用
ConfiMap
- 作用:主要用来保存一些非敏感数据,如环境变量、命令行参数或挂载到存储卷中。
- ConfigMap通过键值对来存储信息,是个namespace级别的资源,kubectl操作时可简写成cm
- 元数据使用data: 后跟相关键值
- 支持键值对(值是数字需用双引号,即需用字符串来表示)、多行的文本(键后使用| 跟多行文本)
1 | $ cat cm-demo-mix.yaml |
可以通过kubectl create cm基于目录、文件或者字面值来创建。
1 | kubectl create configmap <map-name> <data-source> |
基于目录创建ConfigMap
1 | 使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 |
1 | # 创建本地目录 |
1 | kubectl get configmaps game-config -o yaml |
基于文件创建ConfigMap
1 | # 可以使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap。 |
Pod 必须和 ConfigMap 在同一个 namespace 下面;
在创建 Pod 之前,请务必保证 ConfigMap 已经存在,否则 Pod 创建会报错
ConfigMap的几大使用场景
- 命令行参数
- 环境变量,可以只注入部分变量,也可全部注入
- 挂载文件,可以是单个文件也可以是所有键值对,用每个键值作为文件名。
1 | $ cat cm-demo-pod.yaml |
Secret
- 用secret保存一些敏感数据信息,比如密码、密钥、token等
- 用法和ConfigMap基本一致,都可以用作环境变量或者文件挂载
1 | # 使用kubectl来创建secret,支持三种类型 |
1 | # 创建一个secret来保存私有容器仓库的身份信息 |
1 | # 平时使用较为广泛的还有另外一种Opaque类型的 Secret |
1 | # 在pod中使用secret |
写在最后
1 | ConfigMap 和 Secret 是 Kubernetes 常用的保存配置数据的对象,你可以根据需要选择合适的对象存储数据。 |
- 如果业务自身支持reload,可直接定期进行reload(可以配合readlinessProbe一起使用)。比如nginx -s reload可以通过inotify感知到文件更新。
- 如果业务没上述能力,可以采用滚动升级的方式。借助开源工具Reloader,一旦发现configmap和secret更新就自动触发对deployment或statefulset等工作负载对象进行滚动升级。 (https://github.com/stakater/Reloader)