開發環境

開發環境

程式碼研究室簡介

subject上次更新時間:3月 22, 2023
account_circle作者:Andrey Shakirov

1. 總覽

本研究室介紹了相關功能和功能,方便軟體工程師在容器化環境中開發 Python 應用程式,簡化開發工作流程。一般的容器開發作業會要求使用者瞭解容器和容器建構程序的詳細資料。此外,開發人員通常必須中斷流程,從 IDE 中移出 IDE,才能在遠端環境中對應用程式進行測試及偵錯。有了本教學課程中提及的工具和技術,開發人員不必離開 IDE,就能有效地使用容器化應用程式。

58a4cdd3ed7a123a.png

什麼是 Cloud Workstations?

Cloud Workstations 提供 Google Cloud 的代管開發環境,內建安全防護機制,以及預先設定且可自訂的開發環境。透過瀏覽器式 IDE、多個本機程式碼編輯器 (例如 IntelliJ IDEA Ultimate 和 PyCharm Professional),透過瀏覽器式 IDE 或 SSH 存取 Cloud Workstations。

Cloud Workstations 會使用下列資源:

  • 管理員建立工作站叢集
  • 管理員會在每個工作站叢集中建立一或多個工作站設定,做為工作站範本。
  • 開發人員可以建立工作站,定義提供 Cloud IDE、語言工具、程式庫等開發環境。

Cloud Workstations 可讓 IT 和安全性管理員輕鬆佈建、擴充、管理及保護開發環境,並讓開發人員透過一致的設定和可自訂的工具存取開發環境。

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. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

環境設定

在 Cloud Shell 中,設定專案的專案 ID 和專案編號。請將其儲存為 PROJECT_IDPROJECT_ID 變數。

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
   
--format='value(projectNumber)')

在本研究室中,您會將程式碼部署至 GKE。您也將使用 Cloud 工作站做為 IDE。

下列設定指令碼可協助您完成這個基礎架構的設定。

  1. 下載設定指令碼並設為可執行狀態。
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. 開啟 setup_with_cw.sh 檔案,然後編輯目前設為 CHANGEME 的密碼值
  2. 執行設定指令碼,建立您將在本研究室中使用的 GKE 叢集。這項設定大約需要 20 分鐘。
./setup_with_cw.sh &
  1. 在 Cloud 控制台中開啟 Cloud Workstations。請等待叢集處於「READY」狀態,再執行後續步驟。
  2. 如果 Cloud Shell 工作階段已中斷連線,請按一下 [重新連線]然後執行 gcloud cli 指令設定專案 ID。在執行指令前,請先將下方的範例專案 ID 替換為 qwiklabs 專案 ID。
gcloud config set project qwiklabs-gcp-project-id
  1. 請在終端機中下載並執行以下指令碼,以便建立 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 狀態。

305e1a3d63ac7ff6.png

驗證現有設定的狀態。

2e23c2e9983d1ccf.png

建立新的工作站。

a53adeeac81a78c8.png

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

f052cd47701ec774.png

啟動工作站

  1. 啟動及啟動工作站。系統需要幾分鐘的時間才會啟動工作站。

682f8a307032cba3.png

  1. 按一下網址列中的圖示,允許第三方 Cookie。1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

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

36a84c0e2e3b85b.png

  1. 按一下 [允許 Cookie]。

2259694328628fba.png

  1. 工作站啟動後,您會看到 Code OSS IDE。

按一下「標示為完成」選用於「入門指南」 其中一個工作站 IDE

94874fba9b74cc22.png

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 等熱門工具,持續為程式碼提供即時回饋。

e4e89eea9ff45dff.png

登入 Google Cloud

  1. 按一下「Cloud Code」圖示,然後選取「登入 Google Cloud」:

1769afd39be372ff.png

  1. 按一下「繼續登入」。

923bb1c8f63160f9.png

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

517fdd579c34aa21.png

  1. 使用 Qwiklabs 學生憑證登入。

