GSP005
概览
本实操实验旨在帮助您将所开发的代码转化为在 Kubernetes(基于 Kubernetes Engine)上运行的副本应用。在本实验中,我们将使用一个简单的 Node.js 版“Hello World”应用作为示例代码。
下图展示了本实验中涉及的各个组件,可帮助您理解它们如何协同工作。在推进实验的过程中,您可以将此图作为参考。完成整个实验后,您会对整个过程豁然开朗。当然,您现在也可以暂时先忽略它。

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 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。右侧是实验设置和访问权限面板,其中包含以下内容:
-
打开 Google Cloud 控制台按钮
- 您在本实验中必须使用的临时凭证(用户名和密码)
- 帮助您逐步完成该实验所需的其他信息(如果需要)
请注意,实验计时器位于页面顶部附近,将显示剩余时间。
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:可以将这些标签页分别放在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验设置和访问权限面板中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验设置和访问权限面板中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭证。请勿使用您的 Google Cloud 账号凭证。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
依次点击进入后续页面:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重身份验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 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 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 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
- 启动编辑器:
i
- 将以下内容添加到该文件中:
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 的网页编辑器功能。
- 按 Esc 键,输入以下内容,以保存
server.js 文件:
:wq
- 由于 Cloud Shell 已安装
node 可执行文件,请运行以下命令启动节点服务器(该命令不会产生输出):
node server.js
- 利用 Cloud Shell 内置的网页预览功能打开一个新的浏览器标签页,通过代理向您刚刚在端口
8080 上启动的实例发送请求。

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

- 继续操作前,请返回 Cloud Shell 并按下 Ctrl+C 键,以停止正在运行的节点服务器。
接下来,需要将此应用封装到 Docker 容器中。
任务 2. 创建 Docker 容器映像
- 创建一个
Dockerfile 来描述您要构建的映像。Docker 容器映像可通过继承其他现有映像来扩展。在本次构建中,我们将基于现有的 Node 映像进行扩展:
vi Dockerfile
- 启动编辑器:
i
- 添加以下内容:
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD ["node", "server.js"]
此 Docker 映像的“recipe”将会执行以下操作:
- 基于在 Docker Hub 上找到的
node 映像开始构建。
- 公开端口
8080。
- 将
server.js 文件复制到映像中。
- 按照前述的手动启动步骤,启动节点服务器。
- 按 Esc 键,输入以下内容,以保存此
Dockerfile:
:wq
- 输入以下命令构建映像:
docker build -t hello-node:v1 .
下载和提取所有内容需要一些时间,但在映像构建过程中,您会看到实时的进度条。
构建完成后,从您刚刚创建的容器映像中启动一个 Docker 容器作为守护程序运行,并在 8080 端口上进行本地测试。
- 使用以下命令运行该 Docker 容器:
docker run -d -p 8080:8080 hello-node:v1
输出应如下所示:
325301e6b2bffd1d0049c621866831316d653c0b25a496d04ce0ec6854cb7998
- 如需查看结果,请使用 Cloud Shell 的网页预览功能。或者,您也可以在 Cloud Shell 提示符下运行
curl 命令:
curl http://localhost:8080
您应该会看到以下输出:
Hello World!
注意:如需查看 docker run 命令的完整文档,请参阅 Docker run 参考指南。
接下来,停止正在运行的容器。
- 运行以下命令来查找 Docker 容器 ID:
docker ps
输出应如下所示:
CONTAINER ID IMAGE COMMAND
2c66d0efcbd4 hello-node:v1 "/bin/sh -c 'node
- 运行以下命令停止该容器,并将
[CONTAINER ID] 替换为上一步中提供的值:
docker stop [CONTAINER ID]
您的控制台输出应类似于以下内容(即所停止容器的 ID):
2c66d0efcbd4
现在,映像已按预期工作,请将其推送到 Google Artifact Registry。这是一个专属于您的 Docker 映像私有代码库,可从您的 Google Cloud 项目中直接访问。
- 首先,您需要在 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 }}}
- 运行以下命令来配置 Docker 身份验证。
gcloud auth configure-docker
如果系统提示“Do you want to continue (Y/n)?”,请输入 Y。
- 如需使用代码库名称标记映像,请运行以下命令,并将
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
- 然后,运行以下命令,将容器映像推送到代码库:
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
- 该容器映像将列在控制台中。依次点击导航菜单 > 查看所有产品。然后在 CI/CD 下,选择 Artifact Registry。
现在,您已拥有一个可在整个项目中使用的 Docker 映像,Kubernetes 可对其进行访问和编排。
注意:我们使用了推荐的 Artifact Registry 操作方式,即明确指定要使用的区域。如需了解详情,请参阅从 Artifact Registry 推送和拉取映像。
任务 3. 创建集群
现在,您已准备好创建 Kubernetes Engine 集群。集群由 Google 托管的主 Kubernetes API 服务器和一组工作器节点组成。这些工作器节点即为 Compute Engine 虚拟机。
- 请确保您已使用
gcloud 设置项目,并将 PROJECT_ID 替换为您的项目 ID(可在控制台以及本实验的实验详情部分找到):
gcloud config set project PROJECT_ID
- 创建一个包含两个 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 上提供内容服务。
- 使用
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 副本。
- 如需查看该 Deployment 对象,请运行以下命令:
kubectl get deployments
输出:
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 1m36s
- 如需查看该 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 服务对外公开。
- 在 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 外部进行访问。
- 如需查找该服务可供公开访问的 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,请等待几分钟,然后再次运行该命令。
- 通过将浏览器指向以下地址,您现在应该能够访问该服务:
http://<EXTERNAL_IP>:8080

