注入环境变量是什么
把配置对象里的内容以环境变量形式注入容器,有两种写法:一种逐个键指定,在变量名与对象键名不一致时更灵活;另一种把对象里的所有键一次性注入,适合配置项较多的场景。注入发生在容器创建的那一刻,之后对象再更新也不会反映到已经运行的环境变量上。
哪些键会被跳过
环境变量名有字符集限制,而对象键名允许包含连字符与点号。键名不符合变量命名规则时不会报错,而是被静默跳过,应用读不到变量后表现为配置缺失,排查时容易怀疑对象本身而不是键名。配置项较多时优先考虑以文件方式挂载。
基本信息
| 适用环境 | 任何 Kubernetes 发行版 |
|---|---|
| 逐键写法 | 指定来源对象与键名,可自定义变量名 |
| 整集写法 | 把对象里所有键注入为变量 |
| 可选项 | 可标记允许对象不存在,缺失时不阻止启动 |
| 生效时机 | 容器创建时注入一次 |
| 更新行为 | 对象更新后已运行的容器不会变化 |
典型使用场景
- 常规参数注入:日志级别、连接串、功能开关这类小配置
- 批量注入:配置项较多时一次性注入整个对象
- 环境差异化:不同环境使用不同对象承载取值
- 可选配置:允许对象缺失以支持默认值兜底
- 敏感项的替代:需要保密时改用密钥对象并采用同样写法
- 迁移过渡:从环境变量迁移到文件挂载过程中先并行使用
两种写法
两种写法
containers:
- name: app
image: registry.example.com/app:1.26.0
env:
- name: LOG_LEVEL # 自定义变量名
valueFrom:
configMapKeyRef:
name: app-config
key: log-level # 对象里的键名
envFrom:
- configMapRef:
name: app-config # 一次性注入该对象的全部键
- configMapRef:
name: feature-flags
optional: true # 对象不存在也不阻止启动验证注入结果
验证注入结果
kubectl exec -it web-x -- env | grep -E 'LOG_LEVEL|MAX_CONN' # 看变量是否注入
kubectl get cm app-config -o jsonpath='{.data}' # 对照对象的键名
kubectl describe pod web-x | grep -A12 Environment # 看注入来源解析
kubectl get events --field-selector involvedObject.name=web-x | tail -5两种写法对照
| 写法 | 适用场景 | 注意 |
|---|---|---|
| 逐键注入 | 需要改变量名或只取部分键 | 键名写错会导致容器无法启动 |
| 整集注入 | 配置项多、希望少写模板 | 键名不合法时会被静默跳过 |
| 标记可选项 | 对象可能缺失的场景 | 缺失后应用需自身兜底默认值 |
| 引用密钥对象 | 包含敏感内容时 | 写法相同,来源对象不同 |
同名变量同时出现时,显式逐键声明的优先级高于整集注入的写法。
环境变量在容器创建时注入一次,更新对象后必须重建实例才能生效,用子路径挂载的单个文件同样如此。