一、核心用法
这个命令的核心逻辑是:
kubectl set image <资源类型>/<资源名> <容器名>=<新镜像地址> [选项]简单说就是 “告诉 K8s,把某个资源里的某个容器,换成新的镜像”。1. 基础语法(最常用)
bash
运行
# 更新 Deployment 中的容器镜像
kubectl set image deployment/<deployment名> <容器名>=<新镜像>:<版本># 示例:把名为 nginx-deploy 的 Deployment 里的 nginx 容器,换成 1.25 版本镜像
kubectl set image deployment/nginx-deploy nginx=nginx:1.25
2. 进阶用法
bash
运行
# 一次性更新多个容器的镜像(多个容器用空格分隔)
kubectl set image deployment/app-deploy app=myapp:v2 mysql=mysql:8.0# 更新 DaemonSet/StatefulSet (语法和 Deployment 一致)
kubectl set image daemonset/node-agent agent=node-agent:v1.3
kubectl set image statefulset/redis redis=redis:7.0# 从文件读取镜像更新(适合批量操作)
kubectl set image -f deployment.yaml app=myapp:v3# 查看更新后的镜像(验证用)
kubectl set image deployment/nginx-deploy --list
二、关键细节(避坑指南)
- 必须匹配容器名:
<容器名>要和 Deployment/YAML 里定义的spec.containers.name完全一致,否则会报错 “容器不存在”。 - 自动触发滚动更新:更新 Deployment 镜像后,K8s 会自动触发滚动更新,逐步替换旧 Pod,不中断服务(前提是配置了合理的副本数和更新策略)。
- 支持镜像简写:如果镜像地址和旧镜像一致,只改版本,可简写为
容器名=:新版本(比如nginx=:1.26)。 - 回滚超简单:如果更新后出问题,用
kubectl rollout undo deployment/nginx-deploy一键回滚到上一个版本。
三、实操示例(新手友好)
假设你有一个名为
todo-app 的 Deployment,里面有两个容器:frontend(前端)和 backend(后端),现在要把后端镜像从 todo-backend:v1 更改为 todo-backend:v2:bash
运行
# 1. 执行镜像更新
kubectl set image deployment/todo-app backend=todo-backend:v2# 2. 查看更新进度(确认滚动更新是否正常)
kubectl rollout status deployment/todo-app# 3. 验证镜像是否更新成功
kubectl get pods -l app=todo-app -o jsonpath='{range .items[*]}{.spec.containers[1].image}{"\n"}{end}'
# 输出应该是 todo-backend:v2
四、和编辑 YAML 的对比
| 方式 | 优点 | 缺点 |
|---|---|---|
kubectl set image |
无需改文件、一键操作、速度快 | 仅能改镜像,无法调整其他配置 |
| 编辑 YAML + apply | 可同时调整镜像和其他配置 | 步骤多,需编辑 / 保存 / 应用文件 |
总结
kubectl set image是 K8s 中免改文件快速更新容器镜像的核心命令,语法为kubectl set image <资源类型>/<资源名> <容器名>=<新镜像>;- 执行后会自动触发 Deployment 滚动更新,更新失败可通过
kubectl rollout undo快速回滚; - 适合临时、快速的镜像版本切换,若需调整镜像外的配置(如资源限制),建议编辑 YAML 文件。