在執行個體和 MIG 上部署容器


您可以設定 Compute Engine 執行個體或執行個體範本,以便部署及啟動 Docker 容器。Compute Engine 會提供已安裝 Docker 的最新版 Container-Optimized OS (COS) 映像檔,並在執行個體啟動時啟動容器。

事前準備

  • 如果您不熟悉容器,請參閱「容器及其優點為何」。
  • 如果您對 Docker 不熟悉,請閱讀 Docker 說明文件
  • 瞭解 Container-Optimized OS
  • 參閱代管執行個體群組 (MIG) 相關說明。
  • 如果尚未設定,請先設定驗證機制。驗證是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要在本機開發環境中執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

選擇在執行個體和 MIG 上部署容器

在 Compute Engine 上部署容器,既可簡化應用程式的部署,又可控管執行個體基礎架構。

  • 用您在設定及管理 Compute Engine 基礎架構時,處理其他任何執行個體的相同方式,管理執行容器的執行個體。
  • 使用熟悉的流程與工具 (例如 Google Cloud CLI 或 Compute Engine API) 管理含有容器的執行個體。
  • 使用執行容器的代管執行個體群組 (MIG) 建立可擴充的服務,可提供自動調度資源、自動修復、滾動式更新、多區域部署和負載平衡之類的功能。

此外,您可能會考慮部署至 Google Kubernetes Engine 以達成下列目的:

  • 執行大量的微服務
  • 縮短容器的啟動時間
  • 利用 Kubernetes 的自動化調度管理,包括自動升級、節點自動修復及自動調度資源

如果在 Compute Engine 的獨立執行個體上執行每個微服務,可能會使作業系統負擔佔去成本的絕大部分。Google Kubernetes Engine 可讓您為每個執行個體部署多個容器及多組容器,更有效率地將主機執行個體資源分配至占用空間較小的微服務。

在 Compute Engine 上部署容器的運作方式

將軟體部署到 Compute Engine 執行個體的常見方法包括:

  • 使用開機指令碼cloud-init 在執行個體開機時部署軟體。
  • 建立已預先安裝軟體的自訂開機磁碟映像檔。

上述清單中的兩種方法皆結合了設定應用程式與設定作業系統環境的工作。身為開發人員,您必須仔細追蹤及解決任何執行階段相依性。例如,如果在 VM 上執行的兩個應用程式使用同一個程式庫的不同版本,您就必須安裝這兩個版本,並透過系統變數來指向各版本。

在同一程式庫的不同版本上執行的應用程式。
此執行個體具有直接部署到作業系統的應用程式

或者,您也可以將容器中的軟體部署到執行個體或 MIG 上。容器會攜帶應用程式軟體和必要的程式庫,並且會與 OS 應用程式和程式庫分隔開來。容器可在部署環境之間移動,而無需處理容器及其 OS 中發生衝突的程式庫版本。

範例:部署在容器中的應用程式。
此執行個體具有部署在容器中的應用程式

以下程序說明如何在 Compute Engine 上部署容器:

  1. 將您的應用程式和必要的程式庫整合到 Docker 映像檔中,然後將這個映像檔發布到 Artifact Registry 或 Docker Hub 等第三方註冊資料庫。
  2. 為 MIG 建立執行個體或執行個體範本時,請指定 Docker 映像檔名稱和 docker run 設定。

在您提出建立執行個體的要求後,Compute Engine 就會執行下列工作:

  1. Compute Engine 會建立使用 Google 提供的 Container-Optimized OS 映像檔的 VM 執行個體。這個映像檔內含 Docker 執行階段及負責啟動您的容器的其他軟體。
  2. Compute Engine 將您的容器設定儲存在 gce-container-declaration 中繼資料鍵下的執行個體中繼資料中。
  3. 當 VM 啟動時,Container-Optimized OS 映像檔會使用儲存在執行個體中繼資料中的 docker run 指令設定,從存放區提取容器映像檔,然後啟動容器。
使用容器映像檔和 docker run 指令。
建立執行容器的執行個體或代管執行個體群組的步驟

限制

  • 每個執行個體只能部署一個容器。如果每個執行個體必須部署多個容器,請考慮使用 Google Kubernetes Engine
  • 您只能從公開存放區或您可以存取的私人 Artifact Registry 或 Container Registry 存放區部署容器。系統不支援其他私人存放區。

    如要瞭解私人登錄簿權限,請參閱 Artifact RegistryContainer Registry 的存取權控管說明文件。

  • 您無法將執行個體的通訊埠對應至容器的通訊埠 (Docker 的 -p 選項)。如要啟用容器存取權,請參閱「發布容器通訊埠」。

  • Container-Optimized OS 映像檔只能與這種部署方法搭配使用。

  • 您只能透過 Google Cloud 主控台或 Google Cloud CLI 使用這項功能,不能透過 API。

