GCP Deployment Manager - 正式環境

概述

在本教程中, 你將會使用一個叫做 Deployment Manager 的基礎設施策劃工具來啟動一個服務, 並且使用 Stackdriver 來監控這個服務。 在 Stackdriver, 你將會使用 Stackdriver 主控台來設定基礎的黑盒子監控, 並且建立一個運行時間確認 (Uptime Check) 來觸發事件通知 (alert notification)

更精確的說, 你將會:

  1. 使用 Deployment Manager 範本來安裝並且設定一個進階的的 deployment
  2. 啟動 Stackdriver monitoring
  3. 設定 Stackdriver 運行時間確認以及通知
  4. 設定 Stackdriver 主控台, 設定兩個圖表, 一個顯示 CPU 使用率, 另一個顯示 ingress 流量
  5. 實施一個負載測試以及模擬服務斷供

Stackdriver Monitoring 提供性能, 運行時間, 以及雲端執行應用的健康度的資訊。 Stackdriver 從 Google Cloud Platform, Amazon Web Service, 被管理的運行時間探測, 應用儀表, 以及包含 Cassandra, Nginx, Apache Web Server, Elasticsearch, 等等的多樣的常用應用元件搜集指標, 事件, 以及中繼資料。
Stackdriver 攝入這些資料, 進而經由顯示面板, 圖表, 以及警告輸出讓使用者可以更理解的資訊。 Stackdriver 的警告功能讓你更簡單地與 Slack, PagerDuty, HipChat, Campfire, 以及更多的應用做整合。






目標

在本教程中, 你將會學習:

  • 從一系列的範本啟動一個雲端服務
  • 設定一個應用的基礎黑盒子監控
  • 建立一個運行時間確認來發現喪失功能的服務
  • 建立一個警告政策來觸發事件回應程序
  • 建立以及設定顯示面板, 進而做到動態更新的圖表
  • 給予應用負載, 進而測試監控以及警告規則
  • 模擬一個服務中斷, 進而測試監控以及警告規則






前言

本篇主要是利用 Google 的 Qwiklab 平台學習的同時,做的一份學習筆記
為避免翻譯誤解,專業術語在本篇將不會被翻譯,保留原文






設定及要求

在你按下 Start Lab 按鈕之前

詳讀所有的教學。 Labs 是有時間限制的, 而且你不可以停止時間倒數。 倒數計時器在你按下 Start Lab 按鈕後開始倒數, 上面顯示的時間為你還能使用 Cloud 資源的時間。

Qwiklabs 的手把手環境, 讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程, 而不是在一個模擬或是展示的環境。 我們透過提供你一個全新的、暫時的帳號密碼, 在計時器歸零之前, 你可以用來登入並存取 Google Cloud Platform。

你需要什麼?

要完成這個 lab, 你需要:

  • 一個一般的網路瀏覽器(推薦 Chrome)
  • 完成這個 lab 的時間

備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab

現在你已經開始你的 lab, 你將會登入 Google Cloud Shell 主控台, 然後開啟命令列工具

如何開始你的 lab, 然後登入 Console?

  1. 按下 Start Lab 按鈕。 如果你需要付費, 會有一個彈出視窗來讓你選擇付費的方式。 在左方你會看到一個面板, 上面有暫時的帳號密碼, 你必須使用這些帳號密碼在此次 lab

  1. 複製 username, 然後點擊 Open Google Console。 Lab 會開啟另外一個視窗, 顯示選擇帳號的頁面

tip: 開啟一個全新的視窗,然後跟原本的頁面並排

  1. 選擇帳號頁面, 點擊 Use Another Account

  1. 登入頁面開啟, 貼上之前複製的 username 以及 password, 然後貼上

重要:必須使用之前於 Connection Details 面板 取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號, 請不要用在這裡(避免產生費用)

  1. 點擊並通過接下來的頁面:
    • 接受 terms 以及 conditions
    • 不要增加 recovery optoinstwo factor authentication (因為這只是一個臨時帳號)
    • 不要註冊免費體驗

稍待一些時候, GCP 控制台將會在這個視窗開啟。



注意: 按下左上方位於 Google Cloud Platform 隔壁的 Navigation menu, 你可以瀏覽選單, 裡面有一系列的 GCP 產品以及服務





