建立並設定執行個體

您可以透過兩種方式來建立並設定執行 Container-Optimized OS from Google 的 Compute Engine 執行個體。

簡單的情況下,如果您想在 VM 或代管執行個體群組中的每個 VM 上執行單一容器,則在定義執行個體或執行個體範本時,可以指定容器映像檔和選用的設定參數。Compute Engine 會使用最新版的 Container-Optimized OS 建立執行個體,並在 VM 啟動時啟動指定的容器。

進階情境中,您可以部署多個容器,並使用 cloud-init 設定 Docker 選項,您可以使用所選的 Container-Optimized OS 映像檔建立 Compute Engine 執行個體,然後視需要繼續進行設定。

建立簡易執行個體

使用這個方法,在 VM 上部署單一容器,並使用最新版本的 Container-Optimized OS。您可以使用 Google Cloud 主控台或 gcloud CLI 執行這項工作。

主控台

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

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

  2. 按一下 [Create instance] (建立執行個體)

  3. 指定執行個體的「Name」(名稱)。

  4. 在「Container」(容器) 區段中,勾選 [Deploy a container image to this VM instance] (將容器映像檔部署至這個 VM 執行個體) 核取方塊。

  5. 指定您要使用的容器映像檔

    • 您可以指定來自 Container Registry 或 Artifact Registry 的映像檔。例如:
      • gcr.io/cloud-marketplace/google/nginx1:1.15 會從 Google Cloud Marketplace 選取 NGINX 1.15 容器映像檔。
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 從 Artifact Registry 選取範例 hello-app 映像檔。
    • 如果您使用 Docker Hub 中的容器映像檔,請一律指定完整的 Docker 映像檔名稱。舉例來說,如要部署 Apache 容器映像檔,請指定如下的映像檔名稱:docker.io/httpd:2.4
  6. 視需求按一下 [Advanced container options] (進階容器選項)。詳情請參閱「設定執行容器的選項」。

  7. 按一下 [Create] (建立) 以建立執行個體、啟動執行個體並啟動容器。

gcloud

如要建立簡單的 VM 執行個體,請執行下列指令:

gcloud compute instances create-with-container instance-name \
    --container-image image-name

更改下列內容:

  • instance-name:新執行個體的名稱。
  • image-name:容器映像檔的名稱。

舉例來說,下列指令會建立名為 nginx-vm 的新 VM 執行個體,而該執行個體會啟動並執行 gcr.io/cloud-marketplace/google/nginx1:1.15 容器映像檔:

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

同樣地,您可以建立名為 hello-app 的新 VM 執行個體,以便在 Artifact Registry 中啟動並執行範例容器:

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

當您使用來自 Docker Hub 的容器映像檔時,一律必須指定完整的 Docker 映像檔名稱。舉例來說,如要部署 Apache 容器映像檔,請指定如下的映像檔名稱:

docker.io/httpd:2.4

如要在代管執行個體群組中的各個 VM 上執行單一容器,請在定義執行個體範本時指定容器映像檔名稱。詳情請參閱使用容器映像檔建立執行個體範本

針對進階情境建立執行個體

您可以使用這個方法選取特定的 Container-Optimized OS 映像檔、部署多個容器,以及使用 cloud-init 進行進階設定。

查看可用映像檔

您可在 Google Cloud 主控台的映像檔清單中,找到前置字串為 cos 的 Container-Optimized OS 映像檔。這些檔案會在 cos-cloud 專案下託管。您也可以執行下列指令,在指令列上查看所有目前可用的版本:

gcloud compute images list --project cos-cloud --no-standard-images

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

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

建立執行個體

您可以使用 Google Cloud 控制台、gcloud CLI 或 API 建立執行個體。

主控台

如要執行已安裝 Container-Optimized OS 和 Docker 的 Compute Engine 執行個體,請執行下列操作:

  1. 在 Google Cloud 控制台中開啟 Compute Engine 執行個體建立頁面。

    建立新的 Compute Engine 執行個體

  2. 為您的執行個體指定名稱

  3. 在「Containers」(容器) 區段中,清除 [Deploy a container image to this VM instance] (將容器映像檔部署至這個 VM 執行個體) 核取方塊。如果您想在 VM 上部署單一容器,這個選項就很實用。

  4. 在「Boot disk」(開機磁碟) 區段中,選取 Container-Optimized OS 映像檔。

  5. 按一下 [Create] (建立) 以建立並啟動執行個體。

gcloud

查看目前可用的映像檔,然後使用下列指令建立 cos 節點映像檔執行個體:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

更改下列內容:

  • instance-name:VM 執行個體的名稱。
  • image-name:執行個體的 Container-Optimized OS 映像檔名稱,可從可用映像檔清單取得。在前述範例中,我們可以使用 cos-beta-81-12871-44-0
  • compute-zone:執行個體的運算區域
  • machine-type-name:這個新執行個體要使用的機器類型。預設類型為 n1-standard-1

舉例來說,以下指令會使用 cos-beta-67-10575-13-0 映像檔建立名為 cos-test 的執行個體:

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