準備要部署的容器

請選擇下列其中一種方法,讓 Compute Engine 可以存取您的容器映像檔:

  • 上傳 Docker 映像檔至 Artifact Registry。
  • 使用可從 Docker Hub 或其他註冊資料庫中公開取得的容器映像檔。

在新的執行個體上部署容器

您可以使用 Google Cloud 控制台或 Google Cloud CLI,在新的 VM 執行個體上部署容器。

主控台

下列範例將容器從 Google 提供的 Nginx Docker 映像檔 https://gcr.io/cloud-marketplace/google/nginx1:latest 部署至 VM 執行個體。如要使用其他 Docker 映像檔,請在下列步驟中將 Nginx Docker 映像檔替換為所需的映像檔。

前往「Create an instance」(建立執行個體)

如果出現系統提示,請選取您的專案,然後按一下「Continue」。系統隨即會顯示「Create an instance」(建立執行個體) 頁面,並顯示「Machine configuration」(機器設定) 窗格。

  1. 在「Machine configuration」窗格中,前往「Name」,然後指定執行個體的名稱。詳情請參閱「資源命名慣例」。

  2. 在導覽選單中,按一下「OS 和儲存空間」。畫面上會顯示「Operating system and storage」(作業系統和儲存空間) 窗格。

  3. 前往「容器」部分,然後按一下「部署容器」。在隨即顯示的「Configure container」窗格中,執行下列操作:

    1. 指定要使用的容器映像檔。請參考以下範例:
      • 如要從 Cloud Launcher 選取 NGINX 1.12 容器映像檔,請指定 gcr.io/cloud-marketplace/google/nginx1:1.12
      • 如要部署來自 Docker Hub 的 Apache 容器映像檔,請一律指定完整的 Docker 映像檔名稱,例如 docker.io/httpd:2.4
    2. 選用設定。指定您選擇的任何其他設定參數。如要進一步瞭解容器設定選項,請參閱「設定執行容器的選項」。
    3. 如要完成容器設定並返回「Operating system and storage」(作業系統和儲存空間) 窗格,請按一下「Select」
  4. 選用:指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。

  5. 如要完成建立執行個體,請按一下「Create」(建立)

    建立執行個體後,Compute Engine 會啟動執行個體並啟動容器。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 執行 gcloud compute instances create-with-container 指令

    gcloud compute instances create-with-container INSTANCE_NAME \
        --container-image=CONTAINER_IMAGE
    

    更改下列內容:

    • INSTANCE_NAME:新例項的名稱
    • CONTAINER_IMAGE:容器映像檔的名稱。

    舉例來說,下列指令會建立名為 nginx-vm 的執行個體,以啟動並執行容器映像檔:

    gcr.io/cloud-marketplace/google/nginx1:1.12

    gcloud compute instances create-with-container nginx-vm \
        --container-image=gcr.io/cloud-marketplace/google/nginx1:1.12
    

    如要部署 Docker Hub 中的 Apache 容器映像檔,請一律指定完整的 Docker 映像檔名稱:

    docker.io/httpd:2.4

在執行個體上更新容器

您可以使用 Google Cloud 主控台或 Google Cloud CLI 更新 Docker 映像檔和設定選項,以在執行個體上執行容器。

更新執行中的容器時,Compute Engine 會執行兩個步驟:

  • 在執行個體上更新容器宣告。Compute Engine 會將更新後的容器宣告儲存到 gce-container-declaration 中繼資料鍵下的執行個體中繼資料中。
  • 如果執行個體正在執行中,系統會停止並重新啟動執行個體,以啟用更新後的設定;如果執行個體處於停止狀態,則會更新容器宣告並使執行個體保持停止狀態。執行個體會下載新的映像檔,並在啟動時啟動容器。

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 按一下要更新的執行個體名稱。

  3. 在執行個體詳細資料頁面上,按一下「編輯」

  4. 指定新的容器映像檔,然後更新執行容器的相關選項 (如有需要)。

  5. 如要儲存變更,請按一下「儲存並重新啟動」。Compute Engine 隨即儲存變更,接著自動重新啟動執行個體來執行更新。執行個體重新啟動後,會下載新的映像檔,並以更新後的設定啟動容器。

gcloud

使用 gcloud compute instances update-container 指令更新容器宣告。例如:

gcloud compute instances update-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:latest

這個指令會將容器映像檔設為 gcr.io/cloud-marketplace/google/nginx1:latest,然後重新啟動執行個體來啟用變更。您也可以藉由新增對應的標記,更新設定選項以執行容器一文中所述的任何屬性。

執行個體重新啟動後,會下載新的容器映像檔並以新的設定啟動容器。

在代管執行個體群組上部署容器

您可以按照下列步驟,使用 Google Cloud 主控台或 Google Cloud CLI,將容器部署到新的代管執行個體群組 (MIG):

  1. 建立以 Docker 映像檔為基礎的執行個體範本

  2. 從新的執行個體範本建立 MIG

主控台

下列範例會建立一個執行個體範本,這個範本會從 Google 提供的 Nginx (gcr.io/cloud-marketplace/google/nginx1:15) Docker 映像檔,將容器部署到 MIG。如要使用其他 Docker 映像檔,請將下列範例中的 gcr.io/cloud-marketplace/google/nginx1:15 替換為要使用的映像檔。

  1. 前往「Instance templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

  2. 如要建立執行個體範本,請按一下「建立執行個體範本」

  3. 在「Container」下方,選取「Deploy container image」

  4. 在「Container image」下指定 Docker 映像檔名稱,然後設定執行容器的相關選項。例如,您可為容器映像檔指定 gcr.io/cloud-marketplace/google/nginx1:15

  5. 按一下 [建立]。

接下來,請建立使用新執行個體範本的 MIG。

gcloud

使用 gcloud compute instance-templates create-with-container 指令,建立用來執行 Docker 映像檔的執行個體範本:

gcloud compute instance-templates create-with-container TEMPLATE_NAME \
  --container-image DOCKER_IMAGE

您也可以設定執行容器的選項

舉例來說,下列指令會建立名為 nginx-template 的新執行個體範本,其內容會包括 Docker 映像檔的相關資訊。當執行個體啟動時,從這個範本建立的執行個體即會啟動並執行 Docker 映像檔 gcr.io/cloud-marketplace/google/nginx1:15

gcloud compute instance-templates create-with-container nginx-template \
    --container-image gcr.io/cloud-marketplace/google/nginx1:15

接下來,請使用新的執行個體範本建立 MIG。

現在您已擁有執行個體範本,可用此來建立 MIG。舉例來說,如要使用 gcloud CLI 和您剛建立的 nginx-template 建立 MIG,請執行下列指令:

gcloud compute instance-groups managed create example-group \
    --base-instance-name nginx-vm \
    --size 3 \
    --template nginx-template

更新執行容器的代管執行個體群組

您可以更新代管執行個體群組 (MIG),以部署新版的 Docker 映像檔或新版的 Container-Optimized OS 映像檔。

將 MIG 更新為新版容器映像檔

您可以使用 Managed Instance Group Updater,按照下列三個步驟,將新版的 Docker 映像檔部署至 MIG:

  1. 準備要部署的新 Docker 映像檔。
  2. 建立容器型範本的相同方式,建立以新 Docker 映像檔為基礎的執行個體範本。
  3. 使用 Managed Instance Group Updater,將 MIG 更新為新的執行個體範本。

將代管執行個體群組更新為新版本的 Container-Optimized OS 映像檔

Google 會定期更新 Container-Optimized OS 映像檔,您可能會想將這些更新套用到容器化 MIG,而不變更 Docker 映像檔。您可以使用 Google Cloud 主控台或 Google Cloud CLI,按照下列兩個步驟,將 MIG 更新為新版的 Container-Optimized OS 映像檔:

  1. 使用為新 MIG建立容器型範本的相同方式,建立以目前 Docker 映像檔版本為基礎的執行個體範本。根據預設,系統會使用支援的 Container-Optimized OS 映像檔最新版本。
  2. 使用 Managed Instance Group Updater,以新的執行個體範本更新 MIG。

使用 SSH 連線到容器

您可以使用 SSH 連線到執行個體上的容器。請使用 gcloud CLI 執行加上 --container 標記的 gcloud compute ssh

gcloud compute ssh INSTANCE_NAME --container CONTAINER_NAME

更改下列內容:

  • INSTANCE_NAME:執行個體名稱
  • CONTAINER_NAME:容器名稱

進一步瞭解 gcloud compute ssh 指令及其引數。

監控 Compute Engine 上的容器

如要監控執行 Container-Optimized OS 映像檔的執行個體,請使用 Node Problem Detector 代理程式,與 Cloud Monitoring 通訊並回報健康相關指標。從里程碑 77 開始,代理程式就會內建在 Container-Optimized OS 映像檔中。

