Google Compute Engine

1. 簡介

大家好,感謝各位參加今天的活動!準備好瞭解 Google Compute Engine 了嗎?

在這個程式碼研究室中,我們將透過留言板應用程式範例來探索 Compute Engine 的運作方式。

您將建立 Compute Engine 執行個體、部署 nginx,最後將網路負載平衡器設置在前端。您可以透過圖形控制台或指令列建立 Compute Engine 執行個體。本研究室將逐步引導您使用指令列。

ComputeEngine_128px.png

Google Compute Engine 提供在 Google 資料中心運作的虛擬機器,這些虛擬機器會連線至其全球光纖網路。透過我們提供的工具和工作流程,您可以從單一執行個體擴充至全球負載平衡雲端運算架構。

這些 VM 可快速開機、具備永久磁碟儲存空間,以及提供穩定的效能。我們提供多種機器設定,包括預先定義的規格,你也可以根據自身特定需求,選擇合適的自訂機器類型來建立這些機器。

最後,Compute Engine 虛擬機器也是多項其他 Google Cloud 產品 (Kubernetes Engine、Cloud Dataproc、Cloud Dataflow 等) 所採用的技術。

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為 PROJECT_ID),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後
  • 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

Google Cloud Shell

雖然 Google Cloud 和 Compute Engine 可以在筆記型電腦上遠端運作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

這種以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。換言之,本程式碼研究室只需要在 Chromebook 上運作即可。

  1. 如要透過 Cloud 控制台啟用 Cloud Shell,只要點選「啟用 Cloud Shell」 圖示 b125d9eb26a46cc5.png 即可 (整個佈建作業只需幾分鐘的時間,操作完畢即可)。

1067942a9a93f70.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

連線至 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 控制台資訊主頁查詢:

cc3895eeac80db2c.png

根據預設,Cloud Shell 也會設定一些環境變數,方便您之後執行指令。

echo $GOOGLE_CLOUD_PROJECT

指令輸出

<PROJECT_ID>
  1. 最後,進行預設可用區和專案設定。
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-4n1-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」

bfbc03997a41946e.png

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:

dcc4e56e82ba2603.png

請務必從 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_IPmyinstance 的公開 IP,您應該會看到 nginx 頁面:

49b52b9354041f3b.png

7. 開機指令碼

使用開機指令碼在啟動時初始化執行個體,不必每次都設定一次。

建立名為 startup.sh 的檔案,並在其中加入下列內容 (您可以使用慣用的文字編輯器:vimnanoemacs):

#! /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 有多種類型的負載平衡器,包括:

讓我們建立以執行個體群組為目標的區域網路負載平衡器:

$ 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 提供一組豐富的功能。您也許可以進一步瞭解下列這些原因:

Google Kubernetes Engine

Google Kubernetes Engine (GKE) 是 Google Cloud 託管的全代管 Kubernetes 服務,我們提供多個程式碼研究室,協助您開始使用 GKE。歡迎參考這個實用的入門建議:

請提供您寶貴的意見