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、语言工具、库等。
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. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
环境设置
在 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 CLI 命令来设置项目 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 内创建和管理集群。
- 调试正在运行的应用。借助内置的 IDE 调试功能,您可以使用 Cloud Code for VS Code 和 Cloud Code for IntelliJ 在 IDE 中调试代码。
- 探索部署情况。查看 Kubernetes 集群和 Cloud Run 服务的底层资源和元数据。您可以提取说明、查看日志、管理 Secret,或直接通过终端访问 pod。
- 简化 Kubernetes 本地开发。适用于各种 IDE 的 Cloud Code 会在后台使用 Skaffold、Jib 和 Kubectl 等热门工具来帮助您实时并持续地获取有关您的代码的反馈。

登录 Google Cloud
- 点击 Cloud Code 图标,然后选择“登录 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 允许您将此值作为 build 参数传递。
生成清单
在终端中执行以下命令,以生成默认的 skaffold.yaml 和 deployment.yaml
- 使用以下命令初始化 Skaffold
skaffold init --generate-manifests
在系统提示时,使用箭头键移动光标,并使用空格键选择选项。
选择:
8080表示端口y保存配置
更新 Skaffold 配置
- 更改默认应用名称
- 打开“
skaffold.yaml” - 选择当前设置为
dockerfile-image的图片名称 - 右键点击,然后选择“更改所有匹配项”
- 以
python-app格式输入新名称 - 进一步修改 build 部分,以
- 将
docker.buildArgs添加到卡券FLASK_DEBUG=1 - 同步设置,以将对
*.py文件的任何更改从 IDE 加载到正在运行的容器
修改后,skaffold.yaml 文件中的 build 部分将如下所示:
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 Editor 底部的窗格中,选择 Cloud Code 

- 在顶部显示的面板中,选择在 Kubernetes 上运行。
如果系统提示您,请选择“是”以使用当前的 Kubernetes 上下文。

此命令会启动源代码的 build,然后运行测试。构建和测试需要几分钟才能运行。这些测试包括单元测试和验证步骤,用于检查为部署环境设置的规则。此验证步骤已配置完毕,可确保您仍在开发环境中工作时收到有关部署问题的警告。
- 首次运行该命令时,屏幕顶部会显示一个提示,询问您是否需要当前 Kubernetes 上下文,请选择“是”以接受并使用当前上下文。
- 接下来,系统会显示一个提示,询问要使用哪个容器注册表。按 Enter 键接受提供的默认值
- 选择下方窗格中的“输出”标签页,查看进度和通知。使用下拉菜单选择“Kubernetes: Run/Debug”

- 在右侧的渠道下拉菜单中选择“Kubernetes:运行/调试 - 详细”,以查看其他详细信息和从容器实时传输的日志

构建和测试完成后,“Kubernetes:运行/调试”视图的“输出”标签页日志中会列出网址 http://localhost:8080。
- 在 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
- 刷新之前显示结果的浏览器标签页,即可查看更新后的结果。
调试
- 前往“调试”视图,然后停止当前线程
。如果系统询问,您可以选择在每次运行后进行清理。 
- 点击底部菜单中的
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 日