如要啟用代理程式,請在使用 Milestone 88 以上版本映像檔的容器中,編輯自訂中繼資料區段,並將 google-monitoring-enabled 設為 true

如要瞭解啟用節點問題偵測工具的其他方式,請參閱「啟用狀態監控功能」。

Node Problem Detector 代理程式支援指標清單中以 guest/ 開頭的指標。

如要與代理程式收集的指標互動,請前往 Metrics Explorer

查看記錄

您可以查看容器相關的三種類型記錄:

  1. 啟動代理程式記錄,也稱為 konlet 記錄。啟動代理程式會剖析容器的設定,並執行工作,以在 Compute Engine 執行個體上啟動容器。

  2. Docker 事件記錄會回報容器事件,其中包括容器啟動與停止事件。

  3. 容器中的記錄包含在容器中執行的應用程式中的 STDOUT

查看啟動代理程式記錄

在序列主控台中,透過 journald 系統服務 (包含在 OS 映像檔中) 及透過 Cloud Logging,都可以取得啟動代理程式記錄。

在序列主控台中查看啟動代理程式記錄

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 選取要查看啟動代理程式記錄的執行個體。

  3. 在「Logs」(記錄) 下,按一下 [Serial port 1 (console)] (序列埠 1 (主控台)) 即可查看序列主控台記錄。

    記錄序列埠 1。

gcloud

使用 get-serial-port-output 指令查看執行個體序列埠的記錄。

gcloud compute instances get-serial-port-output INSTANCE_NAME

INSTANCE_NAME 替換為執行個體名稱。

舉例來說,您可以使用下列指令來查看名為 nginx-vm 的執行個體序列埠輸出:

gcloud compute instances get-serial-port-output nginx-vm

journald 中查看啟動代理程式記錄

  1. 使用 SSH 連線到含有容器的執行個體
  2. 執行 sudo journalctl 指令,查看執行個體啟動和容器啟動記錄。使用下列指令篩選容器啟動代理程式記錄 (konlet)。

    sudo journalctl -u konlet*
    

在 Logging 中查看啟動代理程式記錄

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 選取要查看啟動代理程式記錄的執行個體。

  3. 在「Logs」下方,按一下「Cloud Logging」即可查看 Cloud Logging 記錄。

    記錄序列埠 1。

  4. 輸入搜尋篩選器,擷取啟動代理程式記錄。

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_system"
    jsonPayload.SYSLOG_IDENTIFIER="konlet-startup"
    jsonPayload._HOSTNAME="INSTANCE_NAME"
    

    更改下列內容:

    • PROJECT_ID:包含執行個體的專案 ID
    • INSTANCE_NAME:您要取得記錄的執行個體名稱

gcloud

gcloud logging read 指令與適當的篩選器搭配使用,即可查看容器啟動代理程式記錄。

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/PROJECT_ID/logs/cos_system AND \
    jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
    jsonPayload._HOSTNAME=INSTANCE_NAME"

更改下列內容:

  • PROJECT_ID:包含執行個體的專案 ID
  • INSTANCE_NAME:您要取得記錄的執行個體名稱

舉例來說,如要針對執行 COS 70 且存在於 my-project 的 VM 執行個體 nginx-vm,查看其在 Logging 中最近 10 筆啟動代理程式記錄,請使用下列指令。

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/my-project/logs/cos_system AND \
    jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
    jsonPayload._HOSTNAME=nginx-vm" \
    --limit 10

查看 Docker 事件記錄

您可以在 journald 和 Cloud Logging 中查看 Docker 事件記錄。

journald 中查看 Docker 事件記錄

  1. 使用 SSH 連線到含有容器的執行個體
  2. 搭配下列篩選器執行 sudo journalctl 指令,即可查看 Docker 事件記錄。

    sudo journalctl -u docker-events-collector
    

在 Logging 中查看 Docker 事件記錄

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 選取要查看啟動代理程式記錄的執行個體。

  3. 在「Logs」下方,按一下「Cloud Logging」即可查看 Cloud Logging 記錄。

    記錄序列埠 1。

  4. 輸入下列搜尋篩選器,擷取 Docker 事件記錄。

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_system"
    jsonPayload._HOSTNAME="INSTANCE_NAME"
    jsonPayload.SYSLOG_IDENTIFIER="docker"
    

    更改下列內容:

    • PROJECT_ID:包含執行個體的專案 ID
    • INSTANCE_NAME:您要取得記錄的執行個體名稱

gcloud

