概述
本章節中, 我們將學習如何藉由使用 regional persistent disks (地區性永久磁碟) 在 Kubernetes Engine 部署 WordPress, 配置一個高可用的應用。 Regional persistent disks 提供的兩個 zones 之間的同步, 這確保了你的應用可以正常運行, 就算其中一個區域發生了故障或停電事故。 使用 regional persistent disks 來部署 Kubernetes Engine 叢集將會讓你的應用更穩定, 安全, 可信賴。
你將實作的內容
- 建立一個 regional Kubernetes Engine 叢集
- 建立一個 Kubernetes StorageClass 資源, 這個資源是針對複製的 zone 所配置
- 使用 StorageClass 的 regional disk 部署 WordPress
- 藉由刪除 node 來模擬區域性的故障
- 確認 WordPress app 以及資料成功的遷徙到另一個複製的 zone
進行此章節的建議具備知識
這是 進階 課程, 在開始前, 至少有熟悉 Kubernetes 以及 WordPress 的基礎。 這邊有列出一些 Qwiklabs 可以讓你跟上進度:
- Kubernetes Engine: Qwik Start
- Running WordPress on App Engine Flexible Environment
- Hello Node Kubernetes
準備好了的話我們就往下吧!
設定及要求
在你按下 Start Lab 按鈕之前
詳讀所有的教學。 Labs 是有時間限制的, 而且你不可以停止時間倒數。 倒數計時器在你按下 Start Lab 按鈕後開始倒數, 上面顯示的時間為你還能使用 Cloud 資源的時間。
Qwiklabs 的手把手環境, 讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程, 而不是在一個模擬或是展示的環境。 我們透過提供你一個全新的、暫時的帳號密碼, 在計時器歸零之前, 你可以用來登入並存取 Google Cloud Platform。
你需要什麼?
要完成這個 lab, 你需要:
- 一個一般的網路瀏覽器(推薦 Chrome)
- 完成這個 lab 的時間
備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab
現在你已經開始你的 lab
, 你將會登入 Google Cloud Shell
主控台, 然後開啟命令列工具
如何開始你的 lab, 然後登入 Console?
- 按下 Start Lab 按鈕。 如果你需要付費, 會有一個彈出視窗來讓你選擇付費的方式。 在左方你會看到一個面板, 上面有暫時的帳號密碼, 你必須使用這些帳號密碼在此次 lab
- 複製
username
, 然後點擊Open Google Console
。 Lab 會開啟另外一個視窗, 顯示選擇帳號
的頁面
tip: 開啟一個全新的視窗,然後跟原本的頁面並排
- 在
選擇帳號
頁面, 點擊Use Another Account
- 登入頁面開啟, 貼上之前複製的
username
以及password
, 然後貼上
重要: 必須使用之前於 Connection Details 面板
取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號, 請不要用在這裡(避免產生費用)
- 點擊並通過接下來的頁面:
- 接受
terms
以及conditions
- 不要增加
recovery optoins
或two 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
資源
- 在
GCP 控制台
, 右上的工具列,點擊Open Cloud Shell
按鈕
- 在打開的對話框裡, 按下
START CLOUD SHELL
:
你可以立即按下 START CLOUD SHELL
當對話視窗打開。
連結並提供環境會需要一點時間。 當你連結成功, 這代表你已成功獲得授權, 且此專案已被設為你的專案ID, 例如:
gcloud 是 Google Cloud Platform
的 command-line 工具, 他已事先被安裝在 Cloud Shell
並且支援自動補齊
使用這個 command, 你可以列出有效帳戶名稱:
gcloud auth list |
輸出:
Credentialed accounts: |
範例輸出:
Credentialed accounts: |
你可以使用以下 command 來列出專案 ID
gcloud config list project |
輸出:
[core] |
範例輸出:
[core] |
gcloud
的完整文件可以參閱 Google Cloud gcloud Overview
建立 Regional Kubernetes Engine 叢集
打開新的 Cloud Shell 視窗, 先建立 regional Kubernetes Engine 叢集, 它橫跨了位於 us-west1
的 3 個 zones 。 首先, 透過以下指令, 取得 us-west1
的 server 配置, 並將結果匯出到環境變數:
- 取得 server 配置
CLUSTER_VERSION=$(gcloud container get-server-config --region us-west1 --format='value(validMasterVersions[0])')
export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
現在建立一個標轉的 Kubernetes Engine 叢集 (會花一些時間, 請忽略認為有關 node auto repairs
的警告)
gcloud container clusters create repd \ |
輸出:
Creating cluster repd...done. |
我們剛建立了一個 regional 的叢集 (位於 us-west1
), 並且在每個 zone 都個開 1 個 node (us-west1-a
, us-west1-b
, us-west1-c
)
從左邊選單到 Compute Engine 來檢視你的 instances:
gcloud
指令同時也自動的設置了 kubectl
指令連接到叢集
使用 Regional Disk 部署 App
現在你的 Kubernetes 叢集已經在運行中了, 你將做以下三件事:
- 安裝 Helm (管理 Kubernetes 套件的工具)
- 建立 Kubernetes StorageClass, 給 regional persistent disk 用的
- 部署 WordPress
安裝以及初始化 Helm, 以安裝 chart package
chart package 是由 Helm 所安裝的, 它含有運行 WordPress 所需的所有東西
執行以下指令安裝 Helm 到 Cloud Shell
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh初始化 Helm:
kubectl create serviceaccount tiller --namespace kube-system
kubectl create clusterrolebinding tiller-cluster-rule \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:tiller
helm init --service-account=tiller
until (helm version --tiller-connection-timeout=1 >/dev/null 2>&1); do echo "Waiting for tiller install..."; sleep 2; done && echo "Helm install complete"
現在 Helm 已經安裝完畢
建立 StorageClass
接下來你將建立 StorageClass
, 被 chart 使用來定義 regional disk 的 zones。 列在 StorageClass
中的 zones 須符合 Kubernetes Engine 叢集的 zones
執行以下指令建立 StorageClass
, 為 regional disk 所用:
kubectl apply -f - <<EOF |
輸出:
storageclass "repd-west1-a-b-c" created |
Questions and Answers
解釋以下的 command
- command:
helm init --service-account=tiller
until (helm version --tiller-connection-timeout=1 >/dev/null 2>&1); do echo "Waiting for tiller install..."; sleep 2; done && echo "Helm install complete" - Answer:
- until: 如果
until
後的判斷為 true 的話, 就停止迴圈, 否則就一直執行do
後的指令 - do echo 字串, sleep 2 秒
- done 當
until
的判斷為 true 時, 停止迴圈, 並 echo 字串
- until: 如果
解釋以下的 gcloud command
- Command:
kubectl create clusterrolebinding tiller-cluster-rule \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:tiller - Answer:
- 建立 clusterrolebinding, 名為 tiller-cluster-rule
- 要綁定的 clusterrole 為 cluster-admin, 為叢集中最高權限
- 要綁定的 service account 為 kube-system namespace 下面的 tiller
以下的 gcloud command 的意思是?
- Command:
kubectl create serviceaccount tiller --namespace kube-system
- Answer:
建立 service account, 名為 tiller, 建立在kube-system
這個 namespace
以下的 gcloud command 的意思是?
- Command:
CLUSTER_VERSION=$(gcloud container get-server-config --region us-west1 --format='value(validMasterVersions[0])')
export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false - Answer:
- 取得 Kubernetes Engine 的 server config
- 地區為 us-west1
- 從格式可知, 目標是取得 version
- 不使用 V1 版本的 API
解釋以下的 gcloud command
- Command:
gcloud container clusters create repd \
--cluster-version=${CLUSTER_VERSION} \
--machine-type=n1-standard-4 \
--region=us-west1 \
--num-nodes=1 \
--node-locations=us-west1-a,us-west1-b,us-west1-c - Answer:
- 建立一個 cluster, 名為 repd
- 指定 cluster-version
- 指定 machine-type 為 n1-standard-4
- 指定 region 為 us-west1
- node 的數量為 1
- node 的 location 為 us-west1-a, us-west1-b, us-west1-c, 所以就是每個區域都會開一台 node, 雖然上面是說 node = 1, 但是總共會開 3 台
留言