命令定位
kubectl set env 直接给工作负载增删改容器环境变量,并支持从 ConfigMap、Secret 整批注入。适用平台是 Kubernetes,支持 Deployment、StatefulSet、DaemonSet、Job 等带 Pod 模板的资源。改动落到 Pod 模板上,因此会触发一次滚动更新——这点和其他 kubectl set 子命令一致,是它既方便又容易引发意外发布的原因。
基本信息
| 适用平台 | Kubernetes(Deployment / StatefulSet / DaemonSet / Job / CronJob) |
|---|---|
| 语法 | kubectl set env <资源>/<名称> KEY=VALUE | KEY- | --from=configmap/<名> | --from=secret/<名> |
| 生效方式 | 修改 Pod 模板并触发滚动更新,运行中的旧 Pod 按发布策略逐步替换 |
| 权限要求 | 对工作负载的 patch 权限 |
典型使用场景
- 临时调日志级别:把 LOG_LEVEL 从 info 改成 debug,重启后生效,方便定位问题
- 切换配置来源:--from=configmap/app-config 把整份配置注入为环境变量
- 按需挑选键:用 --keys 从 ConfigMap 或 Secret 里只注入指定的几个变量
- 清理废弃变量:用 KEY- 删掉历史遗留的环境变量,避免与默认值冲突
- 应急关闭特性:通过开关变量快速回退某个功能,无需改镜像
常用示例
常用示例
kubectl set env deploy/web LOG_LEVEL=debug # 新增或覆盖单个变量
kubectl set env deploy/web LOG_LEVEL- # 删除变量
kubectl set env deploy/web --from=configmap/app-config # 整份 ConfigMap 注入
kubectl set env deploy/web --from=secret/db-pass --keys=DB_HOST,DB_PORT # 只挑指定键
kubectl set env deploy/web --list # 列出当前变量,核对结果
kubectl rollout status deploy/web --timeout=180s # 确认滚动更新完成生效与优先级
| 情形 | 行为 | 注意 |
|---|---|---|
| 显式 env 与 envFrom 同名 | 显式 env 优先 | 排查「值没变」先看这条 |
| --from 注入的键 | 生成 env 引用,值来自 ConfigMap/Secret | 对象不存在时 Pod 起不来,报 CreateContainerConfigError |
| 运行中的旧 Pod | 不会自动更新 | 等滚动更新或手动 rollout restart |
| KEY- 删除 | 按前缀匹配键名 | 前缀相近的变量可能被一并删除 |
环境变量在容器创建时读取一次,改完 ConfigMap 内容并不会更新已运行容器的变量值,这是与卷挂载最本质的区别。
set env 会触发滚动发布,在副本少、探针严格或没有 PDB 的服务上可能造成短暂不可用,生产变更前确认可用性冗余。
与清单配置的关系
- 命令式改动的结果会体现在 Pod 模板里,建议随后用 kubectl get deploy -o yaml 导出并回写清单
- 若 CD 工具会整体 apply 清单,下次同步可能把这次改动覆盖掉,重要变更要尽快固化
- 生产推荐做法:把变量集中放在 ConfigMap,通过 envFrom 引用,改配置只动一层
- 敏感值不要写在命令历史里,用 --from=secret 引用,避免 token 留在 shell history