Create your cluster

检查我的进度

/ 20

Create your pod

检查我的进度

/ 30

Create a Kubernetes Service

检查我的进度

/ 30

Scale up your service

检查我的进度

/ 20

此实验可能会提供 AI 工具来支持您学习。
此内容尚未针对移动设备进行优化。
为获得最佳体验,请在桌面设备上访问通过电子邮件发送的链接。

GSP005

Google Cloud 自学实验

概览

本实操实验旨在帮助您将所开发的代码转化为在 Kubernetes(基于 Kubernetes Engine)上运行的副本应用。在本实验中,我们将使用一个简单的 Node.js 版“Hello World”应用作为示例代码。

下图展示了本实验中涉及的各个组件,可帮助您理解它们如何协同工作。在推进实验的过程中,您可以将此图作为参考。完成整个实验后,您会对整个过程豁然开朗。当然,您现在也可以暂时先忽略它。

Kubernetes 组件流程图

Kubernetes 是一个开源项目(项目网站为 kubernetes.io),可在从笔记本电脑到高可用性多节点集群、从公有云到本地部署、从虚拟机到裸金属等众多不同环境中运行。

为了顺利完成本实验,我们将使用 Kubernetes Engine(运行在 Compute Engine 上、由 Google 托管的 Kubernetes 版本)这样的托管式环境,从而让您能够将全部精力都放在体验 Kubernetes 上,而不必分心去设置底层基础设施。

学习内容

  • 创建 Node.js 服务器。
  • 创建 Docker 容器映像。
  • 创建容器集群。
  • 创建 Kubernetes Pod。
  • 扩容服务。

前提条件

  • 熟悉标准的 Linux 文本编辑器(例如 vim、emacs 或 nano)对完成本实验很有帮助。

建议学员亲手输入命令,以加深对核心概念的理解。很多实验都有一个代码块,其中包含所需的命令。在实验过程中,您可以轻松复制代码块中的命令并粘贴至合适位置。

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。右侧是实验设置和访问权限面板,其中包含以下内容:

    • 打开 Google Cloud 控制台按钮
    • 您在本实验中必须使用的临时凭证(用户名和密码)
    • 帮助您逐步完成该实验所需的其他信息(如果需要)

    请注意,实验计时器位于页面顶部附近,将显示剩余时间。

  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:可以将这些标签页分别放在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号。
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在实验设置和访问权限面板中找到“用户名”。

  4. 点击下一步。

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在实验设置和访问权限面板中找到“密码”。

  6. 点击下一步。

    重要提示:您必须使用实验提供的凭证。请勿使用您的 Google Cloud 账号凭证。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 依次点击进入后续页面:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重身份验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标。

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 Cloud Shell 信息窗口中的设置。
    • 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权。

输出:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。

任务 1. 创建 Node.js 应用

1. 使用 Cloud Shell 编写一个简单的 Node.js 服务器,稍后将它部署到 Kubernetes Engine 上:

vi server.js
  1. 启动编辑器:
i
  1. 将以下内容添加到该文件中:
var http = require('http'); var handleRequest = function(request, response) { response.writeHead(200); response.end("Hello World!"); } var www = http.createServer(handleRequest); www.listen(8080); 注意:这里使用的是 vi 编辑器,但 Cloud Shell 中也内置了 nano 和 emacs。您也可以按照 Cloud Shell 的工作原理指南中的说明,直接使用 Cloud Shell 的网页编辑器功能。
  1. 按 Esc 键,输入以下内容,以保存 server.js 文件:
:wq
  1. 由于 Cloud Shell 已安装 node 可执行文件,请运行以下命令启动节点服务器(该命令不会产生输出):
node server.js
  1. 利用 Cloud Shell 内置的网页预览功能打开一个新的浏览器标签页,通过代理向您刚刚在端口 8080 上启动的实例发送请求。

在展开的“网页预览”菜单中,突出显示“在端口 8080 上预览”

系统将打开一个新的浏览器标签页,并显示执行结果:

显示“Hello World!”消息的结果页面

  1. 继续操作前,请返回 Cloud Shell 并按下 Ctrl+C 键,以停止正在运行的节点服务器。

