1. 簡介
Google Cloud 提供多種部署網站的方式,每項解決方案提供不同的功能、功能和控管機制。Compute Engine 可讓您深入控管用於執行網站的基礎架構,但與 Google Kubernetes Engine、App Engine 等解決方案相比,還須採取一些額外的營運管理措施。有了 Compute Engine,就能精細控管基礎架構的各個層面,包括虛擬機器、負載平衡器等。今天,您將會部署範例應用程式,即 Fancy Store 的電子商務網站,以示範如何利用 Compute Engine 輕鬆部署網站及調度資源。
課程內容
- 如何建立 Compute Engine 執行個體
- 如何從來源執行個體建立執行個體範本
- 如何建立代管執行個體群組
- 如何設定健康狀態檢查與自動修復
- 如何建立 HTTP(S) 負載平衡
- 如何建立負載平衡器的健康狀態檢查
- 如何使用內容傳遞網路進行快取
完成程式碼研究室後,您的代管執行個體群組會包含執行個體,以便為網站提供自動修復、負載平衡、自動調度資源及滾動式更新。
必要條件
2. 環境設定
自修環境設定
提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID
。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟用 Compute Engine API
接下來,您需要啟用 Compute Engine API。啟用 API 後,您必須接受該 API 的服務條款和帳單責任。
在 Cloud Shell 中執行下列指令,啟用 Compute Engine API:
gcloud services enable compute.googleapis.com
Cloud Shell
雖然 Google Cloud 可以從筆電遠端操作,但在本程式碼研究室中,您將使用 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
您可以選擇各種不同的可用區。詳情請參閱「區域與可用區。
建立 Cloud Storage 值區
我們會使用 Cloud Storage 值區來儲存建構的程式碼,以及開機指令碼。在 Cloud Shell 中執行下列指令,建立新的 Cloud Storage 值區:
gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID
3. 複製原始碼存放區
您將使用 Fancy Store 現有的電子商務網站,網站是以單體至微服務存放區為基礎,做為網站的基礎。複製存放區中的原始碼,以便專注於部署至 Compute Engine 的各個層面。稍後,您會對程式碼執行小幅更新,藉此示範 Compute Engine 的更新簡易。
您可以透過下列連結自動將程式碼存放區複製到專案中,以及開啟 Cloud Shell 和內建程式碼編輯器:在 Cloud Shell 中開啟。
您也可以在 Cloud Shell 中使用下列指令,手動複製存放區:
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices
使用 Cloud Shell 命令提示字元執行程式碼的初始版本,讓應用程式能在本機執行。執行指令碼可能需要幾分鐘的時間,
./setup.sh
您需要盡職調查並測試應用程式。執行下列指令來啟動網路伺服器:
cd microservices npm start
輸出:
Products microservice listening on port 8082! Frontend microservice listening on port 8080! Orders microservice listening on port 8081!
按一下網頁預覽圖示,然後選取「透過以下通訊埠預覽:8080」,即可預覽應用程式。
系統應該會開啟新視窗,讓您查看花俏商店前端的實際運作情形!
瀏覽網站後,即可關閉這個視窗。如要停止網路伺服器處理程序,請在終端機視窗中按下 Control+C
(在 Macintosh 上為 Command+C
)。
4. 建立 Compute Engine 執行個體
您有了運作中的開發人員環境,就可以部署一些 Compute Engine 執行個體了!在下列步驟中,您將執行以下作業:
- 建立開機指令碼以設定執行個體。
- 複製原始碼並上傳至 Cloud Storage。
- 部署用於託管後端微服務的 Compute Engine 執行個體。
- 重新設定前端程式碼,以便利用後端微服務執行個體。
- 部署用於託管前端微服務的 Compute Engine 執行個體。
- 設定網路來允許通訊。
建立開機指令碼
開機指令碼會在每次啟動時,指示執行個體應採取何種行動,因此可自動設定執行個體。
按一下 Cloud Shell 功能區中的「鉛筆」圖示,開啟程式碼編輯器。
前往單體至微服務資料夾。按一下「File」>新增檔案,建立名為 start-script.sh 的檔案。
在新檔案中貼上下列程式碼,貼上您要修改的程式碼:
#!/bin/bash
# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc
# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm
# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/
# Install app dependencies.
cd /fancy-store/
npm install
# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app
# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
現在,在程式碼編輯器中找出 [DEVSHELL_PROJECT_ID] 文字,並替換成下列指令的輸出內容:
echo $DEVSHELL_PROJECT_ID
輸出內容範例:
my-gce-codelab-253520
startup-script.sh 中的程式碼行現在應如下所示:
gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/
開機指令碼會執行下列工作:
- 安裝 Logging 代理程式,當中會自動從 Syslog 收集記錄
- 安裝 Node.js 和 Supervisor,以 Daemon 形式執行應用程式
- 從 Cloud Storage 值區複製應用程式的原始碼與依附元件安裝作業
- 設定用於執行應用程式的 Supervisor 設定,確保應用程式會在管理員或程序意外結束或停止時重新啟動,並將應用程式的 stdout 和 stderr 傳送至 syslog,供記錄代理程式收集
現在,將建立的 start-script.sh 檔案複製到先前建立的 Cloud Storage 值區:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID
您可前往 https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh 存取這項服務。[BUCKET_NAME] 代表 Cloud Storage 值區的名稱。根據預設,只有獲得授權的使用者和服務帳戶可以查看檔案,因此無法透過網路瀏覽器存取。Compute Engine 執行個體可以自動透過服務帳戶存取。
將程式碼複製到 Cloud Storage 值區
執行個體啟動時,執行個體會從 Cloud Storage 值區提取程式碼,方便您將某些設定變數儲存在「.env」中這個程式碼檔案
將複製的程式碼複製到 Cloud Storage 值區:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
部署後端執行個體
您要部署的第一個執行個體會是後端執行個體,這個執行個體會存放訂單和產品微服務。
在 Cloud Shell 中執行以下指令,建立 f1-micro 執行個體,該執行個體設為使用先前建立的開機指令碼,並標記為後端執行個體,以便之後為該執行個體套用特定的防火牆規則:
gcloud compute instances create backend \ --machine-type=f1-micro \ --image=debian-9-stretch-v20190905 \ --image-project=debian-cloud \ --tags=backend \ --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
設定後端連線
部署應用程式的前端之前,您必須更新設定,使其指向部署的後端。
擷取後端的外部 IP 位址。如要查看這個位址,請前往後端執行個體的 EXTERNAL_IP 分頁下方,使用下列指令:
gcloud compute instances list
輸出內容範例:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 34.68.223.88 RUNNING
在 Cloud Shell 的程式碼編輯器中,前往「monolith-to-microservices」資料夾 >react-app。在「程式碼編輯器」選單中,選取「檢視」>切換隱藏檔案即可查看 .env 檔案。
編輯 .env 檔案,指向後端的外部 IP 位址。下方的 [BACKEND_ADDRESS] 代表後端執行個體的外部 IP 位址,這個位址是透過 gcloud 工具中的上一個指令決定得出。
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
儲存檔案。
使用下列指令重新建構回應應用程式,進而更新前端程式碼:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
將應用程式的程式碼複製到 Cloud Storage 值區:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
部署前端執行個體
程式碼設定完成後,您就能部署前端執行個體。執行下列指令,使用與之前類似的指令部署前端執行個體,但這個執行個體已標記為「前端」。
gcloud compute instances create frontend \ --machine-type=f1-micro \ --image=debian-9-stretch-v20190905 \ --image-project=debian-cloud \ --tags=frontend \ --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
設定網路
建立防火牆規則,允許前端存取通訊埠 8080,以及後端的通訊埠 8081 和 8082。防火牆指令會使用為應用程式執行個體建立時指派的標記。
gcloud compute firewall-rules create fw-fe \ --allow tcp:8080 \ --target-tags=frontend
gcloud compute firewall-rules create fw-be \ --allow tcp:8081-8082 \ --target-tags=backend
網站現在應可正常運作。確定前端的外部 IP 位址。尋找前端執行個體的 EXTERNAL_IP 即可確認位址:
gcloud compute instances list
輸出內容範例:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 104.198.235.171 RUNNING frontend us-central1-a f1-micro 10.128.0.3 34.69.141.9 RUNNING
執行個體會在幾分鐘內啟動並進行設定。執行下列指令,監控應用程式的完備性:
watch -n 5 curl http://[EXTERNAL_IP]:8080
看到與下列內容相似的輸出結果後,網站應該已就緒。在命令提示字元中按下 Control+C
(在 Macintosh 上為 Command+C
) 以取消手錶指令。
使用新的網路瀏覽器分頁前往 http://[FRONTEND_ADDRESS]:8080 以存取網站,其中 [FRONTEND_ADDRESS] 是上方決定的 EXTERNAL_IP。
請前往「產品」和「訂單」頁面,上述頁面應該也能正常運作。
5. 建立代管執行個體群組
為了讓應用程式調度資源,系統會建立代管執行個體群組,並使用前端和後端執行個體做為執行個體範本。
代管執行個體群組包含相同的執行個體,您可以在單一可用區中做為單一實體來管理。這類群組會主動讓執行個體保持可用 (即處於「執行中」狀態),以維持應用程式的高可用性。您將針對前端和後端執行個體使用代管執行個體群組,以提供自動修復、負載平衡、自動調度資源和滾動式更新。
從來源執行個體建立執行個體範本
您必須先建立執行個體範本做為群組的基礎,才能建立代管執行個體群組。執行個體範本可讓您定義機器類型、開機磁碟映像檔或容器映像檔、網路,以及新建虛擬機器 (VM) 執行個體時使用的其他執行個體屬性。您可以利用執行個體範本建立代管執行個體群組中的執行個體,甚至建立個別的執行個體。
如要建立執行個體範本,請使用您建立的現有執行個體。
首先,您必須停止這兩個執行個體。
gcloud compute instances stop frontend
gcloud compute instances stop backend
接著,從來源執行個體建立執行個體範本。
gcloud compute instance-templates create fancy-fe \ --source-instance=frontend
gcloud compute instance-templates create fancy-be \ --source-instance=backend
確認執行個體範本已建立:
gcloud compute instance-templates list
輸出內容範例:
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP fancy-be f1-micro 2019-09-12T07:52:57.544-07:00 fancy-fe f1-micro 2019-09-12T07:52:48.238-07:00
建立代管執行個體群組
您將建立兩個代管執行個體群組,一個用於前端,另一個用於後端。這些代管執行個體群組將使用先前建立的執行個體範本,並設為各群組中的兩個執行個體啟動。系統會根據「base-instance-name」自動為執行個體命名結尾加上隨機字元
gcloud compute instance-groups managed create fancy-fe-mig \ --base-instance-name fancy-fe \ --size 2 \ --template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \ --base-instance-name fancy-be \ --size 2 \ --template fancy-be
針對您的應用程式,前端微服務會在通訊埠 8080 上執行,而後端微服務會在通訊埠 8081 執行訂單,針對產品則在通訊埠 8082 執行。由於這些並非標準通訊埠,您必須指定已命名的通訊埠來識別這些通訊埠。已命名通訊埠為鍵/值組合中繼資料,代表服務名稱和執行中的通訊埠。您可以將已命名通訊埠指派給執行個體群組,表示群組中的所有執行個體皆可使用該服務。稍後設定的負載平衡器會使用這些資訊。
gcloud compute instance-groups set-named-ports fancy-fe-mig \ --named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \ --named-ports orders:8081,products:8082
設定自動修復功能
如要提高應用程式本身的可用性並驗證回應是否回應,您可以為代管執行個體群組設定自動修復政策。
自動修復政策必須利用以應用程式為基礎的健康狀態檢查,驗證應用程式的回應是否如預期。相較於只驗證執行個體是否處於 RUNNING 狀態 (此為預設行為),檢查應用程式是否有回應更為精確。
建立健康狀態檢查,指定執行個體在前端和後端連續傳回健康狀態不良達三次時,該檢查便會修復執行個體:
gcloud compute health-checks create http fancy-fe-hc \ --port 8080 \ --check-interval 30s \ --healthy-threshold 1 \ --timeout 10s \ --unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \ --port 8081 \ --request-path=/api/orders \ --check-interval 30s \ --healthy-threshold 1 \ --timeout 10s \ --unhealthy-threshold 3
建立防火牆規則,允許健康狀態檢查探測器連線至通訊埠 8080 和 8081 上的微服務:
gcloud compute firewall-rules create allow-health-check \ --allow tcp:8080-8081 \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --network default
將健康狀態檢查套用至個別服務:
gcloud compute instance-groups managed update fancy-fe-mig \ --health-check fancy-fe-hc \ --initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \ --health-check fancy-be-hc \ --initial-delay 300
請繼續進行程式碼研究室,預留自動修復功能一些時間,以監控群組中的執行個體。稍後您將模擬測試自動修復功能的失敗情形。
6. 建立負載平衡器
為了與我們的代管執行個體群組相輔相成,您將使用 HTTP(S) 負載平衡服務來提供流量至前端和後端微服務,並根據路徑規則使用對應,將流量傳送至適當的後端服務。這會為所有服務公開一個已平衡負載的 IP 位址。
如要進一步瞭解 Google Cloud 提供的負載平衡選項,請參閱負載平衡總覽。
建立 HTTP(S) 負載平衡
Google Cloud 提供許多不同類型的負載平衡,而您將使用 HTTP(S) 負載平衡處理流量。HTTP(S) 負載平衡的結構如下:
- 轉送規則將傳入要求導向至目標 HTTP Proxy。
- 目標 HTTP Proxy 會根據網址對應檢查每個要求,以決定適合要求的後端服務。
- 後端服務會根據已連接後端的服務規模、可用區和執行個體健康狀態,將每個要求導向合適的後端。系統會使用 HTTP 健康狀態檢查,驗證每個後端執行個體的健康狀態。如果後端服務設為使用 HTTPS 或 HTTP/2 健康狀態檢查,系統就會在前往後端執行個體時將要求加密。
- 負載平衡器和執行個體之間的工作階段可以使用 HTTP、HTTPS 或 HTTP/2 通訊協定。如果您使用 HTTPS 或 HTTP/2,後端服務中的每個執行個體都必須擁有 SSL 憑證。
建立健康狀態檢查,用於判斷哪些執行個體能夠為各項服務提供流量。
gcloud compute http-health-checks create fancy-fe-frontend-hc \ --request-path / \ --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \ --request-path /api/orders \ --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \ --request-path /api/products \ --port 8082
建立後端服務,做為負載平衡流量的目標。後端服務會使用您建立的健康狀態檢查和已命名通訊埠。
gcloud compute backend-services create fancy-fe-frontend \ --http-health-checks fancy-fe-frontend-hc \ --port-name frontend \ --global
gcloud compute backend-services create fancy-be-orders \ --http-health-checks fancy-be-orders-hc \ --port-name orders \ --global
gcloud compute backend-services create fancy-be-products \ --http-health-checks fancy-be-products-hc \ --port-name products \ --global
新增後端服務。
gcloud compute backend-services add-backend fancy-fe-frontend \ --instance-group fancy-fe-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-orders \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-products \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
建立網址對應。網址對應定義了應將哪些網址導向至哪些後端服務。
gcloud compute url-maps create fancy-map \ --default-service fancy-fe-frontend
建立路徑比對器,允許 /api/orders 和 /api/products 路徑轉送至各自的服務。
gcloud compute url-maps add-path-matcher fancy-map \ --default-service fancy-fe-frontend \ --path-matcher-name orders \ --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"
建立與已建立網址對應繫結的 Proxy。
gcloud compute target-http-proxies create fancy-proxy \ --url-map fancy-map
建立全域轉送規則,將公開 IP 位址及通訊埠與 Proxy 繫結在一起。
gcloud compute forwarding-rules create fancy-http-rule \ --global \ --target-http-proxy fancy-proxy \ --ports 80
更新設定
現在有了新的靜態 IP 位址,您需要將前端上的程式碼更新為指向新位址,而不是之前用於指向後端執行個體的臨時位址。
在 Cloud Shell 中,變更為 emoji-app 資料夾,其中含有保留設定的 .env 檔案。
cd ~/monolith-to-microservices/react-app/
找出負載平衡器的 IP 位址:
gcloud compute forwarding-rules list --global
輸出內容範例:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET fancy-http-rule 34.102.237.51 TCP fancy-proxy
使用您偏好的文字編輯器 (例如 GNU nano) 編輯 .env 檔案,指向負載平衡器的公開 IP 位址。[LB_IP] 代表後端執行個體的外部 IP 位址。
REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products
重建回應應用程式,以更新前端程式碼。
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
將應用程式程式碼複製到 GCS 值區。
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
更新前端執行個體
現在,您希望代管執行個體群組中的前端執行個體提取新程式碼。執行個體會在啟動時提取程式碼,因此您可以發出滾動式重新啟動指令。
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \ --max-unavailable 100%
測試網站
發出 rolling-action restart 指令後等待約 30 秒,讓系統有時間處理執行個體。接下來,檢查代管執行個體群組的狀態,直到執行個體出現在清單中為止。
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
清單項目出現後,按下 Control+C
(Macintosh 上為 Command+C
) 退出手錶指令。
確認服務已列為健康狀態良好。
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
輸出內容範例:
--- backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig status: healthStatus: - healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151 ipAddress: 10.128.0.7 port: 8080 - healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt ipAddress: 10.128.0.11 port: 8080 kind: compute#backendServiceGroupHealth
當清單項目出現在清單中後,按下 Control+C
(Macintosh 上的 Command+C
) 即可退出 watch
指令。
接著,應用程式就能透過 http://[LB_IP] 存取,其中 [LB_IP] 是為負載平衡器指定的 IP_ADDRESS,如要查看,請輸入下列指令:
gcloud compute forwarding-rules list --global
7. 調度 Compute Engine 資源
截至目前為止,您建立了兩個代管執行個體群組,每個群組都有兩個執行個體。這項設定可以正常運作,但無論負載多寡為何,都屬於靜態設定。現在,您將建立以使用率為基礎的自動調度資源政策,自動調度各個代管執行個體群組的資源。
根據使用率自動調整資源配置
如要建立自動調度資源政策,請在 Cloud Shell 中執行下列指令。他們會在代管執行個體群組中建立自動配置器,以便在負載平衡器的使用率超過 60% 時自動新增執行個體,並在負載平衡器使用率低於 60% 時移除執行個體。
gcloud compute instance-groups managed set-autoscaling \ fancy-fe-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \ fancy-be-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
啟用內容傳遞網路
另一項可協助調度資源的功能,是啟用 Cloud CDN (內容傳遞網路服務),為前端服務提供快取。為此,您可以在前端服務執行下列指令:
gcloud compute backend-services update fancy-fe-frontend \ --enable-cdn --global
現在,當使用者向負載平衡器要求內容時,要求會到達 Google 前端,該前端會先在 Cloud CDN 快取中尋找回應使用者要求。如果前端找到快取的回應,則會將快取的回應傳送給使用者。這稱為快取命中
否則,如果前端找不到要求的快取回應,則會直接向後端發出要求。如果該項要求的回應可以快取,則前端會將回應儲存在 Cloud CDN 快取中,以便將快取用於後續要求。
8. 更新網站
更新執行個體範本
現有的執行個體範本無法編輯。不過,由於執行個體為無狀態,且所有設定皆是透過開機指令碼完成,因此只有在您想變更範本設定的核心映像檔本身時,才需要變更執行個體範本。現在,您只要稍微變更一下,即可使用更大的機器類型。
更新前端執行個體,做為執行個體範本的基礎。更新期間,您需要先將檔案放入更新後的執行個體範本映像檔,接著更新執行個體範本、推出新範本,並確認檔案存在於代管執行個體群組執行個體中。
您將修改執行個體範本的機器類型,從 f1-micro 標準機器類型,改用搭載 4 個 vCPU 與 3840 MiB RAM 的自訂機器類型。
在 Cloud Shell 中執行下列指令,修改 Frontend 執行個體的機器類型:
gcloud compute instances set-machine-type frontend --machine-type custom-4-3840
建立新的執行個體範本:
gcloud compute instance-templates create fancy-fe-new \ --source-instance=frontend \ --source-instance-zone=us-central1-a
將更新後的執行個體範本推出至代管執行個體群組:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \ --version template=fancy-fe-new
監控更新狀態:
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig
如果有 1 個以上的執行個體處於 RUNNING 狀態,將 ACTION 設為 None,且 INSTANCE_TEMPLATE 設為新範本名稱 (fancy-fe-new),請複製其中一個機器的名稱,以便在下一個指令中使用。
Control+S
(在 Macintosh 上為 Command+S
) 退出手錶程序。
執行下列指令,查看虛擬機器是否正在使用新的機器類型 (custom-4-3840),其中 [VM_NAME] 是新建立的執行個體:
gcloud compute instances describe [VM_NAME] | grep machineType
預期的輸出內容示例如下:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840
變更網站內容
您的行銷團隊要求您變更網站的首頁。他們認為您應該針對公司和實際銷售的商品提供更多資訊。在這部分,您要在首頁加入一些文字,供行銷團隊參考!您的某位開發人員似乎已使用 index.js.new 檔案名稱建立變更。您可以將檔案複製到 index.js,這樣應該就會反映所做變更。按照下方說明操作,進行適當變更。
執行下列指令,將更新後的檔案複製到正確的檔案名稱,然後輸出檔案內容來驗證變更:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
顯示的程式碼應如下所示:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}
您已更新 React 元件,但需要建構 React 應用程式,才能產生靜態檔案。執行下列指令即可建構 React 應用程式,並將其複製到單體公開目錄:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
然後再次推送該程式碼至 Cloud Storage 值區。
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
使用滾動式更新推送變更
您現在可以強制重新啟動所有執行個體來提取更新。
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \ --max-unavailable=100%
發出滾動式重新啟動指令後,請等待約 30 秒讓執行個體有時間處理,然後查看代管執行個體群組的狀態,直到執行個體出現在清單中。
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
清單項目出現後,按下 Control+S
(Macintosh 上為 Command+S
) 退出手錶指令。
執行下列指令,確認服務已列為 healthy:
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
輸出內容範例:
--- backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig status: healthStatus: - healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151 ipAddress: 10.128.0.7 port: 8080 - healthState: HEALTHY instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt ipAddress: 10.128.0.11 port: 8080 kind: compute#backendServiceGroupHealth
清單項目出現後,按下 Control+S
(Macintosh 上為 Command+S
) 退出手錶指令。
如要撤銷內容傳遞網路中的快取內容,並確保顯示最新內容,請執行下列指令:
gcloud compute url-maps invalidate-cdn-cache fancy-map \ --path "/*"
透過 http://[LB_IP] 瀏覽網站,其中 [LB_IP] 是為負載平衡器指定的 IP_ADDRESS,您可以按照下列步驟找到這個 IP 位址:
gcloud compute forwarding-rules list --global
現在您應該可以看到新的網站變更。
模擬失敗情形
如要確認健康狀態檢查是否正常運作,請登入執行個體並停止服務。如要找出執行個體名稱,請執行以下指令:
gcloud compute instance-groups list-instances fancy-fe-mig
接著,透過安全殼層進入其中一個執行個體,其中 INSTANCE_NAME 是清單中的一個執行個體:
gcloud compute ssh [INSTANCE_NAME]
在執行個體中,使用 Supervisorctl 停止應用程式。
sudo supervisorctl stop nodeapp; sudo killall node
結束執行個體。
exit
監控維修作業。
watch -n 5 gcloud compute operations list \ --filter='operationType~compute.instances.repair.*'
找出下列輸出內容示例:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP repair-1568314034627-5925f90ee238d-fe645bf0-7becce15 compute.instances.repair.recreateInstance us-central1-a/instances/fancy-fe-1vqq 200 DONE 2019-09-12T11:47:14.627-07:00
偵測到修復作業後,Control+C
(Macintosh 上為 Command+S
) 結束手錶指令。此時,代管執行個體群組會重新建立執行個體來修復。
9. 清除所用資源
準備就緒後,如要清除已執行的所有活動,最簡單的方法就是刪除專案。刪除專案會刪除您在程式碼研究室中建立的負載平衡器、執行個體、範本和其他內容,以免產生非預期的週期性費用。在 Cloud Shell 中執行下列指令,其中 PROJECT_ID 是完整的專案 ID,而不只是專案名稱。
gcloud projects delete [PROJECT_ID]
如果確定要刪除,請輸入「Y」系統顯示提示時
10. 恭喜!
您已在 Compute Engine 上部署、擴充及更新網站。您現在已熟悉 Compute Engine、代管執行個體群組、負載平衡和健康狀態檢查功能!