Google Cloud Kubernetes集群Pod未更新问题求助
问题排查与解决方案
核心原因分析
你的问题本质是Kubernetes未触发Pod滚动更新,即便你更新了index.html并重新构建镜像,仍无法看到页面变化,根源在于:
- 始终使用固定镜像标签
1.0,Deployment的Pod模板配置未发生变化,kubectl apply不会触发更新 - 手动执行
kubectl rollout restart deploy app后,可能存在镜像拉取失败或浏览器缓存未清除的问题
具体修复步骤
1. 改用动态唯一镜像标签
每次CI构建使用唯一标签(如Git Commit哈希、CI流水线ID),让Deployment检测到Pod模板变化,自动触发滚动更新。
修改.gitlab-ci.yml的构建阶段:
stages: - build - deploy_gcp build_images: stage: build image: docker:20.10.16 services: - docker:20.10.16-dind variables: DOCKER_TLS_CERTDIR: "/certs" before_script: - docker login -u $REGISTRY_USER -p $REGISTRY_PASS script: # 用Git短哈希作为镜像标签,确保每次构建唯一 - IMAGE_TAG=$CI_COMMIT_SHORT_HASH - docker build -t guirms/app-cicd-dio:$IMAGE_TAG app/. - docker push guirms/app-cicd-dio:$IMAGE_TAG # 将标签传递给部署阶段 - echo "IMAGE_TAG=$IMAGE_TAG" >> deploy.env artifacts: reports: dotenv: deploy.env deploy_gcp: stage: deploy_gcp needs: [build_images] before_script: - chmod 400 $SSH_KEY script: - ssh -o StrictHostKeyChecking=no -i $SSH_KEY gcp@$SSH_SERVER "sudo rm -Rf ./ci-cd-kubernetes/ && sudo git clone https://gitlab.com/guirms/ci-cd-kubernetes.git && cd ci-cd-kubernetes && sudo chmod +x ./script.sh && ./script.sh $IMAGE_TAG"
修改script.sh动态替换镜像标签:
#!/bin/bash IMAGE_TAG=$1 # 替换deployment.yml中的固定标签为动态标签 sed -i "s/girms\/app-cicd-dio:1.0/girms\/app-cicd-dio:$IMAGE_TAG/" deployment.yml kubectl apply -f deployment.yml
2. 验证镜像拉取与Pod状态
执行以下命令确认Pod是否成功更新:
# 查看Deployment滚动更新进度 kubectl rollout status deploy app # 检查Pod使用的镜像版本 kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}' # 查看Pod日志排查启动问题 kubectl logs <目标Pod名称>
3. 清除缓存影响
- 浏览器缓存:强制刷新页面(Windows/Linux:
Ctrl+F5,Mac:Cmd+Shift+R) - Apache服务端缓存:修改Dockerfile添加禁用缓存配置:
FROM httpd:latest WORKDIR /usr/local/apache2/htdocs/ COPY index.html /usr/local/apache2/htdocs/ # 添加禁用缓存的Apache配置 RUN echo "Header set Cache-Control 'no-cache, no-store, must-revalidate'" >> /usr/local/apache2/conf/httpd.conf RUN echo "Header set Pragma 'no-cache'" >> /usr/local/apache2/conf/httpd.conf RUN echo "Header set Expires '0'" >> /usr/local/apache2/conf/httpd.conf EXPOSE 80
4. 确认rollout restart生效(临时方案)
若暂时不想修改标签策略,执行kubectl rollout restart deploy app后,检查Pod是否重建:
# 按创建时间排序查看Pod,确认是否有新Pod启动 kubectl get pods --sort-by=.metadata.creationTimestamp
若Pod未重建,执行kubectl describe deploy app查看事件日志,排查配置错误。
内容的提问来源于stack exchange,提问作者guirms
相关产品推荐
相关产品推荐

