Google Compute Engine

1. 簡介

大家好,感謝各位今天到場!準備好學習 Google Compute Engine 嗎?

在本程式碼研究室中,我們將透過 Guestbook 應用程式範例,探討 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 未使用的字元字串,您隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」該值。
  • 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

Google Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud 和 Compute Engine,但在本程式碼研究室中,我們將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

這部以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 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 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID 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 (stretch) 映像檔。如果您使用自己的自訂映像檔,請改為在此提供映像檔名稱。例如:--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 的防火牆規則,其中允許建立連入連線的 IP 位址區塊預設清單 (--source-ranges) 會設為 0.0.0.0/0 (任何位置)。

執行 gcloud compute firewall-rules create --help 即可查看所有預設值和可用選項,包括根據標記套用防火牆規則

5. 透過 SSH 連入執行個體

如要透過指令列 (仍在 Cloud Shell 中) 以 SSH 登入執行個體,請執行下列操作:

$ 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>

透過網頁介面列出執行個體,找出執行個體的外部 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

這會建立兩個額外的 VM 執行個體,名稱前置字串為 nginx-

現在應該會看到所有建立的執行個體!

$ 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。建議先從以下範例著手:

提供意見