啟動 Google Cloud Shell

Google Cloud Shell 是載有開發工具的虛擬機器。 它提供了5GB的 home 資料夾, 並且運行在 Google Cloud 上。 Google Cloud Shell 讓你可以利用 command-line 存取 GCP 資源

  1. GCP 控制台, 右上的工具列,點擊 Open Cloud Shell 按鈕

  1. 在打開的對話框裡, 按下 START CLOUD SHELL:

你可以立即按下 START CLOUD SHELL 當對話視窗打開。

連結並提供環境會需要一點時間。 當你連結成功, 這代表你已成功獲得授權, 且此專案已被設為你的專案ID, 例如:

gcloudGoogle Cloud Platform 的 command-line 工具, 他已事先被安裝在 Cloud Shell 並且支援自動補齊

使用這個 command, 你可以列出有效帳戶名稱:

gcloud auth list

輸出:

Credentialed accounts:
- <myaccount>@<mydomain>.com (active)

範例輸出:

Credentialed accounts:
- google1623327_student@qwiklabs.net

你可以使用以下 command 來列出專案 ID

gcloud config list project

輸出:

[core]
project = <project_ID>

範例輸出:

[core]
project = qwiklabs-gcp-44776a13dea667a6

gcloud 的完整文件可以參閱 Google Cloud gcloud Overview






建立一個虛擬環境

執行以下指令來下載以及安裝套件清單

sudo apt-get update

Python 虛擬環境被使用來隔離系統內的套件安裝

sudo apt-get install virtualenv

如果 [Y/n] 彈出視窗, 按下 Enter

virtualenv -p python3 venv

啟動虛擬環境

source venv/bin/activate






複製 Deployment Manager 範本

Google 提供一組優秀的 Deployment 範本, 你可以從中學習並且在之上建立

在 Cloud Shell 輸入下面的指令來建立一個置放範本的資料夾, 並且複製範本

mkdir ~/dmsamples

到資料夾內

cd ~/dmsamples

複製範本

git clone https://github.com/GoogleCloudPlatform/deploymentmanager-samples.git

範例輸出:

remote: Counting objects: 1917, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 1917 (delta 11), reused 29 (delta 7), pack-reused 1874
Receiving objects: 100% (1917/1917), 426.86 KiB | 0 bytes/s, done.
Resolving deltas: 100% (1060/1060), done.






探索範例檔案

我們剛下載了一組範本到資料夾內, 讓我們更進一步地探索它們


列出範例範本

執行以下指令來導向並且列出 version2 的範例:

cd ~/dmsamples/deploymentmanager-samples/examples/v2

ls

你應該會看到輸出如下:

access_context_manager  cloud_functions  common               folder_creation  iam_custom_role  internal_lb_haproxy  quick_start   ssl                 vm_with_disks
access_control cloudkms container_igm gke igm-updater metadata_from_file regional_igm step_by_step_guide vpn_auto_subnet
bigtable cloud_router container_vm ha-service image_based_igm nodejs saltstack template_modules waiter
build_configuration cloudsql custom_machine_type htcondor instance_pool nodejs_l7 single_vm vlan_attachment
cloudbuild cloudsql_import dataproc iam internal_lb project_creation sqladmin vm_startup_script

不是所有的子資料夾都是獨立的專案。 例如說, 叫做 common 的資料夾含有會被使用在多個專案的範本。 如果你打算之後逐個研究, 使用 README 來當作導引吧。

nodejs 資料夾含有所有你在本教程中會需要的東西。 請注意這裡有 nodejs 資料夾以及 nodejs_17 資料夾, 使用 nodejs


列出並檢視 Nodejs deployment

導向並列出 version2 範例:

cd nodejs/python

ls

範例輸出:

frontend.py  frontend.py.schema  nodejs.py  nodejs.py.schema  nodejs.yaml

Deployment Manager 主要的設定檔是 nodejs.yaml 。 它使用了範本來產生基礎設施。 其他的檔案是範本。 範本使用了被定義在 nodejs.yaml 檔案中的變數來產生自訂義的結果。


frontend.py

