GSP021

總覽
Kubernetes 是開放原始碼專案 (可透過 kubernetes.io 存取),能夠在許多不同環境中運作,包括筆記型電腦、高可用性的多節點叢集、公有雲、地端部署、虛擬機器和裸機環境。
在本實驗室中,使用 Kubernetes Engine 等代管環境可讓您專心體驗 Kubernetes,不必費心設定基礎架構。Kubernetes Engine 是專用於部署容器化應用程式的代管環境。這項服務整合多種最新技術,能協助開發人員提高效率、高效使用資源、將作業自動化,同時保有開放原始碼的靈活性,是加快推出速度的絕佳利器。
目標
本實驗室的內容包括:
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始研究室及登入 Google Cloud 控制台
-
點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
-
系統顯示視窗時,請按照下列步驟操作:
- 繼續操作 Cloud Shell 視窗。
- 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。
連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID:。輸出內容中有一行文字,宣告本工作階段的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
- 點按「授權」。
輸出內容:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需 gcloud
的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南。
Google Kubernetes Engine
- 在 Cloud Shell 環境中,輸入以下指令來設定可用區:
gcloud config set compute/zone {{{project_0.default_zone|Zone}}}
- 啟動要在本實驗室使用的叢集:
gcloud container clusters create io --zone {{{project_0.default_zone|Zone}}}
建立叢集時,系統會自動驗證您的身分。如果 Cloud Shell 因故中斷連線,請執行 gcloud container clusters get-credentials io
指令來重新驗證。
附註:建立叢集需要一些時間。Kubernetes Engine 會在背景佈建幾個虛擬機器供您使用。
工作 1:取得程式碼範例
從 Google Cloud Storage bucket 複製程式碼範例,即可取得程式碼。
- 從 Cloud Shell 指令列複製原始碼:
gcloud storage cp -r gs://spls/gsp021/* .
- 更改為本實驗室所需目錄:
cd orchestrate-with-kubernetes/kubernetes
- 列出檔案查看:
ls
程式碼範例的配置如下:
deployments/ /* Deployment manifests */
...
nginx/ /* nginx config files */
...
pods/ /* Pod manifests */
...
services/ /* Services manifests */
...
tls/ /* TLS certificates */
...
cleanup.sh /* Cleanup script */
您已取得程式碼,接著來試用 Kubernetes 吧!
工作 2:Kubernetes 簡要示範
Kubernetes 最簡單的入門方式就是運用 kubectl create 指令。
- 使用以下指令啟動 nginx 容器的單一執行個體:
kubectl create deployment nginx --image=nginx:1.27.0
現在 Kubernetes 已建立 Deployment。我們稍後會詳細介紹這個物件,目前您只需要瞭解 Deployment 能確保 Pod 正常運作,即使 Pod 所在的節點故障也不受影響。
Kubernetes 的機制是,所有容器都在 Pod 內運作。
- 使用 kubectl get pods 指令查看執行中的 nginx 容器:
kubectl get pods
- nginx 容器處於「運作中」狀態後,即可使用 kubectl expose 指令,在 Kubernetes 外部公開該容器:
kubectl expose deployment nginx --port 80 --type LoadBalancer
輸入指令後發生了什麼事?Kubernetes 實際上建立了附加公開 IP 位址的外部負載平衡器。連至該公開 IP 位址的用戶端,全會轉送至 Service 背後的 Pod,在本範例中指的是 nginx Pod。
- 接著,使用 kubectl get services 指令列出 Service:
kubectl get services
附註:ExternalIP
欄位可能需要幾秒鐘才會填入 Service 的外部 IP 位址。這是正常現象,只需每隔幾秒重新執行 kubectl get services
指令,直到該欄位填入位址即可。
- 在以下指令中加入外部 IP,從遠端連至該 Nginx 容器:
curl http://<External IP>:80
大功告成!Kubernetes 提供現成的簡易工作流程,只要透過 kubectl run 和 expose 指令就能輕鬆操作。
測試已完成的工作
請點選下方的「Check my progress」,確認實驗室進度。如果看到評估分數,代表您成功建立 Kubernetes 叢集並部署 Nginx 容器。
建立 Kubernetes 叢集並啟動 Nginx 容器簡單認識 Kubernetes 後,現在來深入瞭解各個元件和抽象化機制。
工作 3:關於 Pod
Kubernetes 的核心是 Pod。
Pod 代表並存放了一或多個容器。一般來說,如果多個容器之間有硬相依性,就可以包裝在同一個 Pod 中。
以下範例有一個包含單體和 nginx 容器的 Pod。

