1. 總覽
本實驗室將示範各項功能和工具,協助軟體工程師在容器化環境中開發 Python 應用程式,簡化開發工作流程。一般容器開發作業需要使用者瞭解容器的詳細資料和容器建構程序。此外,開發人員通常必須中斷流程,離開 IDE 在遠端環境中測試及偵錯應用程式。有了本教學課程中提及的工具和技術,開發人員就能在 IDE 中有效處理容器化應用程式。

什麼是 Cloud Workstations?
Cloud Workstations 提供 Google Cloud 的代管開發環境,內建安全防護機制,而且開發環境經過預先設定,但可自訂。您可以透過瀏覽器型 IDE、多種本機程式碼編輯器 (例如 VSCode 或 JetBrains IDE,如 IntelliJ IDEA Ultimate 和 PyCharm Professional),或透過 SSH 存取 Cloud Workstations。
Cloud Workstations 使用下列資源:
- 管理員建立工作站叢集
- 在每個工作站叢集中,管理員會建立一或多個工作站設定,做為工作站範本。
- 開發人員可以建立工作站,定義開發環境,提供 Cloud IDE、語言工具、程式庫等。
IT 和安全管理員可以透過 Cloud Workstations 輕鬆佈建、調度資源、管理及保護開發環境,開發人員則可存取設定一致的開發環境,並使用可自訂的工具。
Cloud Workstations 可強化應用程式開發環境的資安態勢,協助您將安全防護措施提前納入開發流程。這項服務提供 VPC Service Controls、私人輸入或輸出、強制更新映像檔,以及 Identity and Access Management 存取權政策等安全防護功能。
什麼是 Cloud Code?
Cloud Code 提供 Kubernetes 和 Cloud Run 應用程式完整開發週期的 IDE 支援,從使用範本建立及自訂新應用程式,到執行已完成的應用程式,都能輕鬆完成。Cloud Code 提供可立即執行的範例、立即可用的設定程式碼片段,以及量身打造的偵錯體驗,讓您輕鬆使用 Kubernetes 和 Cloud Run 進行開發!
以下列舉 Cloud Code 的部分功能:
- 持續建構及執行應用程式
- 針對開發中的 Kubernetes 應用程式提供偵錯支援
- 串流及查看記錄
進一步瞭解其他 Cloud Code 功能。
學習目標
在本實驗室中,您將瞭解如何在 GCP 中使用容器進行開發,包括:
- 查看 Cloud Workstations
- 啟動工作站
- 查看 Cloud Code
- 在 Kubernetes 上偵錯
2. 設定和需求
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
- 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。 - 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
環境設定
在 Cloud Shell 設定專案的專案 ID 和專案編號,分別儲存為 PROJECT_ID 和 PROJECT_ID 變數。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
在本實驗室中,您會將程式碼部署至 GKE。您也會使用 Cloud Workstations 做為 IDE。
下方的設定指令碼會為您準備好基礎架構。
- 下載設定指令碼並設為可執行。
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
- 開啟
setup_with_cw.sh檔案,並編輯目前設為 CHANGEME 的密碼值 - 執行設定指令碼,建立本實驗室要使用的 GKE 叢集。設定程序大約需要 20 分鐘。
./setup_with_cw.sh &
- 在 Cloud 控制台中開啟 Cloud Workstations。請等待叢集處於
READY狀態,再繼續下一個步驟。 - 如果 Cloud Shell 工作階段已中斷連線,請按一下「重新連線」,然後執行 gcloud 指令列指令來設定專案 ID。執行指令前,請將下方的範例專案 ID 換成您的 Qwiklabs 專案 ID。
gcloud config set project qwiklabs-gcp-project-id
- 在終端機下載並執行下列指令碼,建立 Cloud Workstations 設定。
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
Cloud Workstations 叢集和設定
在 Cloud 控制台中開啟 Cloud Workstations。確認叢集處於 READY 狀態。

驗證現有設定的狀態。

建立新的工作站。

將名稱變更為 my-workstation,然後選取現有設定:codeoss-python。

啟動工作站
- 啟動工作站。工作站會在幾分鐘內啟動。

- 按一下網址列中的圖示,允許第三方 Cookie。


- 按一下「網站無法正常運作嗎?」。

- 按一下「允許 Cookie」。

- 工作站啟動後,您會看到 Code OSS IDE。
在工作站 IDE 的「開始使用」頁面中,按一下「標示為完成」

