GKE Deployment未自动更新镜像:推新GCR镜像后无变化求助
问题描述
我有一个GitHub Workflow用于构建镜像并推送到GCR,步骤如下:
steps: # Checkout the repository to the GitHub Actions runner - name: Checkout uses: actions/checkout@v2 - uses: 'google-github-actions/auth@v1' with: credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }} export_default_credentials: true - name: Configure Docker run: gcloud auth configure-docker --quiet - name: Build Docker image in prod run: docker build . --tag gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:latest - name: Push Docker image in prod run: docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:latest
每次构建都使用latest标签生成镜像。我的Deployment YAML文件如下:
spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: gcr.io/projectid/pythonapp:latest ports: - containerPort: 5000 imagePullPolicy: Always
然而推送新的latest镜像后,Deployment并未自动更新,必须执行以下命令才能生效:
kubectl delete -f app.yaml kubectl create -f app.yaml
请问还需要配置哪些内容,才能让Deployment在发现新镜像时自动更新?
解决方案
1. 使用唯一镜像标签(推荐)
latest标签无法提供版本唯一性,Kubernetes会判定Pod模板未发生变化,因此不会触发滚动更新。建议改用唯一标识作为标签,比如GitHub提交哈希、时间戳或语义化版本号:
- 修改GitHub Workflow中的镜像构建与推送步骤:
- name: Build Docker image in prod run: | TAG=${{ github.sha }} # 用提交哈希作为唯一标签,也可替换为$(date +%Y%m%d%H%M%S) docker build . --tag gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:$TAG docker tag gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:$TAG gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:latest - name: Push Docker image in prod run: | TAG=${{ github.sha }} docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:$TAG docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:latest
- 在Workflow中添加自动更新Deployment的步骤:
- name: Update Deployment with new image run: | TAG=${{ github.sha }} # 替换Deployment YAML中的镜像标签 sed -i "s|gcr.io/projectid/pythonapp:latest|gcr.io/${{ secrets.GCP_PROJECT_ID }}/pythonapp:$TAG|" app.yaml kubectl apply -f app.yaml
每次镜像更新都会修改Pod模板的镜像字段,Kubernetes会自动触发滚动更新。
2. 手动触发滚动更新(无需修改标签)
如果坚持使用latest标签,可以在推送镜像后,通过命令手动触发Deployment的滚动更新:
在GitHub Workflow中添加以下步骤:
- name: Restart Deployment run: kubectl rollout restart deployment/myapp
这条命令会让Kubernetes重新创建所有Pod,结合imagePullPolicy: Always配置,新Pod会拉取最新的latest镜像。
3. 配置镜像拉取权限
确保Kubernetes节点有权限拉取GCR镜像,否则即使触发更新也会失败。需要配置ImagePullSecrets:
- 创建GCR镜像拉取密钥:
kubectl create secret docker-registry gcr-secret \ --docker-server=gcr.io \ --docker-username=_json_key \ --docker-password="$(cat google-credentials.json)" \ --docker-email=your-email@example.com
- 在Deployment的
spec.template.spec中添加密钥引用:
imagePullSecrets: - name: gcr-secret
4. 使用镜像自动检测工具(进阶)
可以部署kube-image-updater或Argo CD这类工具,它们会定期检测镜像仓库的最新镜像版本,自动更新Deployment的镜像配置,实现全自动化的更新流程。
内容的提问来源于stack exchange,提问作者bionics parv
相关产品推荐
相关产品推荐

