1. 簡介
大家好,感謝各位參加今天的活動!準備好瞭解 Google Compute Engine 了嗎?
在這個程式碼研究室中,我們將透過留言板應用程式範例來探索 Compute Engine 的運作方式。
您將建立 Compute Engine 執行個體、部署 nginx,最後將網路負載平衡器設置在前端。您可以透過圖形控制台或指令列建立 Compute Engine 執行個體。本研究室將逐步引導您使用指令列。
Google Compute Engine 提供在 Google 資料中心運作的虛擬機器,這些虛擬機器會連線至其全球光纖網路。透過我們提供的工具和工作流程,您可以從單一執行個體擴充至全球負載平衡雲端運算架構。
這些 VM 可快速開機、具備永久磁碟儲存空間,以及提供穩定的效能。我們提供多種機器設定,包括預先定義的規格,你也可以根據自身特定需求,選擇合適的自訂機器類型來建立這些機器。
最後,Compute Engine 虛擬機器也是多項其他 Google Cloud 產品 (Kubernetes Engine、Cloud Dataproc、Cloud Dataflow 等) 所採用的技術。
2. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
- 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為
PROJECT_ID
),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後 - 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
Google Cloud Shell
雖然 Google Cloud 和 Compute Engine 可以在筆記型電腦上遠端運作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
這種以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。換言之,本程式碼研究室只需要在 Chromebook 上運作即可。
- 如要透過 Cloud 控制台啟用 Cloud Shell,只要點選「啟用 Cloud Shell」 圖示 即可 (整個佈建作業只需幾分鐘的時間,操作完畢即可)。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為 PROJECT_ID
。
gcloud auth list
指令輸出
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
指令輸出
[core] project = <PROJECT_ID>
如因故未設定專案,請直接發出以下指令:
gcloud config set project <PROJECT_ID>
正在尋找 PROJECT_ID
嗎?查看您在設定步驟中使用的 ID,或在 Cloud 控制台資訊主頁查詢:
根據預設,Cloud Shell 也會設定一些環境變數,方便您之後執行指令。
echo $GOOGLE_CLOUD_PROJECT
指令輸出
<PROJECT_ID>
- 最後,進行預設可用區和專案設定。
gcloud config set compute/zone us-central1-f
您可以選擇各種不同的可用區。詳情請參閱「區域與可用區。
3. 建立 Compute Engine 執行個體
如先前所述,我們會在本程式碼研究室中使用 gcloud
指令列。您可以透過控制台 (網址為 console.cloud.google.com) 完成上述所有操作。
首先,請使用預設設定建立執行個體:
$ gcloud compute instances create myinstance Created [...]. NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
記下 EXTERNAL_IP
- 稍後請特別注意
執行個體是使用幾種預設值建立:
- 您選擇的可用區。所有執行個體都位於可用區中。您可以在建立執行個體時,使用
--zone
旗標選取可用區,也可以設定預設可用區 (與在初始設定相同) 並省略--zone
旗標。 - 最新版 Debian GNU/Linux 9 (Pull) 映像檔。如果您使用自己的自訂映像檔,請改為提供映像檔名稱。例如:
--image my-own-image
。 n1-standard-1
機器類型。您可以選取其他機器類型,例如n1-highmem-4
或n1-highcpu-6
。如果所有預先定義的機器類型都不符合您的需求,請使用自訂機器類型。- 名稱與執行個體相同的根永久磁碟;該磁碟會自動連接至執行個體。
執行 gcloud compute instances create --help
查看所有可用的選項。
4. 為通訊埠 80 啟用防火牆
根據預設,Google Cloud Platform 僅允許少數通訊埠存取權。我們即將安裝 Nginx,因此請先在防火牆設定中啟用通訊埠 80。
$ gcloud compute firewall-rules create allow-80 --allow tcp:80 Created [...]. NAME: allow-80 NETWORK: default DIRECTION: INGRESS PRIORITY: 1000 ALLOW: tcp:80 DENY: DISABLED: False
這會建立名為「allow-80
」的防火牆規則,其中包含允許向內連線 (--source-ranges
) 建立傳入連線的預設 IP 位址區塊清單,並將這份清單設為「0.0.0.0/0
」(不限位置)。
執行 gcloud compute firewall-rules create --help
查看所有預設值和所有可用選項,包括依據標記套用防火牆規則的功能。
5. 透過 SSH 連線至執行個體
如何透過指令列透過 SSH 連線至執行個體 (仍在 Cloud Shell 中):
$ gcloud compute ssh myinstance Waiting for SSH key to propagate. Warning: Permanently added 'compute.12345' (ECDSA) to the list of known hosts. ... yourusername@myinstance:~#
這樣就大功告成了!其實很簡單(在作業環境中,請務必輸入通關密語 :)
您也可以直接從控制台 ( console.cloud.google.com),透過 SSH 登入執行個體,方法是前往 Compute Engine >VM 執行個體,然後按一下「SSH」。
6. 安裝 Nginx
登入 myinstance (新建的執行個體),安裝 nginx:
$ sudo su - # apt update # apt install -y nginx # service nginx start # exit
使用 myinstance 中的 curl
測試伺服器是否執行:
$ curl -s localhost | grep nginx <title>Welcome to nginx!</title> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and <a href="http://nginx.org/">nginx.org</a>.<br/> <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
透過網路 UI 列出執行個體,找出執行個體的外部 IP:
請務必從 SSH 結束,然後透過 Cloud Shell 執行下列指令:
$ gcloud compute instances list NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
接著前往 http://EXTERNAL_IP/
,其中 EXTERNAL_IP
是 myinstance 的公開 IP,您應該會看到 nginx 頁面:
7. 開機指令碼
使用開機指令碼在啟動時初始化執行個體,不必每次都設定一次。
建立名為 startup.sh
的檔案,並在其中加入下列內容 (您可以使用慣用的文字編輯器:vim
、nano
或 emacs
):
#! /bin/bash apt-get update apt-get install -y nginx service nginx start sed -i -- 's/nginx/Google Cloud Platform - '"$HOSTNAME"'/' /var/www/html/index.nginx-debian.html
如要使用這個開機指令碼建立新的 VM 執行個體,請直接輸入 :
$ gcloud compute instances create nginx \ --metadata-from-file startup-script=startup.sh Created [...]. NAME: nginx ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
瀏覽至「http://EXTERNAL_IP/
」,應該就會看到更新後的首頁。如果頁面在幾秒後仍未立即重試,表示主機可能仍在啟動 nginx。
8. 建立伺服器叢集
如要建立伺服器叢集,您必須先建立執行個體範本。建立執行個體範本後,您就能建立執行個體群組,管理要建立的執行個體數量。
首先,使用開機指令碼建立執行個體範本:
$ gcloud compute instance-templates create nginx-template \ --metadata-from-file startup-script=startup.sh Created [...]. NAME: nginx-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2022-03-18T15:10:37.621-07:00
接著來建立目標集區。透過目標集區,我們擁有單一存取點給群組中的所有執行個體,而且在後續步驟中是負載平衡的必要條件。
$ gcloud compute target-pools create nginx-pool Created [...]. NAME: nginx-pool REGION: us-central1 SESSION_AFFINITY: NONE BACKUP: HEALTH_CHECKS:
最後,使用範本建立執行個體群組:
$ gcloud compute instance-groups managed create nginx-group \ --base-instance-name nginx \ --size 2 \ --template nginx-template \ --target-pool nginx-pool Created [...]. NAME: nginx-group LOCATION: us-central1-f SCOPE: zone BASE_INSTANCE_NAME: nginx SIZE: 0 TARGET_SIZE: 2 INSTANCE_TEMPLATE: nginx-template AUTOSCALED: no
這會建立兩個名稱前置字串為 nginx-
的 VM 執行個體。
您現在應該可以看到所有已建立的執行個體!
$ gcloud compute instances list NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx-frpl ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx-ztg4 ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
9. 建立網路負載平衡器
Google Cloud Platform 有多種類型的負載平衡器,包括:
- L3 網路負載平衡器
- L7 HTTP(S) 負載平衡器
讓我們建立以執行個體群組為目標的區域網路負載平衡器:
$ gcloud compute forwarding-rules create nginx-lb \ --ports 80 \ --target-pool nginx-pool Created [...]. $ gcloud compute forwarding-rules list NAME: nginx-lb REGION: us-central1 IP_ADDRESS: X.X.X.X IP_PROTOCOL: TCP TARGET: us-central1/targetPools/nginx-pool
接著,您可以透過瀏覽器 http://IP_ADDRESS/
造訪負載平衡器,其中 IP_ADDRESS
是執行上述指令的結果。
考量到目前為止,我們不會建立 HTTP 負載平衡器。
10. 清理叢集
請別忘了關閉叢集,否則叢集會繼續運作並累積費用。下列指令會刪除 Google Compute Engine 執行個體、執行個體群組、指定目標群組和負載平衡器。
$ gcloud compute forwarding-rules delete nginx-lb $ gcloud compute instance-groups managed delete nginx-group $ gcloud compute target-pools delete nginx-pool $ gcloud compute instance-templates delete nginx-template $ gcloud compute instances delete nginx $ gcloud compute instances delete myinstance $ gcloud compute firewall-rules delete allow-80
上述每個指令都會要求您確認是否要刪除資源。
11. 接下來要做什麼?
恭喜,您已完成這個 Compute Engine 程式碼研究室!
其他 Compute Engine 功能
Google Compute Engine 提供一組豐富的功能。您也許可以進一步瞭解下列這些原因:
- 先佔 VM - https://cloud.google.com/compute/docs/instances/create-start-preemptible-instance
- 單一用戶群節點 - https://cloud.google.com/compute/docs/nodes/create-nodes
- GPU 與TPU:https://cloud.google.com/compute/docs/gpus/add-gpus
- Windows 執行個體:https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances
- 為資源加上標籤:https://cloud.google.com/compute/docs/labeling-resources
- 將 VM 遷移至 Compute Engine:https://cloud.google.com/compute/docs/vm-migration/
Google Kubernetes Engine
Google Kubernetes Engine (GKE) 是 Google Cloud 託管的全代管 Kubernetes 服務,我們提供多個程式碼研究室,協助您開始使用 GKE。歡迎參考這個實用的入門建議:
- Google Kubernetes Engine 程式碼研究室:https://codelabs.developers.google.com/codelabs/cloud-gke-workshop-v2
請提供您寶貴的意見
- 請花點時間完成簡短的問卷調查