注入方式是什么
把 Secret 送进容器有两条路径:env.valueFrom.secretKeyRef 精确挑某一个键,envFrom.secretRef 把 Secret 里所有键一次性注入。注入后凭据以环境变量形式存在于容器进程中,任何能进入容器执行命令的人、任何会打印环境的程序都能读到,因此它能解决「配置怎么传进去」,但不解决「凭据怎么少暴露」。
基本信息
| 精细注入 | env[].valueFrom.secretKeyRef(name + key) |
|---|---|
| 批量注入 | envFrom[].secretRef(整个 Secret 的键值) |
| 键名规则 | envFrom 的键必须是合法的环境变量名,含点或横线时会跳过 |
| 生效时机 | 容器创建时注入,之后改 Secret 不会更新变量 |
| 刷新方式 | 删 Pod 重建或触发滚动更新 |
典型使用场景
- 数据库连接:把地址、账号、口令分别注入 DB_HOST、DB_USER、DB_PASSWORD 三个变量
- 第三方 API Key:调用外部服务时通过变量传入,避免写进镜像与代码库
- 镜像私有仓库凭据:与 imagePullSecrets 配合,不把凭据固化在节点上
- 兼容旧应用:应用只支持读环境变量时用它过渡,同时规划迁移到配置文件或卷挂载
- 多环境复用同一镜像:镜像不变,仅靠不同命名空间的 Secret 注入不同环境凭据
两种注入写法
两种注入写法
containers:
- name: app
image: registry.example.com/app:1.26.0
env:
- name: DB_PASSWORD # 只注入指定键,变量名可自定义
valueFrom:
secretKeyRef:
name: db-pass
key: password
optional: false # 键不存在时让 Pod 直接启动失败,而非静默缺值
envFrom:
- secretRef:
name: db-pass # 该 Secret 所有键批量注入
prefix: DB_ # 加前缀避免与其他变量撞名验证注入结果
验证注入结果
kubectl exec -it web-x -- env | grep -c '^DB_' # 只数个数,不要把值打印出来
kubectl get pod web-x -o jsonpath='{.spec.containers[0].env[*].name}'
kubectl describe pod web-x | sed -n '/Environment:/,/Mounts:/p' # 可见变量名,Secret 值显示为引用注入方式对比
| 方式 | 更新是否自动生效 | 被谁可见 |
|---|---|---|
| env(secretKeyRef) | 不生效,必须重建 Pod | 容器内所有进程、任何能 exec 的人 |
| envFrom(secretRef) | 不生效,必须重建 Pod | 同上,且键名会一次性铺开 |
| 卷挂载 Secret | 挂载内容会随对象更新(秒级到分钟级) | 只有能读该文件路径的进程 |
| 应用自己调 API | 实时 | 进程需持有可读 Secret 的权限,风险更高 |
环境变量注入的 Secret 不会出现在 kubectl describe pod 的明文里,但容器内所有进程、崩溃转储、/proc 下的环境都能读到。凭据轮换时记得配合滚动重启,否则旧变量会一直留在运行中的容器里。
envFrom 遇到键名不是合法环境变量名(含点、横线等)时会跳过并记录事件,排查「变量没生效」时先确认键名格式;同时注意 envFrom 会把 Secret 的全部键暴露给容器,多余键应清理。