使用 Cloud Shell 进行开发Cloud Code

1. 概览

Cloud Shell 是一个在线开发和运营环境,您可通过浏览器随时随地访问。您可以利用其预加载了实用程序(如 gcloud 命令行工具、kubectl 等)的在线终端管理资源,您还可以使用在线 Cloud Shell 编辑器开发、构建、调试和部署云端应用

在此实验中,您将使用 Cloud Shell、Cloud Shell 编辑器,在本地模拟器和实际服务上使用 Cloud Code 创建、部署和测试基于容器的应用。

学习内容

  • 浏览并熟悉 Cloud Shell 的主要功能
  • 练习使用不同的 Cloud Shell 用法模式
  • 自定义 Cloud Shell 环境以供高级用途
  • 熟悉 Cloud Code 选项和功能
  • 详细了解适用于 Kubernetes 应用的 Cloud Code
  • 使用 Minikube 等本地模拟器

前提条件

  • 您需要拥有具有修改者权限的 GCP 项目、GCP 账号以及对 Cloud Shell 的访问权限
  • 对于可选部分,您需要安装终端模拟器和 Google Cloud SDK。

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 免费试用计划的条件。

3. 使用 Cloud Shell 终端

在本部分中,您将了解 Cloud Shell 终端、如何浏览界面、使用各项功能,以及探索配置选项和不同的使用方式,从而帮助您提高工作效率。

Cloud Shell 有两个主要工具:Cloud Shell 终端Cloud Shell 编辑器。在本实验中,“Cloud Shell 终端”和“Cloud Shell”这两个术语将交替使用,但“编辑器”始终称为“Cloud Shell 编辑器”,以便清楚区分终端模拟器和 IDE。

Cloud Shell 是一个功能齐全的基于云的 Shell,构建在临时 Google Compute Engine Debian Linux 机器之上,可供您随时使用。它预安装了 Google Cloud SDK,并附带了多个相关工具,例如 gitkubectlkubectxcurlpython3tmux 等。

您的 $HOME 目录由 Google Cloud 保存在 Cloud Storage 中,并且每次 Cloud Shell 机器启动时都会自动装载,因此即使 Cloud Shell 机器关闭,您也不会丢失该目录下留下的任何信息。这意味着,如果您再次启用 Cloud Shell,您的 $HOME 目录以及您可能对其进行的任何自定义设置都将可供您使用。

启动 Cloud Shell

  1. 前往 console.cloud.google.com,如果尚未在 GCP 控制台中登录,请输入您的 Google 凭据。系统会显示 Google Cloud Platform 的控制台主界面。
  2. 在 Cloud 控制台菜单栏选择器中,选择您将使用的 GCP 项目 ID:

a78258af94ed9ec3.png

  1. 在菜单栏右侧找到用于激活 Cloud Shell 的按钮,该按钮位于您的账号头像旁边:

5b4246f45b173ff4.png

  1. 点击 Cloud Shell 图标,Cloud Shell 终端随即打开,在 GCP 控制台界面下方显示一个新窗格:

8495f27a3ed0f05.png

在此窗格中,您会看到所谓的 Cloud Shell 终端。

  1. 前往 Cloud Shell 终端,并注意,由于您已从 GCP 控制台中选择正确的 GCP 项目 ID,因此 Cloud Shell 知道这一点,您无需再次指定:
echo $GOOGLE_CLOUD_PROJECT

这会输出您的 GCP 项目 ID,该 ID 也会显示在 Cloud Shell 提示符中。

在工具之间切换

Cloud Shell 为您提供了多种工具和配置选项。您可以通过 Cloud Shell 菜单中的选项查看这些信息:

595834af08265e5c.png

  1. 点击栏中的 67bd0e39332a8438.png 按钮,即可最大化 Cloud Shell 终端,使其占据浏览器标签页的所有空间:

1197e3e9a36bc7aa.png

  1. Cloud Shell 会最大化并占用整个浏览器标签页空间:

ecb227a1d39b8021.png

  1. 再次点击该按钮。浏览器标签页空间将恢复为在 Cloud 控制台和 Cloud Shell 之间共享。

打开新标签页

Cloud Shell 终端允许您根据需要打开任意数量的标签页。

  1. 点击以下按钮,打开新标签页。

e5757f88b64c7f5.png

  1. 现在,点击标签页名称旁边的“x”关闭新标签页,或在相应的 shell 中输入 exit

8828238e04a14a20.png

打开新窗口

