4

我在 GCE 上有一个 Kubernetes 部署,我想根据在 Google Container Registry 中创建的新图像自动更新它(最好是通过构建触发器)。有没有办法做到这一点?

提前致谢。

-标记

4

3 回答 3

7

我可以使用 GCR 和 Cloud Builder 以及cloudbuild.yaml如下所示的文件来执行此操作。要使其正常工作,名称为 like 的服务帐户xyz@cloudbuild.gserviceaccount.com必须具有通过单击 Project -> Editor 分配的 IAM 权限。这是必需的,以便 Cloud Build 服务可以生成 SSH 密钥并将它们添加到您的 GCE 元数据中,以允许 Cloud Builder 进行 SSH 访问。这种 SSH 是在 GCE VM 服务器上有效运行任何命令的重要解决方法。

steps:
# Build Docker image: docker build -f Dockerfile -t gcr.io/my-project/my-image:latest .
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-f', 'Dockerfile', '-t', 'gcr.io/my-project/my-image:latest', '.']

# Push to GCR: gcloud docker -- push gcr.io/my-project/my-image:latest
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/my-project/my-image:latest']

# Connect to GCE server and pull new image
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE', '--command', 'gcloud docker -- pull gcr.io/my-project/my-image:latest']

# Connect to server and stop current container
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE',  '--command', 'docker stop my-image']

# Connect to server and stop current container
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE',  '--command', 'docker rm my-image']

  # Connect to server and start new container
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE',  '--command', 'docker run  --restart always --name my-image -d -p 443:443  --log-driver=gcplogs  gcr.io/my-project/my-image:latest']


substitutions:
  _SERVER: 'my-gce-vm-server'
  _ZONE: 'us-east1-c'

奖金专业提示:

  1. substitutions如果您有一天支持新服务器并想使用它,这很好
  2. using--log-driver=gcplogs使您的 Docker 日志显示在适当的“GCE VM 实例”中的 Google Cloud Console 的 Stackdriver Logging 中。只需确保选择“所有日志”和“任何日志级别”,因为 Docker 日志没有日志级别,也没有syslogactivity_log消息
于 2017-12-30T04:35:21.793 回答
2

另一种选择:我们的一些用户使用kubectl 构建步骤在构建结束时触发部署。

您可以在构建步骤中调用任何kubectl命令,前提是您已设置适当的 IAM 权限以在构建过程中执行此操作。(请参阅README。)此示例调用kubectl get pods.

请注意,映像仅在完成构建结束时自动推送,因此要构建映像并将其部署在一个构建中,您需要在docker push部署步骤之前插入自己的构建步骤。

于 2017-09-24T15:28:56.387 回答
0

您可以使用 Google Cloud pub/sub 来监听 Google Container Registry 中的变化。此页面概述了此功能。您可能希望为您的应用程序使用推送模型。

但是,请注意,这是一个 alpha 功能,其行为可能会在未来版本中发生变化。

如果您不想要 pub/sub 提供的外部控制,您的构建脚本应该执行以下操作,

  1. 标记图像并上传到容器注册表
  2. 在部署脚本中更新映像版本
  3. 运行部署脚本,该脚本将拉取最新的镜像
于 2017-09-22T04:40:20.333 回答