此时,通过将应用迁移到容器和 Kubernetes,您已经获得了多项核心优势 - 您无需再手动指定在哪台主机上运行工作负载,同时也受益于自动化的服务监控与重启功能。下面,再来了解一下您的新 Kubernetes 基础设施还能带来哪些好处。
点击下方的检查我的进度,以检查您的实验进度。
创建 Kubernetes 服务
任务 6. 扩容服务
Kubernetes 提供了许多强大的功能,其中一个就是可以轻松扩缩应用。假设您突然需要为应用增加容量。您只需指示副本控制器为您的 Pod 管理新数量的副本。
- 为 Pod 设置副本数量:
kubectl scale deployment hello-node --replicas=4
输出:
deployment.apps/hello-node scaled
- 请求提供更新后的 Deployment 说明:
kubectl get deployment
输出:
NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 4/4 4 4 16m
重复运行上述命令,直到看到所有 4 个副本都已创建。
- 列出所有 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 集群的状态:

点击下方的检查我的进度,以检查您的实验进度。
扩容服务
任务 7. 发布服务升级
您部署到生产环境的应用,有时会需要进行 bug 修复或添加新功能。Kubernetes 可帮助您将新版本部署到生产环境,而不会影响您的用户。
- 首先,打开
server.js 来修改应用:
vi server.js
i
- 然后更新响应消息:
response.end("Hello Kubernetes World!");
- 按 Esc 键,输入以下内容,以保存
server.js 文件:
:wq
现在,您可以构建一个新的容器映像,并使用递增的标记(本例中为 v2)将其发布到注册表。
- 运行以下命令,将
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。
- 运行以下
kubectl edit 命令:
kubectl edit deployment hello-node
系统会打开一个文本编辑器,并在其中显示完整的部署 YAML 配置。目前,您无需彻底掌握整个 YAML 配置的每一个细节,只需知道:通过更新配置中的 spec.template.spec.containers.image 字段,您就是在指示该 Deployment 使用新的映像来更新所有 Pod。
- 找到
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
- 进行更改后,按 Esc 键,输入以下内容,以保存并关闭此文件:
:wq
您应该会看到以下输出:
deployment.apps/hello-node edited
- 运行以下命令以使用新映像更新部署:
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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。