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 或執行個體範本上設定容器:
- gcloud compute instances create-with-container
- gcloud compute instances update-container
- gcloud compute instance-templates create-with-container
- gcloud compute instances create 指令,使用
--metadata
標記設定gce-container-declaration
中繼資料鍵 - gcloud compute instance-templates create 指令,使用
--metadata
標記設定gce-container-declaration
中繼資料鍵
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。 |
例如建立使用者、匯入檔案、掛接磁碟或使用特殊權限模式。 |
直接更換 | 完全不須另外付費 | 在 VM 生命週期期間,使用 cloud-init 執行工作。 |
執行具有明確結束狀態且需要額外運算資源的批次工作。 | 代管服務 | 取決於工作負載特性和容器設定的複雜度。 | Batch |
|
代管服務 | 為較小的工作負載提供低成本或免付費解決方案。 | Cloud Run |
|
代管服務 | 取決於工作負載特性和容器設定的複雜程度。 | 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 上部署容器,請按照下列步驟操作:
將容器中繼資料對應至 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 可能的值為 no 、on-failure 和 always 。預設值為 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
中項目的名稱,反之亦然。針對您收集的每個卷冊,請從 volumes
或 volumeMounts
項目中收集必要資訊。
如果容器未附加任何磁碟區,您可以略過本節,直接使用啟動指令碼建立 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,然後將該磁碟掛接至容器:
如要將磁碟掛接到 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}"
將磁碟掛接至 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 中使用開機指令碼」。
主控台
前往 Trusted Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
如果出現提示,請選取專案並按一下「繼續」。「建立執行個體」頁面隨即顯示,並顯示「機器設定」窗格。
在「Machine configuration」(機器設定) 窗格中,選取 VM 的機器系列和機器類型。
在導覽選單中,按一下「OS 和儲存空間」。在隨即顯示的「作業系統和儲存空間」窗格中,完成下列步驟來設定開機磁碟:
- 點選「變更」。系統會顯示「Boot disk」(開機磁碟) 窗格,並顯示「Public images」(公開映像檔) 分頁。
- 在「Operating system」(作業系統) 清單中,選取「Container Optimized OS」(Container Optimized OS)。
- 在「Version」清單中,選取作業系統版本。
- 在「Boot disk type」(開機磁碟類型) 清單中,選取開機磁碟類型。
- (選用) 如需其他磁碟,請在「Additional disks」(其他磁碟) 區段中新增磁碟。
- 按一下 [選取]。
在導覽選單中,按一下「進階」。
- 在「Automation」(自動) 區段中,貼上您為容器部署作業建立的開機指令碼。
如要建立並啟動 VM,請按一下 [Create] (建立)。
gcloud
使用 gcloud CLI 時,請將啟動指令碼儲存在個別檔案中。
如要使用開機指令碼建立 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"
執行下列指令,確認 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,請參閱「建立代管執行個體群組」。
主控台
gcloud
使用
instance-templates create
指令建立執行個體範本。您必須為 VM 使用 Container-Optimized OS 映像檔。 您可以在
--metadata-from-file
標記中指定開機指令碼檔案的相對路徑。使用上一步建立的執行個體範本建立 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_template
和 google_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 是使用啟動指令碼建立),您可以刪除使用已淘汰容器部署方法的 VM 和 MIG。
疑難排解
如要排解使用開機指令碼在 VM 上設定容器時可能發生的問題,請查看開機指令碼記錄和容器記錄。
如要在 VM 執行個體上查看開機指令碼記錄,請執行下列指令:
sudo journalctl | grep "startup script"
如要查看 Docker 容器的記錄,請執行
docker logs
指令:docker logs CONTAINER_NAME
使用您的容器名稱取代
CONTAINER_NAME
。
如要排解其他問題,請參閱下列文件:
- Cloud Logging 總覽
- 搭配使用 Cloud Logging 與 Container-Optimized OS
- 排解 Docker 精靈問題
- 疑難排解與診斷
- 排解 Terraform 問題
- 執行基本網路伺服器時的疑難排解
- 為私人 VM 建構網際網路連線能力
搭配使用 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 支援團隊聯絡。