首页/云/Kubernetes 速查/Secret 注入环境变量
配置与存储54 条

Secret 注入环境变量

用 valueFrom.secretKeyRef 或 envFrom.secretRef 把凭据注入变量;环境变量可见于进程环境与部分运行时接口,敏感场景优先卷挂载。

Kubernetes 速查云更新于 2026-10-13

注入方式是什么

把 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 的全部键暴露给容器,多余键应清理。

易错点

  • 改完 Secret 直接等应用生效:环境变量在容器创建时就固定,不滚动重启永远读不到新口令
  • 排查时 printenv 后把输出贴到工单或聊天里:凭据以明文泄露,且往往长期留在记录系统中
  • secretKeyRef 不设 optional 又不检查事件:键名写错时容器直接启动失败,报错信息指向 Key 不存在而非配置问题
  • 多个 Secret 用 envFrom 批量注入且键名重叠:后写的覆盖先写的,凭据用错却看不出任何报错

数据来源与参考

  • Kubernetes 官方文档 · Secrets(以环境变量使用)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