十一 配置信息容器化
k8s 提供了 configMap、secret 这两种特殊类型的存储卷,多数情况下不是为 POD 提供存储空间,而是为用户提供了从集群外部到 POD 内部注入配置信息的方式。
- 自定义命令行参数,例如:command、args,根据 args 传递不同的参数来将容器运行为不同的特性
- 直接把配置信息制作为 image 中,但是这种方式非常不灵活,这个镜像只能适用于一种使用场景,过度耦合
- 环境变量,Cloud Native 支持通过环境变量来加载配置,或者使用 ENTRYPOINT 脚本来预处理环境变量为配置信息
- 存储卷,在容器启动时候挂载一个存储卷,或者专用的配置存储卷,挂载到应用程序的配置文件目录
11.1 POD 获取环境变量
- env,详见:kubectl explain pods.spec.containers.env
11.2 configMap
假如我们现在要启动一个 POD ,这个 POD 启动时候,需要读取不同的配置信息,那么我们有两种方式:
- 可以将 configMap 资源关联到当前 POD 上,POD 从 configMap 读取一个数据,传递给 POD 内部容器的一个变量,变量被注入后,可以重启容器。
- 可以将 configMap 资源挂载到当前 POD 上,作为一个文件系统的路径,这个目录正好是应用程序读取配置文件的路径,容器就可以读取到配置信息了,当 configMap 修改了,那么就会通知 POD ,POD 可以进行重载配置。
在每个 configMap 中所有的配置信息都保存为键值的配置形式。
- 清单格式,详见:kubectl explain configMap
11.2.1 注入 POD ENV
- 创建 ConfigMap 并在 POD ENV 中使用
11.2.2 挂载为 POD 卷
- configMap 中的数据可以在容器内挂载为文件,并且当 configMap 中的数据发生变动的时候,容器内的文件相应也会发生变动,但不会重载容器内的进程。
11.3 secret
configMap 是明文存储数据的,如果需要存储敏感数据,则需要使用 secret ,secret 与 configMap 的作用基本一致,且 secret 中的数据不是明文存放的,而是 base64 编码保存的。
- 清单格式,详见:kubectl explain secret
11.3.1 私有仓库认证1
- POD 创建时候,从 docker hub 拉取镜像使用的用户名密码,kubectl explain pods.spec 的 imagePullSecrets 字段
11.3.2 私有仓库认证2
- 创建自定义的 serviceaccount 对象,在 serviceaccount 对象上定义 image pull secrets
- 创建 POD 使用指定的 serviceaccount 对象
11.3.3 创建 TLS 证书
- secret 中的数据可以在容器内挂载为文件,然后在 nginx 容器内使用证书文件