簡體   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