Skip to content

更新 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
所有 Deploymentkubectl get deployments --all-namespaces
指定命名空间的 Deploymentkubectl 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)。