接下来,需要将此应用封装到 Docker 容器中。

任务 2. 创建 Docker 容器映像

  1. 创建一个 Dockerfile 来描述您要构建的映像。Docker 容器映像可通过继承其他现有映像来扩展。在本次构建中,我们将基于现有的 Node 映像进行扩展:
vi Dockerfile
  1. 启动编辑器:
i
  1. 添加以下内容:
FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD ["node", "server.js"]

此 Docker 映像的“recipe”将会执行以下操作:

  • 基于在 Docker Hub 上找到的 node 映像开始构建。
  • 公开端口 8080。
  • 将 server.js 文件复制到映像中。
  • 按照前述的手动启动步骤,启动节点服务器。
  1. 按 Esc 键,输入以下内容,以保存此 Dockerfile:
:wq
  1. 输入以下命令构建映像:
docker build -t hello-node:v1 .

下载和提取所有内容需要一些时间,但在映像构建过程中,您会看到实时的进度条。

构建完成后,从您刚刚创建的容器映像中启动一个 Docker 容器作为守护程序运行,并在 8080 端口上进行本地测试。

  1. 使用以下命令运行该 Docker 容器:
docker run -d -p 8080:8080 hello-node:v1

输出应如下所示:

325301e6b2bffd1d0049c621866831316d653c0b25a496d04ce0ec6854cb7998
  1. 如需查看结果,请使用 Cloud Shell 的网页预览功能。或者,您也可以在 Cloud Shell 提示符下运行 curl 命令:
curl http://localhost:8080

您应该会看到以下输出:

Hello World! 注意:如需查看 docker run 命令的完整文档,请参阅 Docker run 参考指南。

接下来,停止正在运行的容器。

  1. 运行以下命令来查找 Docker 容器 ID:
docker ps

输出应如下所示:

CONTAINER ID IMAGE COMMAND 2c66d0efcbd4 hello-node:v1 "/bin/sh -c 'node
  1. 运行以下命令停止该容器,并将 [CONTAINER ID] 替换为上一步中提供的值:
docker stop [CONTAINER ID]

您的控制台输出应类似于以下内容(即所停止容器的 ID):

2c66d0efcbd4

现在,映像已按预期工作,请将其推送到 Google Artifact Registry。这是一个专属于您的 Docker 映像私有代码库,可从您的 Google Cloud 项目中直接访问。

  1. 首先,您需要在 Artifact Registry 中创建一个代码库。我们将其命名为 my-docker-repo。运行以下命令:
gcloud artifacts repositories create my-docker-repo \ --repository-format=docker \ --location={{{ project_0.default_region | YOUR_REGION }}} \ --project={{{ project_0.project_id | YOUR_PROJECT_ID }}}
  1. 运行以下命令来配置 Docker 身份验证。
gcloud auth configure-docker

如果系统提示“Do you want to continue (Y/n)?”,请输入 Y。

  1. 如需使用代码库名称标记映像,请运行以下命令,并将 PROJECT_ID 替换为您的项目 ID(可在控制台或本实验的实验详情部分找到):
docker tag hello-node:v1 {{{ project_0.default_region | YOUR_REGION }}}-docker.pkg.dev/{{{ project_0.project_id | YOUR_PROJECT_ID }}}/my-docker-repo/hello-node:v1
  1. 然后,运行以下命令,将容器映像推送到代码库:
docker push {{{ project_0.default_region | YOUR_REGION }}}-docker.pkg.dev/{{{ project_0.project_id | YOUR_PROJECT_ID }}}/my-docker-repo/hello-node:v1

初始推送可能需要几分钟才能完成。构建过程中,您会看到实时的进度条。

The push refers to a repository [pkg.dev/qwiklabs-gcp-6h281a111f098/hello-node] ba6ca48af64e: Pushed 381c97ba7dc3: Pushed 604c78617f34: Pushed fa18e5ffd316: Pushed 0a5e2b2ddeaa: Pushed 53c779688d06: Pushed 60a0858edcd5: Pushed b6ca02dfe5e6: Pushed v1: digest: sha256:8a9349a355c8e06a48a1e8906652b9259bba6d594097f115060acca8e3e941a2 size: 2002
  1. 该容器映像将列在控制台中。依次点击导航菜单 > 查看所有产品。然后在 CI/CD 下,选择 Artifact Registry。

