繁体   English   中英

Compute Engine 部署容器

[英]Compute Engine Deploy Container

我正在使用 golang 以编程方式创建和销毁使用Compute Engine API的一次性 Compute Engine 实例。

我可以很好地创建一个实例,但我真正遇到的问题是在启动时启动一个容器。

您可以从控制台 UI 执行此操作:

在此处输入图像描述

但据我所知,以编程方式执行此操作非常困难,尤其是使用 Container Optimized OS 作为基础映像时。 我尝试做一个启动脚本,它执行docker pull us-central1-docker.pkg.dev/project/repo/image:tag但它失败了,因为你需要做gcloud auth configure-docker us-central1-docker.pkg.dev首先让它工作,COOS 没有 gcloud 也没有 package 经理来获取它。

我所有的解决方法似乎都很老套:

  • 手动创建具有所需容器的 VM 模板并创建模板的实例
  • 将容器放在外部注册表中,例如 docker hub(不可接受)
  • 使用 Ubuntu 而不是 COOS 和 package 管理器,这样我就可以在启动时以编程方式安装 gcloud、docker 和容器
  • 使用 COOS 从包含 gcloud 的 dockerhub 中拉下一个图像,然后执行某种 docker-in-docker mount 将其拉下

我是否遗漏了什么,或者在不使用 gcloud 或控制台 UI 的情况下将容器部署到计算引擎实例真的很麻烦吗?

要在 Compute Engine 启动时让 Compute Engine 启动容器,必须为容器的描述定义元数据。 当 COOS 启动时,它似乎运行了一个名为 konlet 的应用程序,可在此处找到:

https://github.com/GoogleCloudPlatform/konlet

如果我们查看文档,它会说:

代理解析存储在 gce-container-declaration 键下的 VM 实例元数据中的容器声明,并使用声明的配置选项启动容器。

不幸的是,我还没有找到有关此元数据结构的任何正式文档。 虽然我找不到文档,但我确实找到了两种可能的解决方案:

  1. 破译konlet的源代码,拆开看看元数据如何映射到docker容器启动时传递的内容

或者

  1. 使用所需的容器定义手动创建 Compute Engine,然后启动 Compute Engine。 通过 SSH 连接到 Compute Engine,然后检索当前元数据。 我们可以在此处阅读有关检索元数据的信息:

https://cloud.google.com/compute/docs/metadata/overview

您提到您使用docker-credential-gcr来解决您的问题。 我在我的启动脚本中尝试了同样的方法:

docker-credential-gcr configure-docker --registries us-east1-docker.pkg.dev

但它返回:

ERROR: Unable to save docker config: mkdir /root/.docker: read-only file system

还需要其他步骤吗? 谢谢。

事实证明,在 Container Optimized OS 中从 Artifact Registry 中拉取容器并不太难:

  • 运行docker-credential-gcr configure-docker --registries [region]-docker.pkg.dev

请参阅: https : //cloud.google.com/container-optimized-os/docs/how-to/run-container-instance#accessing_private_images_in_or

因此,您可以做的是将上述行与docker pull [image]docker run ...放入启动脚本中。 您可以在使用metadata字段创建实例时指定启动脚本: https : //cloud.google.com/compute/docs/instances/startup-scripts/linux#api

这似乎是以编程方式使用容器配置实例的最简单的方法。

我最近遇到了这些限制的另一面(并就该主题提出了一个问题)。

基本上,我想在启动容器的情况配置 COOS 实例。 我无法做到,所以我只是从基础镜像启动了一个容器,然后在我的 CI/CD 管道中,Docker 化了我的应用程序,将其上传到 Artifact Registry,并用我新建的应用程序替换了 COOS 实例上的基础镜像。

我提供的元数据作为容器启动初始基础镜像:

spec:
  containers:
    - image: blairnangle/python3-numpy-ta-lib:latest
      name: containervm
      securityContext:
        privileged: false
      stdin: false
      tty: false
      volumeMounts: []
      restartPolicy: Always
      volumes: []

我是一个 Terraform fanboi,所以元数据存在于一些 Terraform 配置中。 如果您想仔细看看,我有一个公共项目,其中包含实现此目的的代码: blairnangle/dockerized-flask-on-gce

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM