有没有办法为 Cloud 运行 服务设置 "imagePullPolicy"?

Is there a way to set "imagePullPolicy" for Cloud Run Service?

我希望能够在 Google Container Registry 上更新我的映像后自动更新我的 Google Cloud 运行 服务。

我需要根据同一张图片(标签为 :latest )更新多个 Cloud 运行 服务,所以我希望它能工作。

  # build & push the container image
- name: "gcr.io/kaniko-project/executor:latest"
  args: ["--cache=true", "--cache-ttl=48h", "--destination=gcr.io/project/titan:latest"]

目前,我的 titan 映像已更新,但没有新的修订版部署到 Cloud 运行。

默认的拉取策略是 IfNotPresent,这会导致 Kubelet 跳过拉取已存在的映像。如果您想始终强制拉动,可以执行以下操作之一:

  • 设置容器的imagePullPolicy为Always。
  • 省略 imagePullPolicy 并使用 :latest 作为要使用的图像的标签。
  • 省略 imagePullPolicy 和要使用的图像的标签。
  • 启用 AlwaysPullImages 准入控制器。

请注意,您应避免使用 :latest 标签,有关详细信息,请参阅 Best Practices for Configuration

例如创建YAML文件dummy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: whatever
      image: index.docker.io/DOCKER_USER/PRIVATE_REPO_NAME:latest
      imagePullPolicy: Always
      command: [ "echo", "SUCCESS" ]
  imagePullSecrets:
    - name: myregistrykey

然后运行:

kubectl create -f dummy.yaml

Google Cloud 运行 将新图像推送到标签引用时不会自动部署修订。它没有的原因有很多。

部署云 运行 修订版时,它会计算图像引用的 sha256 哈希值。

因此,当您使用 :latest 标记指定容器映像时,云 运行 使用其 sha256 引用来部署和扩展您的服务修订版。当您更新 :latest 标签以指向新图像时,Cloud 运行 仍将使用之前的图像。否则,这将是一个危险而湿滑的斜坡。

如果您需要auto-deploy基于新镜像推送对Cloud 运行进行新的修改,我推荐两种解决方案:

  1. 使“gcloud beta 运行 部署”命令成为 Google 云构建过程中的一个步骤。 (简单)https://cloud.google.com/run/docs/continuous-deployment
  2. 编写一个 GCF/Run 服务,在每次通过 PubSub 订阅 Google Cloud Build(或 GCR)通知推送新图像时,将您的应用程序部署到云端 运行。 (更难)