You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes无法加载更新后的Docker镜像问题求助

问题:K8s Deployment无法加载Docker镜像的最新修改内容

我修改了项目文件并重新构建了Docker镜像,直接本地运行容器能看到修改后的内容,完全正常。但执行kubectl rollout restart deployment commands-depl重启K8s Deployment后,Pod里还是加载未修改的旧文件。甚至试过删除再重建Deployment:

kubectl delete deployment commands-depl
kubectl apply -f commands-depl.yaml

结果还是一样。我的Deployment YAML配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: commands-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: commandsservice
  template:
    metadata:
      labels:
        app: commandsservice
    spec:
      containers:
        - name: commandsservice
          image: img-commandsservice:latest

解决方案

核心原因

K8s默认会认为latest标签的镜像已经存在节点本地,不会主动拉取最新版本,除非明确配置拉取策略。

方法1:配置强制拉取策略(快速解决)

在Deployment的容器配置中添加imagePullPolicy: Always,让K8s每次启动Pod都重新拉取镜像:

spec:
  containers:
    - name: commandsservice
      image: img-commandsservice:latest
      imagePullPolicy: Always

更新配置后执行:

kubectl apply -f commands-depl.yaml
kubectl rollout restart deployment commands-depl

方法2:使用唯一版本标签(推荐长期方案)

放弃latest这种模糊标签,每次构建镜像时打上唯一标识(Git提交哈希、时间戳、语义化版本都可以):

# 构建带版本标签的镜像
docker build -t img-commandsservice:v1.0.1 .
# 推送到集群可访问的镜像仓库(如果用私有仓库需要配置密钥)
docker push img-commandsservice:v1.0.1

修改Deployment YAML中的镜像标签:

image: img-commandsservice:v1.0.1

应用配置后,K8s会自动识别标签变化,触发滚动更新加载新镜像。

方法3:手动清理节点旧镜像(临时应急)

如果是单节点测试集群,可以登录节点删除旧镜像后重启Pod:

# 删除本地旧镜像
docker rmi img-commandsservice:latest
# 删除现有Pod让K8s重新拉取镜像
kubectl delete pod $(kubectl get pods -l app=commandsservice -o jsonpath='{.items[0].metadata.name}')

这个方法仅适合单节点场景,多节点集群不建议使用。


内容的提问来源于stack exchange,提问作者Peter Chovanec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:22:07