遷移在建立 VM 時部署的容器

Compute Engine 中的容器啟動代理程式已淘汰。建立 VM 時,您可以使用這個代理程式在 Compute Engine 執行個體上部署容器。

本文說明如何將啟動代理程式在 VM 或代管執行個體群組 (MIG) 上建立的現有容器,遷移至其他Trusted Cloud 服務。

根據您的需求,選擇下列其中一個選項,遷移使用已淘汰方法部署在 VM 上的容器:

  • 如要繼續在個別 VM 和 MIG 上執行容器,請使用開機指令碼cloud-init
  • 如果您有無狀態容器應用程式,以及中小型作業,請使用 Cloud Run
  • 如果容器是具有明確結束狀態的批次作業,且需要額外的運算資源,請使用 Batch
  • 如需進階控制和擴充功能,或無法透過其他選項滿足需求,請使用 Google Cloud 上的 GKE

如要瞭解更多應用實例和替代解決方案,請參閱「比較容器部署選項」。

在 VM 上設定容器的已淘汰選項

在建立 VM 時設定容器時,Compute Engine 會使用容器啟動代理程式讀取儲存容器資訊的 gce-container-declaration 中繼資料,並在 VM 上部署容器。

下列直接在 VM 或 MIG 上部署容器的選項已淘汰,這些選項使用容器啟動代理程式和 gce-container-metadata

主控台

「建立執行個體」頁面上的「部署容器」選項已淘汰:

「部署容器」選項。

gcloud

下列 gcloud 指令已淘汰,這些指令會在 VM 或執行個體範本上設定容器:

Terraform

Terraform 模組 gce-container 和用於設定容器的 gce-container-declaration 中繼資料鍵已淘汰。

找出使用已淘汰容器中繼資料的執行個體

如要判斷專案中是否有任何執行個體使用已淘汰的容器中繼資料,請執行下列 Google Cloud CLI 指令,列出具有 gce-container-declaration 中繼資料鍵和值的執行個體:

gcloud compute instances list --filter="metadata.items.key:gce-container-declaration"

這個指令會列出已設定專案中包含 gce-container-declaration 中繼資料鍵的所有 VM 執行個體。中繼資料鍵會明確識別出屬於淘汰範圍的 VM。如果您使用多個專案,請在所有有效專案中執行這項指令。

如要驗證特定執行個體,請執行下列 Google Cloud CLI 指令:

  gcloud compute instances describe VM_NAME --format="(metadata.items)"

VM_NAME 替換為要驗證的 VM 執行個體名稱。

如要進一步瞭解如何查看中繼資料,請參閱「查看及查詢中繼資料」。

比較容器部署選項

下表匯總了在 VM 上執行容器的用途,並建議用於遷移工作負載的替代容器解決方案:

用途 更換類型 費用 建議解決方案
  • 繼續在 VM 或 MIG 上執行容器。
  • 不熟悉無伺服器或代管型解決方案。
  • 執行容器以進行測試和開發。
  • 工作負載是由單一 VM 組成。
  • 在特權模式中執行容器。
  • 直接更換 完全不須另外付費 使用啟動指令碼建立 VM
  • 繼續在 VM 或 MIG 上執行容器。
  • 在單一 VM 上執行多個容器。
  • 在容器或 VM 上設定進階情境。
    例如建立使用者、匯入檔案、掛接磁碟或使用特殊權限模式。
  • 工作負載包含多個 VM 或 MIG。
  • 直接更換 完全不須另外付費 在 VM 生命週期期間,使用 cloud-init 執行工作
    執行具有明確結束狀態且需要額外運算資源的批次工作。 代管服務 取決於工作負載特性和容器設定的複雜度。 Batch
  • 執行無狀態應用程式。
  • 執行中小型工作。
  • 代管服務 為較小的工作負載提供低成本或免付費解決方案。 Cloud Run
  • 您已有現成的 GKE 叢集。
  • 您需要進階控制和擴充功能。
  • 代管服務 取決於工作負載特性和容器設定的複雜程度。 Google Kubernetes Engine

    從 Compute Engine 容器啟動代理程式轉換為替代解決方案時,請考量下列必要變更,以及實作這些變更可能需要付出的心力:

    • 執行 Container-Optimized OS 的 VM:完全掌控 VM 和容器執行階段的設定、配置、安全性與維護作業,通常需要使用開機指令碼或 cloud-init 編寫指令碼。
    • Cloud Run 或 Batch:確認應用程式為無狀態,且符合要求驅動或以工作為基礎的執行模型。這種做法可能需要調整應用程式,以便與外部狀態管理服務搭配運作。
    • GKE:採用 Kubernetes 原則、使用 Kubernetes 資訊清單檔案定義工作負載,以及管理叢集資源。

    使用開機指令碼在 VM 上部署容器

    您可以使用開機指令碼,在 VM 上執行基本容器。

    使用開機指令碼設定容器時,請注意下列事項:

    • 您可以針對基本情境使用開機指令碼。如需進階設定,請考慮使用 cloud-init
    • 由於您要使用開機指令碼設定的容器建立新的 VM,因此必須規劃現有 VM 上部署的任何工作負載轉移作業。
    • 請先測試並確認一切正常運作,再將流量導向新建立的 VM (含容器)。

    如要建立 VM,並在 VM 或 MIG 上部署容器,請按照下列步驟操作:

    1. 將 VM 中繼資料的目前容器對應至開機指令碼指令
    2. 根據現有的中繼資料設定建立開機指令碼
    3. 使用開機指令碼建立 VM使用開機指令碼建立 MIG

    將容器中繼資料對應至 docker run 指令

    您可以將 VM 中繼資料或 gcloud 旗標對應至 docker run 引數,並將其納入 VM 建立作業的開機指令碼。

    部分 gcloud 旗標會直接轉換為 VM 中繼資料。這些旗標也會直接轉換為 docker run 旗標。如果 VM 上已有容器,您可以讀取 VM 中繼資料設定,並使用對應的 docker run 指令建構開機指令碼。

      # Get your existing VM instance configuration in yaml format
      gcloud compute instances describe VM_NAME --format="(metadata.items)"
    

    輸出結果會與下列內容相似:

      metadata:
        items:
        - key: gce-container-declaration
          value: |
            spec:
              containers:
              - args:
                - '"hello world!"'
                command:
                - echo
                env:
                - name: ONE
                  value: '1'
                image: docker.io/library/busybox
                name: my-instance
                securityContext:
                  privileged: true
                stdin: true
                tty: true
              restartPolicy: Always
        - key: google-logging-enabled
          value: 'true'
    

    請參閱下表,將現有規格對應至 docker run 指令:

    Google Cloud CLI 旗標 VM 中繼資料鍵 Docker 執行指令
    --container-image containers.image 指定為不含任何旗標的引數。
    例如:
    docker run gcr.io/google-containers/busybox
    --container-command command 在容器映像檔名稱後方指定為引數,不含任何旗標。
    例如:
    docker run gcr.io/google-containers/busybox echo "hello world"
    --container-arg args 在指令後方指定為引數,不含任何標記。
    例如:
    docker run gcr.io/google-containers/busybox echo "hello world"
    --container-env containers.env array --env KEY=VALUE [--env KEY=VALUE ...]
    --container-restart-policy restartPolicy --restart
    可能的值為 noon-failurealways。預設值為 no
    --container-stdin containers.stdin -i
    布林值旗標,如果存在則為 true,預設為 false。
    --container-tty containers.tty -t
    布林值旗標,如果存在則為 true,預設為 false。
    --container-privileged containers.securityContext.privileged --privileged
    布林值旗標,如果存在則為 true,預設為 false。
    --container-mount-disk - 沒有對應的 docker run 指令。
    你可以個別掛接磁碟

    開機指令碼範例

    下列範例說明如何在啟動指令碼中加入 docker 指令:

    • 範例 1:在以 Container-Optimized OS 為基礎的 VM 中執行獨立容器。
    • 範例 2:在以 Container-Optimized OS 為基礎的 VM 中執行網頁伺服器容器。

    範例 1

    在以 Container-Optimized OS 為基礎的 VM 中執行獨立容器:

    #!/bin/bash
    
    # A name for the container
    CONTAINER_NAME="my-app-container"
    
    # Stop and remove the container if it exists
    docker stop $CONTAINER_NAME || true
    docker rm $CONTAINER_NAME || true
    
    # Pull the latest version of the container image from Docker Hub
    docker pull busybox:latest
    
    # Run docker container from image in docker hub
    docker run busybox:latest \
      echo "hello world!"
    

    範例 2

    在以 Container-Optimized OS 為基礎的 VM 中執行網路伺服器容器:

    #!/bin/bash
    
    # Enable incoming traffic
    iptables -A INPUT -j ACCEPT
    
    # A name for the container
    CONTAINER_NAME="my-app-container"
    
    # Stop and remove the container if it exists
    docker stop $CONTAINER_NAME || true
    docker rm $CONTAINER_NAME || true
    
    # Pull the latest version of the container image from Docker Hub
    docker pull nginx:latest
    
    # Run docker container from image in docker hub
    docker run \
      --name=$CONTAINER_NAME \
      --privileged \
      --restart=always \
      --tty \
      --detach \
      --network="host" \
      nginx:latest
    

    容器部署作業的其他設定選項

    本節說明在 VM 上部署容器時的其他設定參數。

    如要進一步瞭解這些選項,請參閱「設定執行容器的選項」。

    存取 Artifact Registry 映像檔

    如要存取 gcr.io 或 pkg.dev 中的容器映像檔,請使用 Container-Optimized OS 中預先安裝的 docker-credential-gcr 工具,並為 Docker 設定 Artifact Registry 的驗證。執行容器前,請先執行下列指令:

      # Set home directory to save docker credentials
      HOME=/home/appuser
    
      # Configure docker with credentials for gcr.io and pkg.dev
      docker-credential-gcr configure-docker
    

    詳情請參閱「為 Docker 設定 Artifact Registry 驗證機制」。

    設定記錄功能

    建議您在 VM 上啟用記錄代理程式,使用 Cloud Logging。

    或者,如要變更記錄驅動程式,可以在 docker run 指令中加入 --log-driver 參數:

      # Use Cloud Logging logging driver
      docker run --log-driver=gcplogs nginx:latest
    

    詳情請參閱「搭配使用 Cloud Logging 與 Container-Optimized OS」一文。

    設定內部防火牆

    Container-Optimized OS 預設會拒絕傳入流量,因此您必須新增 iptables 規則來允許該流量。請注意,這些指令會設定主機作業系統的內部防火牆。此外,您必須設定虛擬私有雲防火牆,允許該流量傳送至新的 VM

    詳情請參閱「使用虛擬私有雲防火牆規則」。

      # Enable all incoming and routed traffic
      iptables -A INPUT -p -j ACCEPT
      iptables -A FORWARD -p -j ACCEPT
    

    詳情請參閱設定主機防火牆

    將磁碟區附加至容器

    如果磁碟區已附加至容器,容器中繼資料會包含 volumes 項目和 volumeMounts 陣列。volumes 中項目的 name 對應於 volumeMounts 中項目的名稱,反之亦然。針對您收集的每個卷冊,請從 volumesvolumeMounts 項目中收集必要資訊。

    如果容器未附加任何磁碟區,您可以略過本節,直接使用啟動指令碼建立 VM

    如要進一步瞭解 Container-Optimized OS 的磁碟和檔案系統,請參閱「磁碟和檔案系統總覽」。

    掛接 tmpfs 檔案系統

    如要將空白的 tmpfs 檔案系統掛接到容器,請使用 docker run 指令指定 --tmpfs 引數。舉例來說,如要將快取檔案系統掛接到 nginx 容器,請執行下列指令:

      # mount a cache file system to the nginx container
      docker run -d --name=$CONTAINER_NAME --tmpfs /var/cache/nginx:rw,size=512m,noexec,nosuid,nodev --network="host" nginx:latest
    

    如要進一步瞭解如何掛接 tmpfs 檔案系統,請參閱「tmpfs 掛接」。

    掛接主機目錄

    如要將主機 VM 的目錄掛接到容器,請使用 docker run 指令指定 --mount 引數:

      # mount a read-only directory to the nginx container
      docker run -d --name=$CONTAINER_NAME --mount type=bind,source=/var/www/html,target=/usr/share/nginx/html,ro nginx:latest
    

    詳情請參閱「繫結掛接」。

    將永久磁碟掛接到容器

    如要將磁碟掛接至容器,必須採取額外的步驟。如要掛接磁碟,請先將磁碟掛接至 VM,然後將該磁碟掛接至容器:

    1. 如要將磁碟掛接到 VM,請執行下列指令:

      #!/bin/bash
      
      DISK_DEVICE_NAME="my-persistent-disk" # This name MUST match the 'device-name' in the gcloud --disk flag
      DISK_BY_ID_PATH="/dev/disk/by-id/google-${DISK_DEVICE_NAME}"
      HOST_MOUNT_POINT="/mnt/disks/my-persistent-disk" # This is the path where the disk will be mounted on the VM
      CONTAINER_MOUNT_PATH="/usr/share/my-persistent-disk" # This is the path where the disk will be mounted in the container
      
      # format a disk as an ext4 filesystem, if it doesn't already contain one
      file -sL $DISK_BY_ID_PATH | grep -q filesystem || \
              mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard $DISK_BY_ID_PATH
      
      # create a directory for mounting point
      sudo mkdir -p "${HOST_MOUNT_POINT}"
      
      # mount a disk to the VM
      sudo mount -o defaults,discard "${DISK_BY_ID_PATH}" "${HOST_MOUNT_POINT}"
      
    2. 將磁碟掛接至 VM 後,請使用 docker run 指令新增 --mount 標記,將磁碟掛接至容器:

      docker run -d --name=$CONTAINER_NAME --mount type=bind,source="${HOST_MOUNT_POINT}",target="${CONTAINER_MOUNT_PATH}",readonly nginx:latest
      

    使用開機指令碼建立 VM

    使用容器設定建立開機指令碼後,請使用這個開機指令碼,以 Container-Optimized OS 為基礎建立 VM。如要進一步瞭解如何根據 Container-Optimized OS 建立 VM,請參閱「從公開映像檔建立執行個體」。

    如要進一步瞭解如何使用開機指令碼,請參閱「在 Linux VM 中使用開機指令碼」。

    主控台

    1. 前往 Trusted Cloud 控制台的「Create an instance」(建立執行個體) 頁面。

      前往「建立執行個體」

      如果出現提示,請選取專案並按一下「繼續」。「建立執行個體」頁面隨即顯示,並顯示「機器設定」窗格。

    2. 在「Machine configuration」(機器設定) 窗格中,選取 VM 的機器系列和機器類型。

    3. 在導覽選單中,按一下「OS 和儲存空間」。在隨即顯示的「作業系統和儲存空間」窗格中,完成下列步驟來設定開機磁碟:

      1. 點選「變更」。系統會顯示「Boot disk」(開機磁碟) 窗格,並顯示「Public images」(公開映像檔) 分頁。
      2. 在「Operating system」(作業系統) 清單中,選取「Container Optimized OS」(Container Optimized OS)
      3. 在「Version」清單中,選取作業系統版本。
      4. 在「Boot disk type」(開機磁碟類型) 清單中,選取開機磁碟類型。
      5. (選用) 如需其他磁碟,請在「Additional disks」(其他磁碟) 區段中新增磁碟。
      6. 按一下 [選取]。
    4. 在導覽選單中,按一下「進階」

      1. 在「Automation」(自動) 區段中,貼上您為容器部署作業建立的開機指令碼。
    5. 如要建立並啟動 VM,請按一下 [Create] (建立)

    gcloud

    使用 gcloud CLI 時,請將啟動指令碼儲存在個別檔案中。

    1. 如要使用開機指令碼建立 VM,請執行下列指令:

      gcloud compute instances create VM_NAME \
          --zone=ZONE \
          --image-family=IMAGE_FAMILY \
          --image-project=IMAGE_PROJECT \
          --machine-type=MACHINE_TYPE \
          --metadata-from-file=startup-script=STARTUP_SCRIPT_FILE
      

      更改下列內容:

      • VM_NAME:新 VM 的名稱
      • ZONE:要在其中建立執行個體的區域。
      • IMAGE_PROJECT:包含映像檔的 Container-Optimized OS 映像檔專案,例如 cos-cloud
      • IMAGE_FAMILY:Container-Optimized OS 映像檔系列,例如 cos-stable
      • MACHINE_TYPE:新 VM 的機器類型,可以是預先定義的機器類型,也可以是自訂的機器類型。
      • STARTUP_SCRIPT_FILE:電腦上開機指令碼檔案的相對路徑,例如 ./startup_script.sh

      範例:

      # Create COS-based VM by using a startup script
      gcloud compute instances create "cos-instance-with-startup-script" \
      --zone="us-central1-c" \
      --machine-type="e2-medium" \
      --image-family="cos-stable" \
      --image-project="cos-cloud" \
      --metadata-from-file=startup-script="./startup_script.sh"
      
    2. 執行下列指令,確認 Compute Engine 是否已建立 VM:

      gcloud compute instances describe VM_NAME
      

      VM_NAME 替換為您建立的 VM 名稱。

    Terraform

    如要建立 VM,可以使用 google_compute_instance 資源

    provider "google" {
    project = "PROJECT_ID"
    }
    
    resource "google_compute_instance" "cos_vm_instance" {
    name         = "VM_NAME"
    machine_type = "MACHINE_TYPE"
    zone         = "ZONE"
    
    # Use a Container-Optimized OS image for the boot disk
    boot_disk {
      initialize_params {
        image = "IMAGE_PROJECT/IMAGE_FAMILY"
      }
    }
    
    # Attaches the instance to the default network
    network_interface {
      network = "default"
    }
    
    # Specify the relative path to the startup script on your local machine
    metadata = {
      startup-script = file("STARTUP_SCRIPT_FILE")
    }
    }
    

    更改下列內容:

    • VM_NAME:新 VM 的名稱
    • ZONE:要在其中建立執行個體的區域。
    • IMAGE_PROJECT:包含映像檔的 Container-Optimized OS 映像檔專案,例如 cos-cloud
    • IMAGE_FAMILY:Container-Optimized OS 映像檔系列,例如 cos-stable
    • MACHINE_TYPE:新 VM 的機器類型,可以是預先定義的機器類型,也可以是自訂的機器類型。
    • STARTUP_SCRIPT_FILE:電腦上開機指令碼檔案的相對路徑,例如 ./startup_script.sh

    範例:

    provider "google" {
      project = "my-project"
    }
    
    resource "google_compute_instance" "my_container_vm" {
      name = "my-container-vm-startup"
      machine_type = "e2-medium"
      zone = "us-central1-a"
    
      boot_disk {
        initialize_params {
          image = "cos-cloud/cos-stable"
        }
      }
    
      network_interface {
        network = "default"
      }
    
      metadata = {
        startup-script = file("./startup_script.sh")
      }
    }
    

    依據開機指令碼建立 MIG

    使用開機指令碼建立執行個體範本後,請使用下列其中一種方法建立 MIG。

    如要進一步瞭解如何建立 MIG,請參閱「建立代管執行個體群組」。

    主控台

    1. 建立執行個體範本,以您在前一節中建立的啟動指令碼為基礎。

      1. 在「Operating system」(作業系統) 區段中,選取「Container Optimized OS」(Container Optimized OS) 和版本。
      2. 在「Automation」(自動) 區段中,貼上您為容器部署作業建立的開機指令碼。
    2. 使用上一步建立的執行個體範本建立 MIG

    gcloud

    1. 使用 instance-templates create 指令建立執行個體範本

      您必須為 VM 使用 Container-Optimized OS 映像檔。 您可以在 --metadata-from-file 標記中指定開機指令碼檔案的相對路徑。

    2. 使用上一步建立的執行個體範本建立 MIG

    範例:

      # Create the instance template that uses a startup script
      gcloud compute instance-templates create startup-template \
          --machine-type=e2-medium \
          --image-family=cos-stable \
          --image-project=cos-cloud \
          --metadata-from-file=startup-script=./startup_script.sh
    
      # Create the managed instance group
        gcloud compute instance-groups managed create startup-mig \
          --template=startup-template \
          --size=2 \
          --zone=us-central1-a
    

    Terraform

    使用 google_compute_instance_templategoogle_compute_instance_group_manager 資源建立執行個體範本和 MIG,如下列範例所示:

    範例

    resource "google_compute_instance_template" "startup_template" {
      name_prefix = "startup-template-"
      machine_type = "e2-medium"
      disk {
        source_image = "cos-cloud/cos-stable"
        auto_delete  = true
        boot         = true
      }
    
      network_interface {
        network = "default"
      }
      metadata = {
        startup-script = file("./startup_script.sh")
    }
    }
    
    resource "google_compute_instance_group_manager" "startup_mig" {
      name               = "startup-mig"
      base_instance_name = "startup-vm"
      zone               = "us-central1-a"
      version {
        instance_template = google_compute_instance_template.startup_template.id
      }
      target_size = 2
    }
    

    測試及清理

    成功建立 VM 或 MIG 後,請驗證應用程式是否在容器中執行,且運作方式符合預期。如要修正問題,請參閱「疑難排解」一文。

    如果應用程式在新 VM 上順利執行 (這些 VM 是使用啟動指令碼建立),您可以刪除使用已淘汰容器部署方法的 VMMIG

    疑難排解

    如要排解使用開機指令碼在 VM 上設定容器時可能發生的問題,請查看開機指令碼記錄和容器記錄。

    • 如要在 VM 執行個體上查看開機指令碼記錄,請執行下列指令:

      sudo journalctl | grep "startup script"
      
    • 如要查看 Docker 容器的記錄,請執行 docker logs 指令:

      docker logs CONTAINER_NAME
      

      使用您的容器名稱取代 CONTAINER_NAME

    如要排解其他問題,請參閱下列文件:

    搭配使用 cloud-init 與 Container-Optimized OS

    您可以使用 cloud-init (業界標準的跨平台解決方案),在執行 Container-Optimized OS 的 VM 上部署容器。這個工具可讓您在建立或啟動 VM 時執行自訂設定。詳情請參閱「使用 cloud-init 搭配 Cloud 設定格式」。

    使用代管服務部署容器

    本節說明可部署容器的 Trusted Cloud by S3NS 受管理服務。

    Cloud Run

    Cloud Run 非常適合無狀態容器應用程式,以及中小型工作。

    Cloud Run 的主要功能包括:

    • 您可以選擇只在要求處理期間分配 CPU,也可以選擇隨時分配 CPU。
    • 您可以執行無狀態容器應用程式,或以一次性、排程或工作流程的形式執行工作。
    • 您可以為每個要求或工作設定逾時。
    • 具備高擴充性和安全性。
    • 並整合了負載平衡和自動調度資源功能。

    如要進一步瞭解如何在 Cloud Run 上部署容器,請參閱將容器映像檔部署至 Cloud Run

    批次

    Batch 是一項全代管服務,可讓您在 Trusted Cloud by S3NS 資源中排定時間、排入佇列和執行批次處理工作負載。這項服務專為執行批次樣式、可平行處理的工作負載而設計,包括封裝在容器中的工作負載。

    如要進一步瞭解如何在 Batch 上部署容器,請參閱下列文件:

    Google Kubernetes Engine

    如果您執行複雜的應用程式、微服務、持續運作,且需要精細的控制和擴充性,Google Kubernetes Engine (GKE) 就是最適合的產品。如要進一步瞭解如何在 GKE 上部署容器,請參閱下列文件:

    取得支援

    如對遷移程序有任何疑問或需要協助,請參閱常見問題,或與Trusted Cloud 支援團隊聯絡。