db99b345f7a8e72c.png

  1. 選取「允許」:

a5376553c430ac84.png

  1. 複製驗證碼並返回「工作站」分頁。

6719421277b92eac.png

  1. 貼上驗證碼,然後按 Enter 鍵。

e9847cfe3fa8a2ce.png

按一下「允許」按鈕,以便您複製貼上至工作站。

58149777e5cc350a.png

4. 建立新的 Python 範例應用程式

在本節中,您將建立新的 Python 應用程式。

  1. 開啟新的終端機。

c31d48f2e4938c38.png

  1. 建立新目錄,並以工作區開啟
mkdir music-service && cd music-service

code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. 建立名為 requirements.txt 的檔案,並將下列內容複製到檔案中

789e8389170bd900.png

Flask
gunicorn
ptvsd==4.3.2
  1. 建立名為 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')

  1. 建立名為 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.yamldeployment.yaml

  1. 使用下列指令初始化 Skaffold
skaffold init --generate-manifests

出現提示時,請使用箭頭移動遊標,並使用空格鍵來選取選項。

您可以選擇:

  • 通訊埠 8080
  • y:儲存設定

更新 Skaffold 設定

  • 變更預設應用程式名稱
  • 開啟「skaffold.yaml
  • 選取目前設為「dockerfile-image」的映像檔名稱
  • 按一下滑鼠右鍵,選擇「變更所有出現項目」
  • 輸入新名稱,格式為「python-app
  • 進一步編輯建構部分
  • 新增 docker.buildArgs 以傳遞 FLASK_DEBUG=1
  • 同步處理設定,將 *.py 檔案的任何變更從 IDE 載入執行中的容器

編輯之後,skaffold.yaml 檔案中的建構部分會如下所示:

build:
 
artifacts:
 
- image: python-app
   
docker:
     
buildArgs:
       
FLASK_DEBUG: "1"
     
dockerfile: Dockerfile
   
sync:
     
infer:
     
- '**/*.py'

修改 Kubernetes 設定檔

  1. 變更預設名稱
  • 開啟 deployment.yaml 檔案
  • 選取目前設為「dockerfile-image」的映像檔名稱
  • 按一下滑鼠右鍵,選擇「變更所有出現項目」
  • 輸入新名稱,格式為「python-app

5. 逐步完成開發程序

新增商業邏輯後,您就可以部署及測試應用程式。下一節將說明如何使用 Cloud Code 外掛程式。此外,這個外掛程式能與 skaffold 整合,為您簡化開發程序。按照下列步驟部署至 GKE 時,Cloud Code 和 Skaffold 會自動建構容器映像檔並推送至 Container Registry,然後將 your 應用程式部署至 GKE。這會在背景執行,將詳細資料從開發人員流程中抽離出來。

新增 Kubernetes 叢集

  1. 新增叢集

62a3b97bdbb427e5.png

  1. 選取 Google Kubernetes Engine:

9577de423568bbaa.png

  1. 選取專案。

c5202fcbeebcd41c.png

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

719c2fc0a7f9e84f.png

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

7e5f50662d4eea3c.png

部署到 Kubernetes

  1. 在 Cloud Shell 編輯器底部的窗格中,選取「Cloud Code」 圖示 。

d99a88992e15fea9.png

  1. 在頂端的面板中,選取「Run on Kubernetes」

如果出現提示,請選取「是」以使用目前的 Kubernetes 結構定義。

bfd65e9df6d4a6cb.png

這個指令會啟動原始碼建構作業,然後執行測試。建構與測試會在幾分鐘內執行。這些測試包括單元測試和驗證步驟,可檢查針對部署環境設定的規則。這個驗證步驟已經過設定,可確保您即使仍在開發環境中工作,也會收到部署問題的警告。

  1. 首次執行指令時,畫面頂端會顯示提示,詢問您是否要使用目前的 Kubernetes 環境,請選取「是」。可接受並使用目前的內容。
  2. 接著系統會顯示提示,詢問要使用哪個 Container Registry。按下 Enter 鍵即可接受提供的預設值
  3. 選取「Output」(輸出)位於下方窗格中的分頁,即可查看進度和通知。選取「Kubernetes:執行/偵錯」

