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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:43:31