frontend.py 包含 frontend.py.schema, 它依據 container_instance_template.y 建立了一個 instance 範本。 這個範本被用來建立一個 managed instance group 以及一個 autoscaler 。 範本也建立了一個含有單一公開 IP 轉發規則的負載平衡器。 它也將建立:

  • 一個指向 managed instance group 的 target pool
  • 附加在 target pool 的健康檢查


nodejs.py

nodejs.py 包含 nodejs.py.schema, 他帶來了前端以及後端的範本。

  • 注意, 前端的是 frontend.py
  • 後端是 /common/python/container_vm.py
  • 這是一個運行著 MySQL Docker 容器的 VM, 所以他不需要客制範本


其他檔案

  • /common/python/container_instance_template.py
  • /common/python/container_vm.py
  • /common/python/container_helper.py






客制 Deployment

現在你已經下載了, 也檢視過了 nodejs Deployment Manager 範本, 讓我們開始來客制 deployment


指定 zone

nodejs.yaml 需要輸入一個 zone, 讓我們加一個

  • 輸入以下指令來打開 zone 列表:
    gcloud compute zones list

複製 zone 的名字, 在設定檔會用到

  • vim 打開 nodejs.yaml, 所以你可以編輯 zone
    vim nodejs.yaml

nodejs.yaml 檔案包含

resources:
- name: nodejs
type: nodejs.py
properties:
zone: ZONE_TO_RUN

  • ZONE_TO_RUN 更換成靠近你的地區, 然後退出 vim 並儲存檔案

這個範例顯示 ZONE_TO_RUN 設定成 us-east1-d

resources:
- name: nodejs
type: nodejs.py
properties:
zone: us-east1-d


修改 instance group 中的最大 instance 數量

編輯 nodejs.py 檔案

  • 使用 vim 打開 nodejs.py

    vim nodejs.py
  • nodejs.py 檔案中, 核對 frontend 的擴充限制

    {
    'name': frontend,
    'type': 'frontend.py',
    'properties': {
    'zone': context.properties['zone'],
    'dockerImage': 'gcr.io/deployment-manager-examples/nodejsservice',
    'port': application_port,
    # Define the variables that are exposed to container as env variables.
    'dockerEnv': {
    'SEVEN_SERVICE_MYSQL_PORT': mysql_port,
    'SEVEN_SERVICE_PROXY_HOST': '$(ref.' + backend
    + '.networkInterfaces[0].networkIP)'
    },
    # If left out will default to 1
    'size': 2,
    # If left out will default to 1
    'maxSize': 20
    }
    },

目前的擴充限制是 20 (參考 maxSize)

  • 修改 maxSize 然後設成 4:
    {
    'name': frontend,
    'type': 'frontend.py',
    'properties': {
    'zone': context.properties['zone'],
    'dockerImage': 'gcr.io/deployment-manager-examples/nodejsservice',
    'port': application_port,
    # Define the variables that are exposed to container as env variables.
    'dockerEnv': {
    'SEVEN_SERVICE_MYSQL_PORT': mysql_port,
    'SEVEN_SERVICE_PROXY_HOST': '$(ref.' + backend
    + '.networkInterfaces[0].networkIP)'
    },
    # If left out will default to 1
    'size': 2,
    # If left out will default to 1
    'maxSize': 4
    }
    },

儲存並離開 vim






執行應用

現在你將使用 Deployment Manager 來部署並使他運行。 這將會建立基礎設施, 但是它不允許流量。 在 Deployment Manager 設定好基礎設施後, 你可以採用服務標籤。


部署應用

輸入以下指令, 使用 nodejs.yaml 設定檔建立一個名為 advanced-configuration 的應用

gcloud deployment-manager deployments create advanced-configuration --config nodejs.yaml

輸出:

The fingerprint of the deployment is PiYc6OsIFkWzQpCDklHvaA==
Waiting for create [operation-1529913842103-56f72d31872d9-90070017-aec5761d]...done.
Create operation operation-1529913842103-56f72d31872d9-90070017-aec5761d completed successfully.
NAME TYPE STATE ERRORS INTENT
advanced-configuration-application-fw compute.v1.firewall COMPLETED []
advanced-configuration-backend compute.v1.instance COMPLETED []
advanced-configuration-frontend-as compute.v1.autoscaler COMPLETED []
advanced-configuration-frontend-hc compute.v1.httpHealthCheck COMPLETED []
advanced-configuration-frontend-igm compute.v1.instanceGroupManager COMPLETED []
advanced-configuration-frontend-it compute.v1.instanceTemplate COMPLETED []
advanced-configuration-frontend-lb compute.v1.forwardingRule COMPLETED []
advanced-configuration-frontend-tp compute.v1.targetPool COMPLETED []