您可以為一次性實驗執行個體新增 --preemptible 標記。

API

在 API 中,建構一個建立執行個體的一般要求,但要包含 Container-Optimized OS 來源映像檔。例如:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/image-name'
      }
    }
  ]
}

設定執行個體

在某些情況下,您可能想要在執行個體啟動時進行額外設定。您可以將 cloud-init 工具與 Container-Optimized OS 搭配使用,以套用您透過 cloud-config 格式提供的設定資訊。

使用 cloud-init 搭配 Cloud 設定格式

Container-Optimized OS 映像檔包含 cloud-init,可做為啟動時設定執行個體的方法。cloud-init 工具會預期其設定位於執行個體中繼資料user-data 鍵值中。cloud-init 工具可解讀多種格式

以下是範例 cloud-init 檔案,說明如何建立使用者帳戶,以及建立由此使用者擁有的 systemd 服務,用於控制 Docker 忙碌盒容器的管理作業:

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

如要建立參照此 cloud-init 檔案的 Container-Optimized OS VM 執行個體,請使用 --metadata-from-file 指令列標記。假設 cloud-init 檔案在目前目錄中名為 filename,下列指令會將檔案內容指派給執行個體中繼資料中的 user-data 鍵,藉此建立 Container-Optimized OS 執行個體並觸發 cloud-init

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

更改下列內容:

  • instance-name:VM 執行個體的名稱。
  • image-name:執行個體的 Container-Optimized OS 映像檔名稱。例如:--image=cos-113-18244-85-29
  • filename:中繼資料檔案的名稱。

建立 Container-Optimized OS 執行個體時,可以設定其他中繼資料標記。由於這些屬性是簡單的鍵/值組合,您可以在 gcloud compute instances create 指令中使用 --metadata 標記建立屬性。此外,從97 個里程碑開始,您可以使用 gcloud compute project-info add-metadata 指令中的 --metadata 標記,在專案中繼資料中設定中繼資料標記。在執行個體層級定義的標記,優先順序高於在專案層級定義的標記。

您可以擴充上述範例,使用下列指令收集使用統計資料和當機傾印收集資料:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

其他中繼資料標記

中繼資料鍵 說明 預設行為
cos-update-strategy 指定自動更新行為。值可以是 update_enabledupdate_disabled 或未設定。
如果未設定,系統會使用里程碑的預設自動更新行為。
如果已啟用,行為取決於發布版本:
  • cos-dev 和 cos-beta:從對應映像檔系列中的最新 OS 版本更新
  • LTS 里程碑和 cos-stable:從相同里程碑的最新 OS 版本更新
  • 里程碑 < 117:預設為啟用
  • 里程碑 >= 117:預設為停用
cos-metrics-enabled 啟用當機傾印收集功能。值可能為:
true
false (預設值)。
預設為停用

連線至執行個體

您可以依照透過 SSH 連線至其他 Compute Engine 執行個體的同樣方式,透過 SSH 連線至執行 cos 節點映像檔的 VM 執行個體。

例如:

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

執行開機指令碼

您可以使用 startup-script 中繼資料鍵,透過中繼資料伺服器指定開機指令碼。您可以使用 Google Cloud CLI、API 或 Google Cloud 控制台提供開機指令碼。詳情請參閱「執行啟動指令碼」。

時間同步處理

里程碑 85之前,Container-Optimized OS 會使用 systemdsystemd-timesyncd 服務,透過 SNTP 協定將本機系統時鐘與遠端網路時間通訊協定 (NTP) 伺服器同步。/etc/systemd/timesyncd.conf 設定檔中的以下項目會顯示註解掉的預設設定值,協助管理員進行所需變更:

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

因此,可接受的根目錄距離上限為 5 秒,NTP 訊息的輪詢間隔最小和最大值分別為 32 和 2048 秒。

從里程碑 85 開始,Container-Optimized OS 會使用 chronyd 服務,透過 NTP 通訊協定將本機系統時鐘與遠端網路時間通訊協定 (NTP) 伺服器同步。/etc/chrony/chrony.conf 設定檔中的以下項目會顯示註解掉的預設設定值,協助管理員進行所需變更:

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

NTP 伺服器會從 eth0 的 DHCP 回應設定,通常是 Compute Engine 的中繼資料伺服器:

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

變更時區

Google 提供的 Container-Optimized OS 預設時區為 UTC0。依照下列範例所示,建立所要時區的符號連結:

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

請注意,/etc 是無狀態的,因此每次重新啟動時,時區都會重設為預設值 (UTC0)。

啟用或停用自動更新

啟用或停用自動更新有兩種方法。建議的方法是將 cos-update-strategy 執行個體中繼資料鍵分別設為 update_enabledupdate_disabled。例如:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

里程碑 97 開始,您也可以在專案中繼資料中停用或啟用自動更新功能:

gcloud compute project-info add-metadata \
    --metadata cos-update-strategy=update_disabled

您也可以透過 systemctl 在執行中的執行個體上停用自動更新:

sudo systemctl stop update-engine
sudo systemctl mask update-engine