3. Cloud Code 總覽
查看 Cloud Code 提供的不同區段。
- Kubernetes 開發。在 IDE 中使用完全整合的 Kubernetes 開發與偵錯環境。直接在 IDE 中建立及管理叢集。
- 對運作中的應用程式進行偵錯。透過 Cloud Code for VS Code 和 Cloud Code for IntelliJ 內建的 IDE 偵錯功能,對 IDE 中的程式碼進行偵錯。
- 探索部署項目。查看 Kubernetes 叢集和 Cloud Run 服務的基本資源和中繼資料。您可以擷取說明、查看記錄檔、管理密鑰或直接將終端機新增至 pod。
- 簡化 Kubernetes 本機開發作業。適用於 IDE 的 Cloud Code 會在後端使用 Skaffold、Jib 和 Kubectl 等熱門工具,持續針對您的程式碼提供即時回饋。

登入 Google Cloud
- 按一下 Cloud Code 圖示,然後選取「Sign in to Google Cloud」(登入 Google Cloud):

- 按一下「Proceed to sign in」(繼續登入)。

- 查看終端機的輸出內容並開啟連結:

- 使用 Qwiklabs 學生憑證登入。

- 選取「允許」:

- 複製驗證碼,然後返回「工作站」分頁。

- 貼上驗證碼,然後按下 Enter 鍵。

如果看到這則訊息,請按一下「允許」按鈕,這樣就能複製並貼到工作站。

4. 建立新的 Python 啟動條件應用程式
在本節中,您將建立新的 Python 應用程式。
- 開啟新的終端機。

- 建立新目錄並開啟做為工作區
mkdir music-service && cd music-service
code-oss-cloud-workstations -r --folder-uri="$PWD"
- 建立名為
requirements.txt的檔案,並將下列內容複製到檔案中

Flask
gunicorn
ptvsd==4.3.2
- 建立名為
app.py的檔案,然後將下列程式碼貼入該檔案:
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
- 建立名為
Dockerfile的檔案,然後將下列內容貼入其中:
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
附註:FLASK_DEBUG=1 可讓您自動將程式碼變更重新載入 Python Flask 應用程式。這個 Dockerfile 可讓您將這個值做為建構引數傳遞。
產生資訊清單
在終端機中執行下列指令,產生預設的 skaffold.yaml 和 deployment.yaml
- 使用下列指令初始化 Skaffold
skaffold init --generate-manifests
系統提示時,請使用方向鍵移動游標,並按空格鍵選取選項。
您可以選擇:
8080,適用於連接埠y儲存設定
更新 Skaffold 設定
- 變更預設應用程式名稱
- 開啟「
skaffold.yaml」 - 選取目前設為
dockerfile-image的圖片名稱 - 按一下滑鼠右鍵,然後選擇「變更所有出現位置」
- 輸入新名稱,如
python-app - 進一步編輯建構部分,以
- 將
docker.buildArgs新增至票證FLASK_DEBUG=1 - 同步設定,將 IDE 中對
*.py檔案所做的任何變更載入至執行中的容器
編輯後,skaffold.yaml 檔案中的建構部分會如下所示:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
修改 Kubernetes 設定檔
- 變更預設名稱
- 開啟
deployment.yaml檔案 - 選取目前設為
dockerfile-image的圖片名稱 - 按一下滑鼠右鍵,然後選擇「變更所有出現位置」
- 輸入新名稱,如
python-app
5. 逐步完成開發程序
新增商業邏輯後,您現在可以部署及測試應用程式。下一節將展示如何使用 Cloud Code 外掛程式。這個外掛程式會與 skaffold 整合,簡化開發程序。在後續步驟中部署至 GKE 時,Cloud Code 和 Skaffold 會自動建構容器映像檔、將其推送至 Container Registry,然後將 your 應用程式部署至 GKE。這項作業會在幕後進行,將詳細資料從開發人員流程中抽象化。
新增 Kubernetes 叢集
- 新增叢集

- 選取 Google Kubernetes Engine:

- 選取專案。

- 選取在初始設定中建立的「python-cluster」。

- 現在 Cloud Code 下方的 Kubernetes 叢集清單中會顯示該叢集。從這裡瀏覽及探索叢集。

部署到 Kubernetes
- 在 Cloud Shell 編輯器底部的窗格中,選取 Cloud Code 