现在,您已拥有一个可在整个项目中使用的 Docker 映像,Kubernetes 可对其进行访问和编排。

注意:我们使用了推荐的 Artifact Registry 操作方式,即明确指定要使用的区域。如需了解详情,请参阅从 Artifact Registry 推送和拉取映像。

任务 3. 创建集群

现在,您已准备好创建 Kubernetes Engine 集群。集群由 Google 托管的主 Kubernetes API 服务器和一组工作器节点组成。这些工作器节点即为 Compute Engine 虚拟机。

  1. 请确保您已使用 gcloud 设置项目,并将 PROJECT_ID 替换为您的项目 ID(可在控制台以及本实验的实验详情部分找到):
gcloud config set project PROJECT_ID
  1. 创建一个包含两个 e2-medium 节点的集群(需要几分钟才能完成):
gcloud container clusters create hello-world \ --num-nodes 2 \ --machine-type e2-medium \ --zone "{{{project_0.default_zone|ZONE}}}"

您可以放心地忽略集群构建过程中出现的警告。

控制台输出应如下所示:

Creating cluster hello-world...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/"{{{project_0.default_zone|ZONE}}}"/clusters/hello-world]. kubeconfig entry generated for hello-world. NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE STATUS hello-world "{{{project_0.default_zone|ZONE}}}" 1.5.7 146.148.46.124 e2-medium RUNNING

或者,您也可以通过控制台创建此集群,方法是打开导航菜单,然后依次选择 Kubernetes Engine > 集群 > 创建。

注意:建议在与 Artifact Registry 存储桶相同的可用区内创建集群(请参阅上一步)。

如果您依次选择导航菜单 > Kubernetes Engine > 集群,就会看到系统已成功创建一个由 Kubernetes Engine 提供支持且功能齐全的 Kubernetes 集群。

现在,是时候将您自己的容器化应用部署到该 Kubernetes 集群中了!从现在开始,您将使用 kubectl 命令行(已在 Cloud Shell 环境中设置)。

点击下方的检查我的进度,以检查您的实验进度。

创建集群。

任务 4. 创建 Pod

Kubernetes Pod 是一组绑定在一起的容器,用于统一的管理和网络配置。一个 Pod 可以包含单个或多个容器。在本实验中,您将使用一个基于私有 Artifact Registry 中 Node.js 映像所构建的容器。它将在端口 8080 上提供内容服务。

  1. 使用 kubectl create deployment 命令创建一个 Deployment 对象,并将 PROJECT_ID 替换为您的项目 ID(可在控制台以及本实验的连接详情部分中找到):
kubectl create deployment hello-node \ --image={{{ project_0.default_region}}}-docker.pkg.dev/PROJECT_ID/my-docker-repo/hello-node:v1

输出:

deployment.apps/hello-node created

如您所见,您已成功创建一个 Deployment 对象。建议使用 Deployment 来创建和扩缩 Pod。在本例中,新创建的 Deployment 管理着一个运行 hello-node:v1 映像的 Pod 副本。

  1. 如需查看该 Deployment 对象,请运行以下命令:
kubectl get deployments

输出:

NAME READY UP-TO-DATE AVAILABLE AGE hello-node 1/1 1 1 1m36s
  1. 如需查看该 Deployment 创建的 Pod,请运行以下命令:
kubectl get pods

输出:

NAME READY STATUS RESTARTS AGE hello-node-714049816-ztzrb 1/1 Running 0 6m

现在,我们来了解一些有趣的 kubectl 命令。这些命令都不会更改集群的状态。如需查看完整的参考文档,请参阅命令行工具 (kubectl):

kubectl cluster-info kubectl config view

如需进行问题排查,请运行以下命令:

kubectl get events kubectl logs <pod-name>

现在,您需要让外界能够访问您的 Pod。

点击下方的检查我的进度,以检查您的实验进度。

创建 Pod

任务 5. 允许外部流量访问

默认情况下,只能通过 Pod 在集群内的内部 IP 来对其进行访问。为了使用户能够从 Kubernetes 虚拟网络外部访问 hello-node 容器,您必须将 Pod 作为 Kubernetes 服务对外公开。

  1. 在 Cloud Shell 中,可结合使用 kubectl expose 命令与 --type="LoadBalancer" 标志,来向公共互联网公开 Pod。在创建可从外部访问的 IP 时必须加入此标志:
kubectl expose deployment hello-node --type="LoadBalancer" --port=8080

输出:

service/hello-node exposed

此命令中使用的标志表明,它将使用底层基础设施(本实验中为 Compute Engine 负载均衡器)提供的负载均衡器。请注意,您直接公开的是 Deployment 对象,而不是 Pod。因此,生成的服务会对该 Deployment 管理的所有 Pod 的流量进行负载均衡(目前虽然只有 1 个 Pod,但您稍后将会增加更多副本)。

Kubernetes 主实例会创建负载均衡器和相关的 Compute Engine 转发规则、目标池和防火墙规则,以使该服务完全可从 Google Cloud 外部进行访问。

  1. 如需查找该服务可供公开访问的 IP 地址,只需让 kubectl 列出所有集群服务:
kubectl get services

您应该会看到以下输出:

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node 10.3.250.149 104.154.90.147 8080/TCP 1m kubernetes 10.3.240.1 < none > 443/TCP 5m

系统针对您的 hello-node 服务列出了 2 个 IP 地址,它们都在端口 8080 上提供服务。其中,CLUSTER-IP 是仅在云虚拟网络内部可见的内部 IP;而 EXTERNAL-IP 是外部负载均衡 IP。

注意:EXTERNAL-IP 可能需要几分钟时间才会显示并可供使用。如果没有看到 EXTERNAL-IP,请等待几分钟,然后再次运行该命令。
  1. 通过将浏览器指向以下地址,您现在应该能够访问该服务:http://<EXTERNAL_IP>:8080

“Hello World!”页面

此时,通过将应用迁移到容器和 Kubernetes,您已经获得了多项核心优势 - 您无需再手动指定在哪台主机上运行工作负载,同时也受益于自动化的服务监控与重启功能。下面,再来了解一下您的新 Kubernetes 基础设施还能带来哪些好处。

点击下方的检查我的进度,以检查您的实验进度。

创建 Kubernetes 服务

任务 6. 扩容服务

Kubernetes 提供了许多强大的功能,其中一个就是可以轻松扩缩应用。假设您突然需要为应用增加容量。您只需指示副本控制器为您的 Pod 管理新数量的副本。

  1. 为 Pod 设置副本数量:
kubectl scale deployment hello-node --replicas=4

输出:

deployment.apps/hello-node scaled
  1. 请求提供更新后的 Deployment 说明:
kubectl get deployment

输出:

NAME READY UP-TO-DATE AVAILABLE AGE hello-node 4/4 4 4 16m

重复运行上述命令,直到看到所有 4 个副本都已创建。

  1. 列出所有 Pod:
kubectl get pods

您应该会看到以下输出:

NAME READY STATUS RESTARTS AGE hello-node-714049816-g4azy 1/1 Running 0 1m hello-node-714049816-rk0u6 1/1 Running 0 1m hello-node-714049816-sh812 1/1 Running 0 1m hello-node-714049816-ztzrb 1/1 Running 0 16m

此处使用的是声明式方法。您无需启动或停止新实例,而是直接声明应始终保持运行的实例数量。Kubernetes 协调循环会确保实际运行状态与您的期望状态相匹配,并在必要时采取行动。

下图总结了您当前 Kubernetes 集群的状态:

Kubernetes 集群流程图

点击下方的检查我的进度,以检查您的实验进度。

扩容服务

任务 7. 发布服务升级

