Appearance
ConfigMap、Secret、Volume 和环境变量怎么选
这几个概念最容易混,是因为它们都能把“外部配置”交给容器。但真正决定选型的,不是名字,而是数据是否敏感、是否需要文件形态、是否要求热更新。
先说结论
- 普通文本配置优先用 ConfigMap
- 敏感信息优先用 Secret
- 需要以文件形式挂载时,用 Volume 挂 ConfigMap 或 Secret
- 只适合少量、稳定、启动时读取一次的配置,才优先考虑环境变量
核心边界
ConfigMap 适合什么
ConfigMap 适合放非敏感配置,比如开关项、地址、线程池参数、日志级别、业务阈值。它的优点是和应用解耦,改配置不必重做镜像。
Secret 适合什么
Secret 适合数据库密码、AK/SK、证书、Token 这类敏感信息。它不是绝对安全,只是比明文写进镜像、环境变量或代码里更规范。真正安全还要结合 RBAC、加密存储和最小权限。
Volume 解决什么问题
Volume 不是配置类型,而是挂载方式。应用如果要求读取证书文件、YAML 文件、Key 文件,就要通过 Volume 把 ConfigMap 或 Secret 以文件形式挂进去。
环境变量什么时候更合适
环境变量适合数量少、格式简单、应用启动后不会频繁变化的配置。比如运行环境标识、端口号、少量开关值。它的优点是简单,但复杂配置会变得难维护。
实战里怎么选
先看配置是否敏感
敏感就走 Secret,不敏感再考虑 ConfigMap。
再看应用读取方式
应用只认文件,就挂 Volume;应用只在启动时读简单键值,用环境变量更直接。
最后看是否需要动态生效
如果配置会频繁调整,尽量不要全部塞进环境变量。因为环境变量通常要重启 Pod 才能生效,而文件挂载配合应用热加载更灵活。
常见误区
把所有配置都放环境变量
前期方便,后期会非常乱,尤其是配置项多、层级深的时候。
觉得 Secret 天然足够安全
Secret 只是基础设施提供的标准载体,不代表已经完成了权限治理和审计。
直接把整份配置文件打进镜像
这样会让环境差异和镜像版本耦合,发布和回滚都更麻烦。
一句话总结
先分敏感与否,再看是键值还是文件,最后判断要不要热更新,这三步基本就能把 ConfigMap、Secret、Volume 和环境变量用对。