Skip to content

更新 K3s 服务镜像

本页为完整操作手册(附件)。日常速查请看:K3s 常用命令

在 K3s 上把 Deployment 的容器镜像切到新版本。前提:新镜像已构建并推送到私有仓库。

流程概览

text
构建镜像 → 推送 Registry → 查命名空间 / Deployment / 容器名 → kubectl set image → 验证滚动更新

总览与架构见 首页


前置:生成并推送 Docker 镜像

在构建机完成镜像构建、打 tag、推送到私有仓库(示例仓库:`{ip:port}`)。

bash
# 示例:构建、打标签、推送(按实际 Dockerfile / 镜像名调整)
docker build -t solarsense/python-executor:3.11-fileopen-artifact-20260720 .
docker tag solarsense/python-executor:3.11-fileopen-artifact-20260720 \
  {ip:port}/solarsense/python-executor:3.11-fileopen-artifact-20260720
docker push {ip:port}/solarsense/python-executor:3.11-fileopen-artifact-20260720

确认各 K3s 节点能拉取该仓库(通常通过 /etc/rancher/k3s/registries.yaml 配置)。


第一步:获取命名空间

bash
# 查看所有命名空间
kubectl get namespaces

第二步:获取 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}'

进入pod运行 k3s kubectl exec -n {NAMESPACE} --stdin --tty {POD_NAME} -- /bin/bash

查看pod日志 k3s kubectl logs -n {NAMESPACE} --tail=100 {POD_NAME} -f

第四步:更新镜像

bash
kubectl set image deployment/{deployment名} {容器名}={新镜像} -n {命名空间}

实操示例

bash
kubectl set image deployment/python-executor-311 \
  executor={ip:port}/solarsense/python-executor:3.11-fileopen-artifact-20260720 \
  -n solarsense-wuhu

对应关系:

占位符示例值
{deployment名}python-executor-311
{容器名}executor
{ip:port}*.*.*.*:5001(私有仓库)
{新镜像}{ip:port}/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)。