Pod 也有磁碟區。磁碟區是效期與 Pod 相同的資料磁碟,可供 Pod 中的容器使用。Pod 為所含內容提供共用命名空間,因此範例 Pod 中的兩個容器可互相通訊,並共用連接的磁碟區。
不同的 Pod 還會共用網路命名空間,因此每個 Pod 都有一個 IP 位址。
接著讓我們來深入瞭解 Pod。
工作 4:建立 Pod
Pod 可使用 Pod 設定檔建立,請先花點時間瞭解 fortune-app Pod 設定檔。
- 前往目錄:
cd ~/orchestrate-with-kubernetes/kubernetes
- 執行以下指令來查看設定檔:
cat pods/fortune-app.yaml
輸出結果會顯示公開設定檔:
apiVersion: v1
kind: Pod
metadata:
name: fortune-app
labels:
app: fortune-app
spec:
containers:
- name: fortune-app
image: "us-central1-docker.pkg.dev/qwiklabs-resources/spl-lab-apps/fortune-app:1.0.0"
ports:
- name: http
containerPort: 8080
resources:
limits:
cpu: 0.2
memory: "20Mi"
這裡有幾點要注意:
- Pod 是由一個容器 (fortune-app) 組成。
- 您開啟了用於 HTTP 流量的通訊埠 8080。
- 使用 kubectl 建立 fortune-app Pod:
kubectl create -f pods/fortune-app.yaml
- 接著檢查 Pod,請使用 kubectl get pods 指令,列出在預設命名空間運作的所有 Pod:
kubectl get pods
附註:fortune-app Pod 可能要過幾秒鐘才會開始運作。容器映像檔必須先從 Artifact Registry 提取出來才能執行。
- Pod 開始運作後,請使用 kubectl describe 指令取得 fortune-app Pod 的詳細資訊:
kubectl describe pods fortune-app
輸出內容會顯示許多 fortune-app Pod 資訊,包括 Pod 的 IP 位址和事件記錄等,這些資訊在疑難排解時可派上用場。
Kubernetes 可根據設定檔中的描述建立 Pod,並讓您在 Pod 運作時輕鬆查看相關資訊。到了這個階段,您已經可以建立 Deployment 所需的所有 Pod!
工作 5:與 Pod 互動
根據預設,Pod 會分配到私人 IP 位址,而且無法從叢集外部連線。請使用 kubectl port-forward 指令,將本機通訊埠對應至 fortune-app Pod 內部的通訊埠。
附註:在本實驗室的後續部分,您需要在多個 Cloud Shell 分頁設定 Pod 之間的通訊。如果指令需要透過第二或第三個指令殼層執行,操作說明中會醒目標示。
-
開啟第二個 Cloud Shell 終端機。您現在有兩個終端機,分別用於執行 kubectl port-forward 指令及下達 curl 指令。
-
在第 2 個終端機執行以下指令來設定通訊埠轉送:
kubectl port-forward fortune-app 10080:8080
- 接著,在第 1 個終端機使用 curl 開始與 Pod 通訊:
curl http://127.0.0.1:10080
容器傳回了一段幸運字串!
- 現在使用 curl 指令連線至安全端點,觀察會發生什麼事。請注意,這個端點需要驗證。
curl http://127.0.0.1:10080/secure
您應該會收到「未經授權」的錯誤訊息。
- 嘗試登入,從 fortune-app 應用程式取回驗證權杖:
curl -u user http://127.0.0.1:10080/login
- 看見登入提示時,使用超機密的密碼「
password
」登入。
登入後會傳回 JWT 權杖。
- Cloud Shell 不太支援複製較長的字串,因此請為該權杖建立環境變數。
TOKEN=$(curl -u user http://127.0.0.1:10080/login | jq -r '.token')
-
系統提示您輸入主機密碼時,再次輸入超機密的密碼:password
。
-
使用以下指令複製權杖,並透過 curl 使用該權杖連至安全端點:
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure
應用程式應該會傳回幸運字串,代表運作一切正常。
You have accessed the secure fortune!
- 使用 kubectl logs 指令查看 fortune-app Pod 的記錄。
kubectl logs fortune-app
- 開啟第 3 個終端機,並使用 -f 旗標取得即時記錄串流:
kubectl logs -f fortune-app
- 現在當您在第 1 個終端機使用 curl 與 fortune-app 互動,第 3 個終端機就會顯示更新後的記錄:
curl http://127.0.0.1:10080
- 使用 kubectl exec 指令在 fortune-app Pod 內執行互動式殼層,這個殼層非常適合用來在容器中排解問題:
kubectl exec fortune-app --stdin --tty -c fortune-app -- /bin/sh
- 舉例來說,在 fortune-app 容器內建立殼層後,可使用 ping 指令測試外部連線:
ping -c 3 google.com
- 使用完這個互動式殼層後,請務必登出。
exit
如您所見,只要使用 kubectl 指令,即可輕鬆與 Pod 互動。如需從遠端連至容器,或是取得登入殼層,Kubernetes 可提供所有必要資源。
工作 6:關於 Service
Pod 不會永久有效,可能受許多因素影響而停止或啟動 (例如未通過 liveness 或 readiness 檢查),並造成一個問題:
與一組 Pod 通訊會發生什麼情形?這些 Pod 重新啟動時可能會有不同的 IP 位址。
在這種時候,Service 便能派上用場。Service 可為 Pod 提供穩定的端點。
Service 會根據標籤決定要在哪個 Pod 上運作。如果 Pod 的標籤正確,Service 就會自動辨識並公開 Pod。
Service 為一組 Pod 提供的存取層級取決於 Service 類型。目前 Service 分為下列三種:
- ClusterIP (內部):這是預設類型,表示這項 Service 只會在叢集內部顯示。
- NodePort:為叢集中的每個節點指派可從外部存取的 IP。
- LoadBalancer:新增雲端服務供應商的負載平衡器,用來將 Service 的流量轉送至當中的節點。
接下來您將瞭解如何執行下列操作:
- 建立 Service
- 使用標籤選取器,對外公開一部分的 Pod
工作 7:建立 Service
在建立 Service 前,請先建立可處理 https 流量的安全 Pod。
- 如果先前變更過目錄,請務必返回 ~/orchestrate-with-kubernetes/kubernetes 目錄:
cd ~/orchestrate-with-kubernetes/kubernetes
- 查看安全的 fortune-app Service 設定檔:
cat pods/secure-fortune.yaml
- 建立 secure-fortune Pod 和相應設定資料:
kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf
kubectl create -f pods/secure-fortune.yaml
安全的 Pod 已建立完畢,接著要對外公開這個 Pod,為此,請建立 Kubernetes Service。
- 查看 fortune-app Service 設定檔:
cat services/fortune-app.yaml
輸出內容:
kind: Service
apiVersion: v1
metadata:
name: "fortune-app"
spec:
selector:
app: "fortune-app"
secure: "enabled"
ports:
- protocol: "TCP"
port: 443
targetPort: 443
nodePort: 31000
type: NodePort
附註:
輸出內容包含選取器,可用來自動尋找及公開含有「app: fortune-app」和「secure: enabled」標籤的 Pod。
您必須公開節點通訊埠,才能將外部流量從通訊埠 31000 轉送至位於通訊埠 443 的 nginx。
5. 使用 kubectl create 指令,透過設定檔建立 fortune-app Service:
kubectl create -f services/fortune-app.yaml
輸出內容:
service/fortune-app created
測試已完成的工作
請點選下方的「Check my progress」,確認實驗室進度。如果看到評估分數,代表您成功建立 fortune-app Pod 和 Service。
建立 fortune-app Pod 和 Service您是使用通訊埠公開 Service,因此如果其他應用程式嘗試繫結至其中一個伺服器的通訊埠 31000,可能會發生通訊埠衝突。
一般來說,Kubernetes 會處理通訊埠指派作業,在本實驗室,您可自行選擇通訊埠,方便稍後設定健康狀態檢查。
- 使用 gcloud compute firewall-rules 指令,允許流量傳送至公開節點通訊埠上的 fortune-app Service:
gcloud compute firewall-rules create allow-fortune-nodeport --allow tcp:31000
測試已完成的工作
請點選下方的「Check my progress」,確認實驗室進度。如果看到評估分數,代表您成功建立防火牆規則來允許通訊埠 31000 的 TCP 流量。
允許流量傳送至公開節點通訊埠上的 fortune-app Service
全部設定完成後,您應該就能從叢集外部連至 secure-fortune Service,不必使用通訊埠轉送。
- 首先,取得其中一個節點的外部 IP 位址:
gcloud compute instances list
- 使用 curl 嘗試連至 secure-fortune Service:
curl -k https://<EXTERNAL_IP>:31000
糟糕!作業逾時。發生了什麼事?
附註:來驗收一下您的學習成果吧!
請使用以下指令回答下方問題:kubectl get services fortune-app
kubectl describe services fortune-app
問題:
為何 fortune-app Service 未回應?
fortune-app Service 有幾個端點?
Pod 必須帶有哪些標籤,fortune-app Service 才能辨識?
提示:關鍵在於標籤。您將在下一節修正錯誤。
工作 8:為 Pod 新增標籤
目前 fortune-app Service 沒有端點。排解這類問題的方法之一,是使用 kubectl get pods 指令和標籤查詢。
- 您會發現正在運作的 Pod 帶有 fortune-app 標籤:
kubectl get pods -l "app=fortune-app"
- 但如果是「app=fortune-app」和「secure=enabled」呢?
kubectl get pods -l "app=fortune-app,secure=enabled"
您會發現這個標籤查詢並未傳回任何結果,看來需要加上「secure=enabled
」標籤。
- 使用 kubectl label 指令,為 secure-fortune Pod 新增缺少的 secure=enabled 標籤。完成後,您可以確認標籤是否已更新。
kubectl label pods secure-fortune 'secure=enabled'
kubectl get pods secure-fortune --show-labels
- 為 Pod 加上正確標籤後,請查看 fortune-app Service 的端點清單:
kubectl describe services fortune-app | grep Endpoints
輸出內容顯示有一個端點!
- 取得其中一個節點的外部 IP 位址:
gcloud compute instances list
- 使用 curl 嘗試連至 secure-fortune Service:
curl -k https://<EXTERNAL_IP>:31000
很好!連線成功。
測試已完成的工作
請點選下方的「Check my progress」,確認實驗室進度。如果看到評估分數,代表您成功為 Pod 新增標籤。
為 Pod 新增標籤工作 9:關於 Deployment
本實驗室的目標是協助您做好準備,以便在實際工作環境中調度資源及管理容器。在這種時候,Deployment 便能派上用場。Deployment 可透過宣告方式,確保運作中的 Pod 數量與使用者指定的所需 Pod 數量相同。
Deployment 的主要優點在於簡化 Pod 管理作業的低層級細節。Deployment 實際上會使用 ReplicaSet 來啟動及停止 Pod。如果 Pod 需要更新或調度資源,Deployment 就會處理。假如 Pod 因故停止運作,Deployment 也可重新啟動 Pod。
請看以下簡短範例:
Pod 的執行週期取決於建立時所在的節點。在上方範例中,Node3 已停止運作,並連帶使一個 Pod 停止運作。在這個情況下,Deployment 建立了新的 Pod 並在 Node2 上啟動該 Pod,因此您不必手動建立新的 Pod 及尋找節點。
很方便吧!
接下來,請運用您學到的所有 Pod 和 Service 知識,使用 Deployment 將 fortune-app 應用程式拆解成較小的 Service。
工作 10:建立 Deployment
您需要將 fortune-app 應用程式拆解成三個不同部分:
-
auth:為通過驗證的使用者產生 JWT 權杖。
-
fortune:為通過驗證的使用者提供幸運字串。
-
frontend:將流量轉送至 auth 和 fortune Service。
首先請為每項 Service 分別建立 Deployment。接著,您要為 auth 和 fortune Deployment 定義內部 Service,並為 frontend Deployment 定義外部 Service。完成後,即可像處理單體一樣與微服務互動,只不過每項微服務都能獨立調度資源和部署!
- 首先,檢查 auth Deployment 設定檔:
cat deployments/auth.yaml
(Output)
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
spec:
selector:
matchLabels:
app: auth
replicas: 1
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: "us-central1-docker.pkg.dev/qwiklabs-resources/spl-lab-apps/auth-service:1.0.0"
ports:
- name: http
containerPort: 8080
Deployment 會建立 1 個 auth 容器副本。
執行 kubectl create 指令來建立 auth Deployment 時,會產生一個符合 Deployment 資訊清單資料的 Pod。這表示您可以變更「Replicas」欄位指定的數字來調整 Pod 數量。
- 繼續建立 Deployment 物件:
kubectl create -f deployments/auth.yaml
- 接著來建立 auth Deployment 的 Service。使用 kubectl create 指令建立 auth Service:
kubectl create -f services/auth.yaml
- 使用相同指令建立並公開 fortune Deployment:
kubectl create -f deployments/fortune-service.yaml
kubectl create -f services/fortune-service.yaml
- 再次使用相同指令建立並公開 frontend Deployment:
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml
附註:您必須使用容器儲存部分設定資料,因此建立 frontend 會多出一個步驟。
- 與 frontend 互動,擷取其外部 IP 並執行 curl 指令:
kubectl get services frontend
附註:外部 IP 位址可能需要一點時間才能產生。如果 EXTERNAL-IP
欄狀態為「待處理」,請再次執行上方指令。
curl -k https://<EXTERNAL-IP>
您將會收到幸運字串!
測試已完成的工作
請點選下方的「Check my progress」,確認實驗室進度。如果看到評估分數,代表您成功建立 auth、fortune 和 frontend Deployment。
建立 Deployment恭喜!
恭喜!您已使用 Kubernetes 開發多服務應用程式。您可以運用在本實驗室學到的技巧,使用一組 Deployment 和 Service,在 Kubernetes 部署複雜的應用程式。
後續步驟/瞭解詳情
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 8 月 11 日
實驗室上次測試日期:2025 年 8 月 11 日
Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。