您可以透過兩種方式來建立並設定執行 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 執行這項工作。
主控台
前往「VM instances」(VM 執行個體) 頁面。
按一下 [Create instance] (建立執行個體)。
指定執行個體的「Name」(名稱)。
在「Container」(容器) 區段中,勾選 [Deploy a container image to this VM instance] (將容器映像檔部署至這個 VM 執行個體) 核取方塊。
指定您要使用的容器映像檔。
- 您可以指定來自 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
- 您可以指定來自 Container Registry 或 Artifact Registry 的映像檔。例如:
視需求按一下 [Advanced container options] (進階容器選項)。詳情請參閱「設定執行容器的選項」。
按一下 [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 執行個體,請執行下列操作:
在 Google Cloud 控制台中開啟 Compute Engine 執行個體建立頁面。
為您的執行個體指定名稱。
在「Containers」(容器) 區段中,清除 [Deploy a container image to this VM instance] (將容器映像檔部署至這個 VM 執行個體) 核取方塊。如果您想在 VM 上部署單一容器,這個選項就很實用。
在「Boot disk」(開機磁碟) 區段中,選取 Container-Optimized OS 映像檔。
按一下 [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_enabled 、update_disabled 或未設定。如果未設定,系統會使用里程碑的預設自動更新行為。 如果已啟用,行為取決於發布版本:
|
|
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 會使用 systemd
的 systemd-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_enabled
或 update_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