更新 K3s 服务镜像
在 K3s 上把 Deployment 的容器镜像切到新版本。前提:新镜像已构建并推送到私有仓库。
流程概览
text
构建镜像 → 推送 Registry → 查命名空间 / Deployment / 容器名 → kubectl set image → 验证滚动更新总览与架构见 首页。
前置:生成并推送 Docker 镜像
在构建机完成镜像构建、打 tag、推送到私有仓库(示例仓库:192.168.4.50:5001)。
bash
# 示例:构建、打标签、推送(按实际 Dockerfile / 镜像名调整)
docker build -t solarsense/python-executor:3.11-fileopen-artifact-20260720 .
docker tag solarsense/python-executor:3.11-fileopen-artifact-20260720 \
192.168.4.50:5001/solarsense/python-executor:3.11-fileopen-artifact-20260720
docker push 192.168.4.50:5001/solarsense/python-executor:3.11-fileopen-artifact-20260720确认各 K3s 节点能拉取该仓库(通常通过 /etc/rancher/k3s/registries.yaml 配置)。
第一步:获取命名空间
bash
# 查看所有命名空间
kubectl get namespaces
# 简写
kubectl get ns
# 查看当前默认命名空间
kubectl config view --minify -o jsonpath='{.contexts[0].context.namespace}'第二步:获取 Deployment 名
bash
# 所有命名空间的 Deployment
kubectl get deployments --all-namespaces
# 指定命名空间
kubectl get deployments -n <命名空间>
# 含节点等详细信息
kubectl get deployments -n <命名空间> -o wide第三步:获取容器名
bash
# 方法 1:从 Deployment 读容器名
kubectl get deployment <deployment名> -n <命名空间> \
-o jsonpath='{.spec.template.spec.containers[*].name}'
# 方法 2:从 Pod 列出容器名(更直观)
kubectl get pods -n <命名空间> \
-o=custom-columns=POD:.metadata.name,CONTAINERS:.spec.containers[*].name
# 方法 3:容器名 + 当前镜像一次看清
kubectl get pods -n <命名空间> \
-o=custom-columns=POD:.metadata.name,CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image
# 方法 4:按 label 取某 Deployment 下 Pod 的容器名
kubectl get pods -n <命名空间> -l app=<label值> \
-o jsonpath='{.items[0].spec.containers[*].name}'第四步:更新镜像
bash
kubectl set image deployment/<deployment名> <容器名>=<新镜像> -n <命名空间>实操示例
bash
kubectl set image deployment/python-executor-311 \
executor=192.168.4.50:5001/solarsense/python-executor:3.11-fileopen-artifact-20260720 \
-n solarsense-wuhu对应关系:
| 占位符 | 示例值 |
|---|---|
<deployment名> | python-executor-311 |
<容器名> | executor |
<新镜像> | 192.168.4.50:5001/solarsense/python-executor:3.11-fileopen-artifact-20260720 |
<命名空间> | solarsense-wuhu |
第五步:验证更新
bash
# 等待滚动更新完成
kubectl rollout status deployment/<deployment名> -n <命名空间>
# 查看 Pod 与镜像是否已切换
kubectl get pods -n <命名空间> -o wide
kubectl get deployment <deployment名> -n <命名空间> \
-o jsonpath='{.spec.template.spec.containers[*].image}{"\n"}'
# 如有问题,回滚到上一版本
kubectl rollout undo deployment/<deployment名> -n <命名空间>快速命令速查表
| 需要的信息 | 命令 |
|---|---|
| 所有命名空间 | kubectl get ns |
| 所有 Deployment | kubectl get deployments --all-namespaces |
| 指定命名空间的 Deployment | kubectl get deployments -n <命名空间> |
| Deployment 的容器名 | kubectl get deployment <deployment名> -n <命名空间> -o jsonpath='{.spec.template.spec.containers[*].name}' |
| Deployment 的当前镜像 | kubectl get deployment <deployment名> -n <命名空间> -o jsonpath='{.spec.template.spec.containers[*].image}' |
| 一次性总览 | 见下方 |
一次性获取全部信息:
bash
kubectl get deployments --all-namespaces \
-o=custom-columns=\
NAMESPACE:.metadata.namespace,\
DEPLOYMENT:.metadata.name,\
CONTAINER:.spec.template.spec.containers[*].name,\
IMAGE:.spec.template.spec.containers[*].image说明:总览表里命名空间字段应对应
.metadata.namespace(不是 Deployment 自身的.metadata.name)。