點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。

確認 instance 的最大數量:

  • Compute Engine > Instance groups

  • 點擊 advanced-configuration-frontend-igm

  • 點擊 Detail tab, 然後確認最大 instance 數量

你將看到它已經被設定成 4






確認應用正常運作中

應用會需要幾分鐘啟動。 你可以從 Deployment Manager 的主控台 (Navigation menu > Deployment Manager), 或從 Compute Engine 的主控台看到 instance (Navigation menu > Compute Engine > VM)

要確認應用正在運作中, 你將打開瀏覽器, 存取 port 8080, 然後檢視服務。 因為當 Deployment Manager 實作全球轉發規則時 (被指定在範本中), IP 會動態的被建立, 所以我們需要取得 IP 來測試應用是否正常


取得實作全球轉發規則的平衡負載 IP

  • 在 Cloud Shell 輸入以下指令來取得轉發規則
    gcloud compute forwarding-rules list

範例輸出

在輸出中, IP_ADDRESS 就是轉發 IP 。 記得把他複製下來, 在本教程中你會使用它好幾次

http://<your IP address>:8080

類似如下圖, 你會看到一個空白頁面

服務要正常運作會需要幾分鐘。 如果你看到一個錯誤, 像是 404, 等兩分鐘再試一次。

  • 現在, 從 IP 輸入紀錄訊息
    http://<your forwarding IP address>:8080/?msg=<enter_a_message>

enter_a_message 更換為任何一段訊息

下面是記錄訊息範例 - 你的 IP 會跟它的不同

http://35.196.56.153:8080/?msg=my dog has spots

在你輸入紀錄之後, 瀏覽器回返回 added

  • http://<your IP address>:8080 來檢視紀錄。 例如:

繼續建立更多的訊息記錄, 然後到 http://<your IP address>:8080 來檢視他們






建立 Stackdriver 工作區

Navigation menu, 點擊 Monitoring

當你看到 Stackdriver 顯示面板時, 你的工作區已經準備就緒了。






在 Stackdriver 設定一個運行時間確認以及警告政策

現在 Stackdriver 已經在運行中了, 你經設定警告以及顯示面板


設定運行時間確認

  • 在 Stackdriver 視窗, 點擊 Uptime Checks > Uptime Checks Overview 。 點擊 Add Uptime Check**
  • 指定數值如下:

  • 點擊 Test 來測試這個確認

如果測試失敗, 確認服務正常運作中, 且防火牆規則正確且存在。

  • 測試成功後, 點擊 Save

在儲存 Uptime Check 之後, Stackdriver 提供建立一個警告政策的選項






設定警告政策以及通知

  • 點擊 Create Alerting Policy

  • 為政策取名, 點擊 Save

  • Notification 選擇 “email”, 以及加入你的個人 email

在之後的步驟, 你將會觸發事件, 事件會經由 email 來通知你

  • 為政策取名
  • 點擊 Save

點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。






在顯示面板設定幾個有用的圖表

設定顯示面板

  • 在 Stackdriver 視窗, 點擊 Dashboards > Create Dashboard
  • 點擊 Untitled Dashboard, 然後更名為 DMDash
  • 點擊 Auto Refresh 圖案, 所以變更會自動顯示
  • 點擊 Add Chart

  • 設定圖表如下:

  • 點擊 Save

  • 點擊 Add Chart, 使用以下屬性, 增加另一個圖表到顯示面板:

  • 點擊 Save, DMDash 看起來應該如下:






建立設有 ApacheBench 的測試 VM

現在, 你已經在指定的地區, 設定一個針對流量的監控, 看看有沒有正常運作。 你將安裝並且使用 ApacheBench 來施加三種等級的負載到你的服務, 然後從你已經設定好的 Stackdriver 顯示面板來檢視


建立一台 VM

  • 在 Cloud Console, 點擊 Compute Engine > VM instances

  • 點擊 Create Instance, 在 Create an instance 對話框, 使用所有的預設設定。

  • 點擊 Create