9c87ccbf5d06f50a.png

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

804abc8833ffd571.png

建構與測試完成後,「輸出」分頁記錄中的網址 http://localhost:8080 就會列在「Kubernetes: Run/Debug」中。檢視畫面。

  1. 在 Cloud Code 終端機中,將滑鼠遊標懸停在輸出的第一個網址 (http://localhost:8080) 上,然後在顯示的工具提示中選取「Open Web Preview」。
  2. 系統將開啟新的瀏覽器分頁並顯示以下訊息:Hello, World!

熱重新載入

  1. 開啟 app.py 檔案。
  2. 將問候語訊息變更為「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
...
  1. 如果您切換至 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
  1. 重新整理原先顯示結果的瀏覽器分頁,即可查看更新後的結果。

偵錯

  1. 前往「Debug」(偵錯) 檢視畫面,並停止目前的執行緒 647213126d7a4c7b.png。如果畫面上出現提示,您可以在每次執行後選擇清除所用資源。
  2. 70d6bd947d04d1e6.png
  3. 按一下底部選單中的 Cloud Code 並選取 Debug on Kubernetes,即可透過 debug 模式執行應用程式。

b9465c6825caf685.png

  • 請注意,在 Output 視窗的 Kubernetes Run/Debug - Detailed 檢視畫面中,Skaffold 會在偵錯模式部署這個應用程式。
  1. 這是第一次執行提示時,系統會詢問來源在容器內的位置。這個值與 Dockerfile 中的目錄相關。

按下 Enter 鍵即可接受預設值

fccc866f32b5ed86.png

建構及部署應用程式需要幾分鐘的時間。如果偵錯工作階段連線中斷,請重新執行「在 Kubernetes 上偵錯」步驟專區。

  1. 程序完成後。您會發現偵錯工具已附加在「Output」(輸出) 分頁中,並顯示 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
  1. 底部狀態列的顏色會從藍色變成橘色,表示目前處於偵錯模式。

b2abd61a129ed76.png

  1. 請注意,在 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
***********************************

善用中斷點

  1. 開啟 app.py 檔案。
  2. 找出讀取 return message 的陳述式
  3. 按一下行號左側的空白處,為該行新增中斷點。系統會顯示紅色指標,說明已設定中斷點
  4. 重新載入瀏覽器並留意偵錯工具,會在中斷點停止程序,然後針對在 GKE 中從遠端執行的應用程式調查變數和狀態
  5. 按一下「變數」部分。
  6. 按一下「Locals」,即可找到 "message" 變數。
  7. 按兩下變數名稱「訊息」在彈出式視窗中,將值變更為其他值,例如 "Greetings from Python"
  8. 按一下偵錯控制台中的「繼續」按鈕 607c33934f8d6b39.png
  9. 請在瀏覽器中查看回應,以便顯示剛才輸入的更新值。
  10. 停止「Debug」模式,方法是按下停止按鈕 647213126d7a4c7b.png,然後再次按一下中斷點來移除中斷點。

6. 清除所用資源

恭喜!在本研究室中,您已從頭開始建立新的 Python 應用程式,並設定為有效率地與容器搭配使用。接著,您按照傳統應用程式堆疊中的相同開發人員流程,將應用程式部署至遠端 GKE 叢集,並進行偵錯。

如要在完成研究室後清除所用資源,請按照下列步驟操作:

  1. 刪除研究室中使用的檔案
cd ~ && rm -rf ~/music-service
  1. 刪除專案,移除所有相關的基礎架構和資源

上次更新時間:2023 年 3 月 22 日