开发环境

1. 概览

本实验将演示旨在简化软件工程师在容器化环境中开发 Python 应用的开发工作流程的功能。典型的容器开发需要用户了解容器和容器构建流程的详细信息。此外,开发者通常必须中断工作流程,离开 IDE 以在远程环境中测试和调试应用。借助本教程中提到的工具和技术,开发者无需离开 IDE 即可高效处理容器化应用。

58a4cdd3ed7a123a.png

什么是 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. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

环境设置

在 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 Workstations 作为 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 内创建和管理集群。
  • 调试正在运行的应用。借助内置的 IDE 调试功能,您可以使用 Cloud Code for VS Code 和 Cloud Code for IntelliJ 在 IDE 中调试代码。
  • 探索部署情况。查看 Kubernetes 集群和 Cloud Run 服务的底层资源和元数据。您可以提取说明、查看日志、管理 Secret,或直接通过终端访问 pod。
  • 简化 Kubernetes 本地开发。适用于各种 IDE 的 Cloud Code 会在后台使用 Skaffold、Jib 和 Kubectl 等热门工具来帮助您实时并持续地获取有关您的代码的反馈。

e4e89eea9ff45dff.png

登录 Google Cloud

  1. 点击 Cloud Code 图标,然后选择“登录 Google Cloud”:

1769afd39be372ff.png

  1. 点击“Proceed to sign in”(继续登录)。

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 允许您将此值作为 build 参数传递。

生成清单

在终端中执行以下命令,以生成默认的 skaffold.yamldeployment.yaml

  1. 使用以下命令初始化 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 配置文件

  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”。

719c2fc0a7f9e84f.png

  1. 现在,该集群会显示在 Cloud Code 下的 Kubernetes 集群列表中。您可在此处浏览和探索集群。

7e5f50662d4eea3c.png

将容器部署到 Kubernetes

  1. 在 Cloud Shell Editor 底部的窗格中,选择 Cloud Code 

d99a88992e15fea9.png

  1. 在顶部显示的面板中,选择在 Kubernetes 上运行

如果系统提示您,请选择“是”以使用当前的 Kubernetes 上下文。

bfd65e9df6d4a6cb.png

此命令会启动源代码的 build,然后运行测试。构建和测试需要几分钟才能运行。这些测试包括单元测试和验证步骤,用于检查为部署环境设置的规则。此验证步骤已配置完毕,可确保您仍在开发环境中工作时收到有关部署问题的警告。

  1. 首次运行该命令时,屏幕顶部会显示一个提示,询问您是否需要当前 Kubernetes 上下文,请选择“是”以接受并使用当前上下文。
  2. 接下来,系统会显示一个提示,询问要使用哪个容器注册表。按 Enter 键接受提供的默认值
  3. 选择下方窗格中的“输出”标签页,查看进度和通知。使用下拉菜单选择“Kubernetes: Run/Debug”

9c87ccbf5d06f50a.png

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

804abc8833ffd571.png

构建和测试完成后,“Kubernetes:运行/调试”视图的“输出”标签页日志中会列出网址 http://localhost:8080。

  1. 在 Cloud Code 终端中,将光标悬停在输出中的第一个网址 (http://localhost:8080) 上,然后在显示的工具提示中选择“打开网页预览”。
  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. 前往“调试”视图,然后停止当前线程 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. 流程完成时。您会看到调试器已附加,并且“输出”标签页显示: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. 双击变量名称“message”,然后在弹出式窗口中将值更改为其他值,例如 "Greetings from Python"
  8. 点击调试控制面板中的“继续”按钮 607c33934f8d6b39.png
  9. 在浏览器中查看响应,其中现在显示了您刚刚输入的更新后的值。
  10. 按停止按钮 647213126d7a4c7b.png 停止“调试”模式,然后再次点击断点以移除断点。

6. 清理

恭喜!在本实验中,您从头开始创建了一个新的 Python 应用,并将其配置为可与容器有效搭配使用。然后,您按照传统应用堆栈中相同的开发者流程,将应用部署到远程 GKE 集群并进行调试。

如需在完成实验后进行清理,请执行以下操作:

  1. 删除实验中使用的文件
cd ~ && rm -rf ~/music-service
  1. 删除项目以移除所有相关基础架构和资源

上次更新时间:2023 年 3 月 22 日