您部署到生产环境的应用,有时会需要进行 bug 修复或添加新功能。Kubernetes 可帮助您将新版本部署到生产环境,而不会影响您的用户。

  1. 首先,打开 server.js 来修改应用:
vi server.js i
  1. 然后更新响应消息:
response.end("Hello Kubernetes World!");
  1. 按 Esc 键,输入以下内容,以保存 server.js 文件:
:wq

现在,您可以构建一个新的容器映像,并使用递增的标记(本例中为 v2)将其发布到注册表。

  1. 运行以下命令,将 PROJECT_ID 替换为您的实验项目 ID:
docker build -t hello-node:v2 . docker tag hello-node:v2 {{{ project_0.default_region | YOUR_REGION }}}-docker.pkg.dev/{{{ project_0.project_id | YOUR_PROJECT_ID }}}/my-docker-repo/hello-node:v2 docker push {{{ project_0.default_region | YOUR_REGION }}}-docker.pkg.dev/{{{ project_0.project_id | YOUR_PROJECT_ID }}}/my-docker-repo/hello-node:v2 注意:由于利用了缓存机制,构建和推送这个更新后的映像应该会更加快捷。

Kubernetes 会顺利地将您的副本控制器更新到新版应用。如需更改运行中容器的映像标签,您需要修改现有的 hello-node deployment,并将映像从 pkg.dev/PROJECT_ID/hello-node:v1 更改为 pkg.dev/PROJECT_ID/hello-node:v2。

  1. 运行以下 kubectl edit 命令:
kubectl edit deployment hello-node

系统会打开一个文本编辑器,并在其中显示完整的部署 YAML 配置。目前,您无需彻底掌握整个 YAML 配置的每一个细节,只需知道:通过更新配置中的 spec.template.spec.containers.image 字段,您就是在指示该 Deployment 使用新的映像来更新所有 Pod。

  1. 找到 Spec > containers > image,并将版本号从 v1 更改为 v2:
# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: apps/v1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "1" creationTimestamp: 2016-03-24T17:55:28Z generation: 3 labels: run: hello-node name: hello-node namespace: default resourceVersion: "151017" uid: 981fe302-f1e9-11e5-9a78-42010af00005 spec: replicas: 4 selector: matchLabels: run: hello-node strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: creationTimestamp: null labels: run: hello-node spec: containers: - image: pkg.dev/PROJECT_ID/hello-node:v1 ## Update this line ## imagePullPolicy: IfNotPresent name: hello-node ports: - containerPort: 8080 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log dnsPolicy: ClusterFirst restartPolicy: Always securityContext: {} terminationGracePeriodSeconds: 30
  1. 进行更改后,按 Esc 键,输入以下内容,以保存并关闭此文件:
:wq

您应该会看到以下输出:

deployment.apps/hello-node edited
  1. 运行以下命令以使用新映像更新部署:
kubectl get deployments

系统将使用新映像创建新的 Pod,并删除旧 Pod。

您应该会看到以下输出(可能需要重新运行上述命令才能看到以下内容):

NAME READY UP-TO-DATE AVAILABLE AGE hello-node 4/4 4 4 1h

在此过程中,您服务的用户不会感受到任何服务中断。稍等片刻后,他们就会开始访问您应用的新版本。如需详细了解滚动更新,请参阅执行滚动更新文档。

通过体验这些部署、扩缩以及更新功能,相信在设置好 Kubernetes Engine 集群后,您也会认同:Kubernetes 能够极大地帮助您专注于应用开发本身,而不是底层的架构运维上。

恭喜!

本次 Kubernetes 实操实验到此结束。您目前只是初步了解了这项技术。欢迎您继续进行探索,并尝试自己构建 Pod、副本控制器和服务。同时,也建议您了解一下活跃性探测(健康检查),并考虑直接使用 Kubernetes API。

后续步骤/了解详情

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

上次更新手册的时间:2026 年 6 月 9 日

上次测试实验的时间:2026 年 6 月 9 日

版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名和密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过邮件告知您

太好了!

一旦可用,我们会通过邮件联系您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

使用无痕模式或无痕浏览器窗口是运行此实验的最佳方式。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。