- 在頂端顯示的面板中,選取「在 Kubernetes 中執行」。
如果系統顯示提示,請選取「Yes」使用目前的 Kubernetes 環境。

這個指令會啟動原始碼的建構作業,然後執行測試。建構和測試程序需要幾分鐘才能完成。這些測試包括單元測試,以及檢查部署環境所設規則的驗證步驟。這個驗證步驟已設定完成,可確保您在開發環境中作業時,也能收到部署問題的警告。
- 首次執行指令時,畫面頂端會顯示提示,詢問您是否要使用目前的 Kubernetes 內容,請選取「Yes」接受並使用目前的內容。
- 接著系統會顯示提示,詢問要使用哪個容器登錄服務。按下 Enter 鍵接受預設值
- 選取下方窗格中的「輸出」分頁,即可查看進度和通知。使用下拉式選單選取「Kubernetes: Run/Debug」

- 在右側的管道下拉式選單中選取「Kubernetes: Run/Debug - Detailed」,即可查看其他詳細資料和容器的即時記錄檔串流

建構和測試完成後,「Kubernetes: Run/Debug」檢視畫面會顯示 http://localhost: 8080 網址,並記錄在「Output」分頁中。
- 在 Cloud Code 終端機中,將游標懸停在輸出內容中的第一個網址 (http://localhost:8080) 上,然後在顯示的工具提示中選取「開啟網頁預覽」。
- 系統會開啟新的瀏覽器分頁,並顯示以下訊息:
Hello, World!
熱重載
- 開啟
app.py檔案。 - 將問候語訊息變更為「
Hello from Python」
請注意,在 Output 視窗的 Kubernetes: Run/Debug 檢視畫面中,監控程式會將更新後的檔案與 Kubernetes 中的容器同步
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
- 切換至
Kubernetes: Run/Debug - Detailed檢視畫面後,您會發現系統會辨識檔案變更,然後建構並重新部署應用程式
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- 重新整理先前顯示結果的瀏覽器分頁,即可查看更新後的結果。
偵錯
- 前往「Debug」檢視畫面,然後停止目前的執行緒
。如果系統詢問,您可以選擇在每次執行後清理。 
- 按一下底部選單中的
Cloud Code,然後選取Debug on Kubernetes,即可在debug模式下執行應用程式。

- 在
Output視窗的Kubernetes Run/Debug - Detailed檢視畫面中,請注意 skaffold 會以偵錯模式部署這個應用程式。
- 首次執行時,系統會提示您容器內的來源位置。這個值與 Dockerfile 中的目錄有關。
按下 Enter 鍵接受預設值

應用程式會在幾分鐘內建構及部署完畢。如果偵錯工作階段中斷,請重新執行「開發工作階段」部分中的「在 Kubernetes 上偵錯」步驟。
- 程序完成時。您會發現附加的偵錯工具,以及顯示「
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully.」的「輸出」分頁,並列出網址 http://localhost:8080。
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- 底部的狀態列會從藍色變成橘色,表示目前處於偵錯模式。

- 在
Kubernetes Run/Debug檢視畫面中,請注意已啟動可偵錯的容器
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
運用中斷點
- 開啟
app.py檔案。 - 找出顯示
return message的陳述式 - 點選行號左側的空白處,在該行新增中斷點。系統會顯示紅色指標,表示已設定中斷點
- 重新載入瀏覽器,請注意偵錯工具會在該中斷點停止程序,並允許您調查在 GKE 中遠端執行的應用程式變數和狀態
- 按一下「變數」部分
- 按一下「Locals」,即可找到
"message"變數。 - 按兩下變數名稱「message」,然後在彈出式視窗中將值變更為其他內容,例如
"Greetings from Python" - 按一下偵錯控制面板中的「繼續」按鈕

- 在瀏覽器中查看回應,現在應該會顯示您剛輸入的更新值。
- 按下停止按鈕
即可停止「偵錯」模式,再次點選中斷點即可移除。
6. 清除
恭喜!在本實驗室中,您從頭開始建立新的 Python 應用程式,並設定該應用程式,使其能有效與容器搭配運作。然後,您按照傳統應用程式堆疊中的相同開發人員流程,將應用程式部署至遠端 GKE 叢集並進行偵錯。
完成實驗室後,請執行下列清理作業:
- 刪除實驗室中使用的檔案
cd ~ && rm -rf ~/music-service
- 刪除專案,移除所有相關基礎架構和資源
—
上次更新時間:2023 年 3 月 22 日