在新浏览器窗口中打开 Cloud Shell 可让您在一个窗口中显示 Cloud 控制台,在另一个窗口中显示 Cloud Shell。

  1. 点击以下按钮,观察 Cloud Shell 如何在新浏览器标签页中打开:

bd407e51ae78d9fe.png

  1. 请注意,Cloud Shell 现在提供相同的工具栏选项,但外观略有不同:

4bce4507ce34a695.png

  1. 在接下来的部分中,请始终保持此新浏览器标签页处于打开状态。

使用 Tmux 转移会话

Cloud Shell 随附 tmux。Tmux 是一款非常热门的终端多路复用器,与 GNU Screen 类似。与 tmux 集成后,无论您身在何处,Cloud Shell 都能保留您的会话。

在接下来的步骤中,您将练习使用此概念,以便更好地了解此功能。

移动 Cloud Shell 终端

  1. 在刚刚打开的 Cloud Shell 标签页中,输入命令 top

bdd80a3fdcc6c7db.png

top 命令可实时显示 Cloud Shell 终端中正在运行的进程。您将使用它来直观呈现 tmux 提供的 Cloud Shell 会话持久性。

  1. 返回浏览器中的第一个标签页(即 Cloud 控制台所在的标签页)。
  2. 请注意,由于您之前决定在新窗口中打开 Cloud Shell,因此系统会显示一条消息,指出“Your session was transferred to another browser tab. You can disable this from the "Tmux Settings" option in the Cloud Shell settings menu.
  3. 点击“重新连接”按钮:

bdc5d5773296bcfe.png

然后,您将能够访问在第二个标签页中运行的 shell,并且 top 会像您刚刚离开时一样继续在此处运行。

  1. 前往浏览器中的第二个标签页(您已在新窗口中打开 Cloud Shell),
  2. 点击重新连接。您将恢复顶部进程,就像我们在关闭窗口之前运行该进程一样。

使用 Tmux 拆分窗口

Tmux 的用途远不止您刚才使用的那样。本实验不涉及 tmux 教程,您可以在 tmux 官方入门指南中找到有关它的更多信息。

不过,tmux 为 Cloud Shell 提供了一些可在本地终端模拟器中实现的其他功能。为了演示其中一种,您将并排拆分终端。

  1. 在 Cloud Shell 中,按 Ctrl + b,然后按 %
  2. 观察 tmux 如何在原始窗格的右侧创建一个新窗格:

717b047d71c8eeef.png

  1. 点击第二个窗格,然后输入 exit

利用网页预览功能

Cloud Shell 还可以通过在计算机上运行的本地浏览器,建立从云端运行的 Cloud Shell 机器到本地浏览器的自动端口转发。

  1. 在 Cloud Shell 中输入:
python3 -m http.server 8080
  1. 前往右上角的网页预览选项,然后选择在端口 8080 上预览

a8363cafca79345.png

系统随即会打开一个新标签页,其中显示在该端口中提供的默认网页。

请注意,您可以更改端口,并预览 Cloud Shell 中应用公开的任何端口,而不仅仅是端口 8080

访问其他 Cloud Shell 选项

Cloud Shell 中还提供了其他设置和选项。

  1. 点击 Cloud Shell 菜单中的三点状图标,即可访问以下选项:

a5c515c9df9284be.png

此处最相关的选项是能够将文件上传到 Cloud Shell 或从 Cloud Shell 下载文件,以及在遇到任何问题时重启 Cloud Shell 机器。

4. 使用 Cloud Shell Editor

Cloud Shell 最重要的功能之一是 Cloud Shell 编辑器。这是一个基于开源项目 Eclipse Theia 的成熟 IDE,由 Google 等公司共同贡献。由于两者都使用多个常见的开源基础组件(例如 Monaco 编辑器、扩展模型、语言服务器协议和调试适配器协议),因此外观和风格非常相似。

由于 Theia/Cloud Shell Editor 是一款相当复杂的工具,因此本实验无法介绍所有 Cloud Shell Editor 功能。在本部分中,您将了解此 Google Cloud 实现中的一些核心概念和独特功能。

访问 Cloud Shell Editor

您可以通过以下三种不同的方式访问 Cloud Shell 编辑器:

  • 从命令行访问
  • 通过 Cloud Shell 菜单访问
  • 在浏览器中访问网址

请按以下步骤体验这些方法

  1. 通过命令行使用以下命令打开 .bashrc:
cloudshell edit $HOME/.bashrc
  1. 点击“打开编辑器”6039dbc755bfca9f.png 按钮,从菜单中打开 Cloud Shellf493b9a98771b0af.png这会打开 Cloud Shell 编辑器,同时保持 Cloud Shell 终端处于打开状态。如果您希望将所有标签页空间都用于 Cloud Shell 编辑器,请点击“修改”按钮右侧的按钮以关闭终端。这两个按钮(打开/关闭编辑器和打开/关闭终端)将决定浏览器标签页中显示哪些工具。练习点击这两个按钮,掌握其中的技巧。
  2. 通过在浏览器中的网址栏中输入 ide.cloud.google.com,从网址栏中调用 Cloud Shell 编辑器。

通过 Cloud Shell Editor 使用命令行

虽然您可以在同一浏览器标签页中同时使用 Cloud Shell 终端和 Cloud Shell 编辑器,但您也可以完全舍弃 Cloud Shell 终端,仅使用 Cloud Shell 编辑器及其内置的终端来满足所有需求。如果您习惯在 IDE 中工作,并且了解 VSCode 的不同快捷键和窗格动态,那么这种做法可能很有意义。

使用上述任一方法打开 Cloud Shell 编辑器。然后,前往编辑器菜单,依次选择 Terminal > New Terminal(或在键盘上按 Ctrl + `)。Cloud Shell 编辑器的下部将打开一个新的终端窗格,您可以在其中执行所有 shell 操作:

8b2c36f71e851c40.png

这样一来,您还可以选择管理不同的终端窗格,而无需像 Cloud Shell 终端那样使用 tmux 窗格管理。

自定义 Cloud Shell 设置

Cloud Shell 提供了多种自定义选项,从外观和基本行为到 Cloud Shell 终端启动配置和详细操作,应有尽有。您将在以下部分中详细了解不同的选项。

前往 Cloud Shell 终端菜单,然后点击齿轮图标。系统会显示多个配置选项:

a473c985a434070b.png

请查看以下部分:

  • 颜色主题:您可以使用浅色、深色或一组自定义颜色(基本颜色,例如字体颜色和背景颜色)
  • 文字大小:5 种不同的字号可供选择
  • 字体:Courier New 或 Monospace
  • 复制设置:您可以在此处更改复制键盘快捷键,使其类似于大多数热门 Linux 终端模拟器中使用的快捷键。
  • 键盘:将 Meta 键映射到 Alt(默认情况下,Meta 是 ESC),以及在某些操作系统中映射 Alt Gr 键。

配置 Shell 环境

作为在基于 Debian 的 Linux 机器中运行 shell 的终端模拟器,您可以像在 Linux 中一样自定义 shell 环境。因此,每次创建新的登录 shell 进程时,系统都会获取 $HOME 中的任何配置文件(例如 .bashrc))。

Cloud Shell 还允许您在名为 .customize_environment 的特殊配置文件中指定每次启动 Cloud Shell 实例时要执行的操作。如需详细了解此功能,请参阅环境自定义文档。

练习向 Cloud Shell 终端添加一些配置。前往 Cloud Shell 终端,然后克隆以下示例代码库:

git clone https://gitlab.com/javiercanadillas/cloud-code-getting-started.git

此代码库包含两个主要事件的示例,您可能需要在这些事件中配置 Cloud Shell:

  • 每当 Cloud Shell 实例启动时,系统都会读取文件 $HOME/.customize_environment。此流程的执行日志可在 /var/log/customize_environment 中找到,成功执行后会创建 /google/devshell/customize_environment_done
  • 每当启动新的 shell 进程(新窗口、新标签页等)时,系统都会读取常规的 bash shell 配置文件。

请按照以下步骤练习使用这两种模式:

  1. 执行以下命令以启动由该代码库提供的自定义项:
cd cloud-code-getting-started
source set_env_cust.sh

此操作会设置并启用之前提及的两种自定义选项。

  1. 请注意新的 shell 提示。在 .bash_profile 文件中获取的 bash 脚本已配置此新提示,该提示比默认提示短,并且包含基本的 Git 信息,例如已检出的分支或 Git 状态。
  2. 现在,cloudshell edit 命令有了一个新的别名 code,该别名更短。使用此命令查看 .bash_profile 文件的内容:
code $HOME/.bash_profile
  1. 使用新安装的命令 bat 查看 .customize_environment 文件的内容:
bat $HOME/.customize_environment

bat 是热门 Unix 工具 cat 的增强版。bat 的输出显示了用于在每次启动新的 Cloud Shell 机器时重新安装 hey(一种负载测试工具)的 apt install 命令。

  1. 点击 Cloud Shell 菜单(右上角的三点状图标),然后选择重新启动,测试一切是否正常运行。

这样,您就可以模拟 Cloud Shell 超时和实例重新创建,确保一切都已正确配置。

自定义 Cloud Shell 容器映像

借助此自定义选项,您可以创建 Docker 映像,该映像充当具有其他软件包和自定义配置的自定义 Cloud Shell 环境。生成的映像将启动一个完全临时的 Cloud Shell 实例,因此 Cloud Shell 虚拟机和附加到该虚拟机的 $HOME 目录都不会保留。不过,如果您需要向第三方提供特定于功能的 Cloud Shell 实例,以便他们以最有效的方式执行特定任务,那么创建此映像将非常有用。

您将不再像上一部分中那样自定义环境,而是将更改烘焙到用于启动 Cloud Shell 的新映像中。这具有明显的优势,因为您的自定义 Cloud Shell 将更快地启动。

创建新的 Cloud Shell 映像

  1. 在 Cloud Shell 终端中输入以下内容,开始创建 Cloud Shell 容器映像:
cloudshell env create-custom-image custom-cloud-shell
cd custom-cloud-shell

这会在 Cloud Shell 中创建一个新目录,并创建一个同名的新 Cloud Source Repositories 代码库来托管您的代码。它还会克隆 $HOME/custom-cloud-shell/ directory 中的示例 Dockerfile

  1. RUN apt install -y hey 这行代码添加到 Dockerfile 的最后一行:
echo "RUN apt install -y hey" >> $HOME/custom-cloud-shell/Dockerfile

这会设置与 .customize_environment 中相同的自定义设置,但会将其内置到容器中。

  1. 在本地构建映像:
cloudshell env build-local
  1. 通过执行以下命令来测试新映像:
cloudshell env run

现在,您将位于映像内的 shell 中。

  1. 运行 hey 命令,测试该命令是否已安装:
hey
  1. 完成后,输入 exit 退出容器:
exit
  1. 将更改推送到 Cloud Source Repositories,并将映像推送到 Container Registry:
git commit -a -m "Initial commit"
git push origin master
cloudshell env push

测试新图片

  1. 公开映像,以便您可以使用它:
gsutil iam ch allUsers:objectViewer $(gsutil ls)
  1. 生成一个可用于测试已发布的 Cloud Shell 自定义实例的网址:
echo "https://ssh.cloud.google.com/cloudshell/editor?cloudshell_image=gcr.io/$GOOGLE_CLOUD_PROJECT/custom-cloud-shell"
  1. 复制输出网址并将其粘贴到新的浏览器标签页中,然后 Cloud Shell 自定义实例就会打开。请注意,当您访问实例时,系统会显示横幅,表明您正在以完全暂存模式运行:

bc091a4c33649aa9.png

  1. 再次运行 hey 命令来测试映像
hey
  1. 完成后,exit 临时 Cloud Shell 实例,返回到打开常规 Cloud Shell 的标签页,然后点击重新连接

使用 SSH 远程访问 Cloud Shell

您还可以通过本地计算机远程使用 Cloud Shell 功能。这通常涉及两种不同的使用情形:

  • 通过本地终端 SSH 连接到 Cloud Shell 机器
  • 在本地装载 Cloud Shell 远程 $HOME 目录。

为此,您需要在本地安装 Google Cloud SDK。您还需要使用项目 ID 和您正在使用的特定凭据来配置该库。

在本地机器上运行的终端模拟器中执行以下步骤:

  1. 设置 GCP 项目 ID,并使用与 Cloud Shell 所在的 Cloud 组织对应的凭据登录。
gcloud config set project <your project id>
gcloud auth login
  1. 通过 SSH 连接到远程 Cloud Shell 机器:
gcloud cloud-shell ssh --authorize-session

现在,您将进入 Cloud Shell,但使用的是本地终端模拟器的功能和配置。如果您使用的终端支持 tmux,则可以利用进一步的集成来获得更好的远程体验。

从本地机器装载 Cloud Shell 主目录

虽然能够通过 SSH 连接到远程 Cloud Shell 实例很不错,但如果本地 IDE 能够访问远程 Cloud Shell $HOME 目录,那就更好了。这样一来,您就可以将之前演示的 SSH 访问权限与在本地修改远程代码的功能相结合。

为此,请先在本地机器上创建一个装载点:

mkdir $HOME/cloudshell

这是 Cloud Shell 将装载到的目录。现在,如需装载该文件系统,请确保您的 Cloud Shell 实例已启动,然后在本地终端中输入:

$(gcloud cloud-shell get-mount-command $HOME/cloudshell)
cd $HOME/cloudshell

此命令将获取您需要发出以在本地装载 Cloud Shell 的装载命令,并装载 Cloud Shell。您会看到 Cloud Shell 主目录的内容已装载到本地机器中。

现在,您可以在本地打开 VSCode 等 IDE,并打开云端远程工作区。与此同时,通过使用 SSH 访问 Cloud Shell,您可以在 IDE 内打开一个终端窗格,从而在本地 IDE 中集成一个远程终端。

5. 使用 Cloud Code

Cloud Code 是 Google 开发的一款插件,可让开发者更高效地使用基于云的工具。它可在多个 IDE 和代码编辑器(例如 VSCode 和 Jetbrains 产品)中使用,并且默认集成到 Cloud Shell Editor 中,方便您使用。Cloud Code 包含许多对开发者友好的功能,您将在后续步骤中练习使用这些功能。

在 Cloud Shell 编辑器中找到 Cloud Code

使用快速访问按钮

在编辑器的左侧窗格中找到以下四个按钮:

de0b6c69b590d21b.png

通过这些菜单项,您可以直接从 Cloud Shell 编辑器轻松访问和配置 GCP 服务。

在本实验中,您将重点学习 Kubernetes 集群

使用状态栏

通过 Cloud Shell 编辑器界面公开的 Cloud Cloud 还有两个相关部分。您可以在编辑器底部的栏中看到这两项:

f04c703ff45b05a.png

  • <> Cloud Code:点击此处会显示一个快速操作菜单,您将在本教程中使用该菜单:58a3f8940f6263ae.png
  • 控制 minikube:此权限可让您通过启动或停止集群等基本操作来控制本地 Kubernetes 模拟器 minikube。

创建 Minikube 实例

点击相应按钮,立即创建 Minikube 实例。

540da42dd52e1469.png

使用 Cloud Code 创建 GKE 集群

  1. 点击左侧的图标 Cloud Code - Kubernetes Clusters ( 5ffab5cb541da6.png)。您会在左侧看到一个名为 CLOUD CODE - KUBERNETES: CLUSTERS 的新窗格。
  2. 点击 CLOUD CODE - KUBERNETES: CLUSTERS 旁边的 + 按钮,然后选择 Google Kubernetes Engine(请注意,您也可以选择其他选项,例如之前启动的 Minikube):

e7a81607c1bc7c55.png

  1. 点击创建新的 GKE 集群。此选项会在右侧加载一个新窗格,您可以在其中输入其他信息以快速创建开发集群。按照面板中的说明操作,然后输入以下信息:
  • 选择 Autopilot
  • 选择您的区域 (europe-west-1)
  • 将集群命名为“dev
  1. 点击创建集群按钮。此命令将创建一个新的 Autopilot 集群。

集群创建过程最多可能需要 5 分钟才能完成。因此,在创建集群期间,您可以继续探索 Cloud Code Kubernetes 窗格。

探索 Cloud Code Kubernetes 窗格

您之前创建了一个 Minikube 集群。准备就绪后,此集群将显示在 Cloud Code Kubernetes 窗格中,并带有您为其指定的名称 minikube

b654e618f78de3b3.png

该集群在界面中将显示为“有效”。此设置与命令行中的当前 Kubernetes 上下文保持同步。。

您可以在 Cloud Code Kubernetes 窗格中看到以下内容:

  • 默认 KubeConfig 文件:Cloud Code 会读取您用户的 ~/.kube/config 文件,并使用该文件连接到其中配置的 Kubernetes 集群,以便您轻松浏览这些集群。您可以将鼠标悬停在 Default Kubeconfig 行上,然后点击旁边的带箭头的小方块,根据需要修改 Kubeconfig 文件。
  • 已注册集群的不同对象的可浏览呈现:在本例中,您可以看到之前创建的 minikube Minikube 集群及其上下文、命名空间和节点。继续操作,展开树的某些节点。由于您尚未部署任何应用,因此目前不会有任何 pod。

新 GKE 集群启动并运行后,它将与 minikube Minikube 集群一起显示在左侧窗格中。请注意,您可以右键点击任何集群,并将其设为“有效”,即选择该集群以用于您可能启动的任何 Cloud Code 操作:

8e4306c3ce707ef8.png

6. 恭喜!

恭喜,您已完成此 Codelab!

所学内容

  • 浏览并熟悉了 Cloud Shell 的主要功能
  • 练习了不同的 Cloud Shell 使用模式
  • 自定义 Cloud Shell 环境以供高级使用
  • 熟悉了 Cloud Code 选项和功能
  • 查看了 Cloud Code for Kubernetes 应用的详细信息
  • 使用 Minikube 等本地模拟器