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
相关产品推荐
相关产品推荐