gcloud logging read 指令與適當的篩選器搭配使用,即可查看 Docker 事件記錄。

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/PROJECT_ID/logs/cos_system AND \
    jsonPayload._HOSTNAME=INSTANCE_NAME AND \
    jsonPayload.SYSLOG_IDENTIFIER=docker"

更改下列內容:

  • PROJECT_ID:包含執行個體的專案 ID
  • INSTANCE_NAME:您要取得記錄的執行個體名稱

舉例來說,如要針對執行 COS 70 且存在於 my-project 的 VM 執行個體 nginx-vm,查看其在 Logging 中最近 10 筆 Docker 事件記錄,請使用下列指令。

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/my-project/logs/cos_system AND \
    jsonPayload._HOSTNAME=nginx-vm AND \
    jsonPayload.SYSLOG_IDENTIFIER=docker" \
    --limit 10

查看容器記錄

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 選取要查看啟動代理程式記錄的執行個體。

  3. 在「Logs」下方,按一下「Cloud Logging」即可查看 Cloud Logging 記錄。

    記錄序列埠 1。

  4. Cloud Logging 頁面會載入預設搜尋篩選器。複製 resource.labels.instance_id 的值。以供稍後使用。

  5. 更新搜尋篩選器,擷取容器記錄。

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_containers"
    resource.labels.instance_id="INSTANCE_ID"
    

    更改下列內容:

    • PROJECT_ID:包含執行個體的專案 ID
    • INSTANCE_ID:您要取得其記錄的執行個體 ID

gcloud

使用 gcloud logging read 指令查看容器記錄。

  1. 決定您要取得其記錄的執行個體 ID:

    gcloud compute instances describe INSTANCE_NAME \
       --zone ZONE \
       --format="value(id)"
    

    更改下列內容:

    • INSTANCE_NAME:您要取得記錄的執行個體名稱
    • ZONE:執行個體所在的可用區
  2. 使用下列指令與篩選器查看執行個體的容器記錄。

    gcloud logging read "resource.type=gce_instance AND \
        logName=projects/PROJECT_ID/logs/cos_containers AND \
        resource.labels.instance_id=INSTANCE_ID"
    

    更改下列內容:

    • PROJECT_ID:包含執行個體的專案 ID。
    • INSTANCE_ID:執行個體的 ID。

    舉例來說,如要針對執行 COS 70、存在於 my-project 且執行個體 ID 為 555123456789012345 的 VM 執行個體,查看其在 Cloud Logging 中最近 10 筆容器記錄,請使用下列指令。

    gcloud logging read "resource.type=gce_instance AND \
        logName=projects/my-project/logs/cos_containers AND \
        resource.labels.instance_id=555123456789012345" \
        --limit 10
    

指定容器最佳化的映像檔或映像檔系列

根據預設,容器化的執行個體或執行個體範本會使用支援的最新容器最佳化映像檔。這個映像檔屬於 cos-cloud 專案。

您可以使用 cos-cloud 專案中的其他圖片覆寫這項預設值。如要瞭解可用的映像檔系列及其屬性,請參閱「選擇適當的 Container-Optimized OS 版本」。

舉例來說,在您知道要使用的映像檔後,請在 gcloud CLI 中提供 --image 旗標,以便覆寫預設的容器最佳化映像檔,或是提供 --image-family 旗標,以便在建立執行個體時從指定系列中挑選最新的映像檔。

以下範例會建立容器化的執行個體,並使用來自 cos-dev 映像檔系列中的最新映像檔:

gcloud compute instances create-with-container nginx-vm \
    --image-family cos-dev \
    --image-project cos-cloud \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

設定防火牆規則

容器化執行個體會啟動網路設為主機模式的容器。容器共用主機網路堆疊,而主機中的所有介面都可提供給容器使用。

根據預設, Google Cloud 防火牆規則會封鎖執行個體的所有連入連線,並允許執行個體的所有連出連線。

建立防火牆規則,讓您的執行個體允許連入連線,進而允許連線連入容器。

設定執行容器的選項

您可以設定下列選項來執行容器:

  • 指定容器重新啟動政策。
  • 覆寫容器 ENTRYPOINT (在容器啟動時所要執行的預設指令)。
  • 將引數傳遞到容器 ENTRYPOINT 指令。
  • 在特權模式中執行容器。
  • 掛接主機目錄或 tmpfs 做為容器內的資料磁碟區。
  • 設定環境變數。
  • 為容器執行階段中的 STDIN 分配緩衝區。
  • 分配虛擬 TTY。

進一步瞭解如何設定選項以執行容器

後續步驟