安裝 ApacheBench

  • 還是在 VM Instance 視窗, 點擊 instance-1 的 SSH 按鈕來 SSH 連線到你剛剛建立的 VM
  • 輸入以下指令來安裝最新版的 ApacheBench:
sudo apt-get update
sudo apt-get -y install apache2-utils

點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。


施加負載以及監控

現在你將使用 ApacheBench 來施加負載到你的服務。 檢視 Stackdriver 的 DMDash 顯示面板來監控 CPU 使用率以及 Network Inbound Traffic 。 你也將能夠藉由將滑鼠移到線上來追蹤 instance 的數量, 或者到 Cloud 主控台 (Navigation menu > Compute Engine > VM)

  • 在 SSH 視窗, 輸入這個指令讓 ApacheBench 來施加負載到服務。 將 Your_IP 替換成你的轉發 IP 。 執行以下的指令兩到三次來創造流量。
ab -n 1000 -c 100 http://<Your_IP>:8080/

範例輸出

This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 35.196.195.26 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:
Server Hostname: 35.196.195.26
Server Port: 8080

Document Path: /
Document Length: 40 bytes

Concurrency Level: 100
Time taken for tests: 0.824 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 140000 bytes
HTML transferred: 40000 bytes
Requests per second: 1213.57 [#/sec] (mean)
Time per request: 82.402 [ms] (mean)
Time per request: 0.824 [ms] (mean, across all concurrent requests)
Transfer rate: 165.92 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 36 37 0.5 37 40
Processing: 36 43 8.7 38 73
Waiting: 36 43 8.7 38 73
Total: 73 80 9.1 75 112

Percentage of the requests served within a certain time (ms)
50% 75
66% 78
75% 81
80% 84
90% 95
95% 101
98% 106
99% 110
100% 112 (longest request)

等幾分鐘, 然後將負載提升到 5000

  • 執行以下的指令兩到三次來創造流量。
ab -n 5000 -c 100 http://<Your_IP>:8080/

等幾分鐘, 將負載提升到 10000

  • 執行以下的指令兩到三次來創造流量。
    ab -n 10000 -c 100 http://<Your_IP>:8080/

現在讓我們來看看, 當我們降低每台 instance 的 CPU 使用率時, 會發生什麼事

  • 在 cloud 主控台, 點擊 Navigation menu > Compute Engine > Instance group
  • 點擊你的 instance group 名稱, 然後 “Edit Group”
  • Target CPU usage 變更為 20
  • 點擊 Save

target CPU usage 是在這一個 instance group 當中的每一台 VM 的總使用率。 它控制何時自動擴充啟動。 在正式生產環境中, 通常你至少會設定 60% 。 在這個案例中, 你將會暫時性地將它設定成 20% 來更快地檢視自動擴充行為

  • 執行以下的指令兩到三次來創造流量。
    ab -n 10000 -c 100 http://<Your_IP>:8080/

可預測的行為: 當負載消耗了超過 20% 的群組累積 CPU, 將觸發自動擴充。 一個新的 instance 會被建立

現在看看當你把自動擴充關閉後, 會發生什麼事

  • Compute Engine > Instance groups
  • 點擊你的 instance group 名稱, 點擊 Edit Group
  • Autoscaling 變更為 Off
  • 點擊 Save

等幾分鐘, 然後執行以下指令來創造流量

ab -n 10000 -c 100 http://<Your_IP>:8080/

可預測的行為: 當 autoscaling 處於關閉狀態, 新的 instance 不會被建立, 所以累積 CPU 將會上升


結果

Stackdriver 顯示面板大概會有五分鐘的延遲才會看到改變






模擬服務中斷

移除防火牆規則來模擬服務中斷

  • 點擊 Navigation menu > VPC Network > Firewall rules
  • 勾選防火牆規則 allow-8080 旁邊的方格, 然後在頁面上方點擊 Delete
  • 你將會在 15 到 30 分鐘後收到通知 email






測試你的理解

下面有多重選擇的問題來鞏固你對本教程概念的理解,盡你所能的回答吧:






恭喜你已經完成本教程!

Kubernetes 學習筆記 使用 Kubernetes 來編排你的雲端

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×