检查点
Create a Kubernetes cluster and launch Nginx container
/ 25
Create Monolith pods and service
/ 25
Allow traffic to the monolith service on the exposed nodeport
/ 5
Adding Labels to Pods
/ 20
Creating Deployments (Auth, Hello and Frontend)
/ 25
使用 Kubernetes 编排云
GSP021
概览
Kubernetes 是一个开源项目(项目网站为 kubernetes.io),可在从笔记本电脑到高可用性多节点集群、从公有云到本地部署、从虚拟机到裸金属等众多不同环境中运行。
在本实验中,借助 Kubernetes Engine 这样的托管式环境,您可以把全部精力放在体验 Kubernetes 上,不必分心去设置底层基础设施。Kubernetes Engine 是一个可用于部署容器化应用的托管式环境。它融合了提高开发者效率、有效利用资源、自动化运营和开源灵活性等方面的最新创新成果,能够让您更快进入市场。
目标
在本实验中,您将学习如何完成以下操作:
- 使用 Kubernetes Engine 预配完整的 Kubernetes 集群。
- 使用
kubectl
部署和管理 Docker 容器。 - 使用 Kubernetes 的 Deployment 和 Service 对象将应用分解成微服务。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。我们会为您提供新的临时凭据,让您可以在实验规定的时间内用来登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
- 完成实验的时间 - 请注意,实验开始后无法暂停。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
- 打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:请将这些标签页安排在不同的窗口中,并将它们并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。 -
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}} 您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}} 您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本次实验中使用您自己的 Google Cloud 账号可能会产生额外费用。 -
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于该账号为临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
- 点击 Google Cloud 控制台顶部的激活 Cloud Shell 。
如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID:
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
-
点击授权。
-
现在,输出的内容应如下所示:
输出:
- (可选)您可以通过此命令列出项目 ID:
输出:
输出示例:
gcloud
, in Google Cloud, refer to the gcloud CLI overview guide.
Google Kubernetes Engine
- 在 Cloud Shell 环境中,输入以下命令设置可用区:
- 启动一个集群,以便在本实验中使用:
gcloud container clusters get-credentials io
命令重新进行身份验证。
任务 1. 获取示例代码
- 从 Cloud Shell 命令行复制源代码:
- 切换到本实验所需的目录:
- 列出文件,了解您要使用的是哪些文件:
该示例的布局如下:
现在您已经有了代码,接下来就可以拿 Kubernetes 试手了!
任务 2. Kubernetes 快速演示
要开始使用 Kubernetes,最简单的方法就是使用 kubectl create
命令。
- 运行以下命令,启动 nginx 容器的一个实例:
Kubernetes 已经创建了一个 Deployment 对象,我们稍后再介绍 Deployment 对象,目前您只需要了解一点,Deployment 对象可以使 Pod 保持正常运行状态,即便是运行 Pod 的节点发生故障,也不会受到影响。
在 Kubernetes 中,所有容器都在 Pod 中运行。
- 使用
kubectl get pods
命令查看正在运行的 nginx 容器:
- 当 nginx 容器的状态变为“Running”之后,您可以使用
kubectl expose
命令向 Kubernetes 外部公开该容器:
刚刚发生了什么?Kubernetes 在后台创建了一个具有公共 IP 地址的外部负载均衡器。访问这个公共 IP 地址的任何客户端都会被路由到服务背后的 Pod。在本例中,这个 Pod 就是 nginx Pod。
- 现在使用
kubectl get services
命令列出服务:
ExternalIP
字段可能需要几秒钟时间。这很正常,只需每隔几秒钟重新运行 kubectl get services
命令,直至字段中填充数据。
- 在此命令中添加外部 IP,以便远程连接 Nginx 容器:
成功了!Kubernetes 通过 kubectl
run 和 expose 命令,为用户提供了开箱即用又简单易用的工作流。
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Kubernetes 集群并部署了 Nginx 容器,就会看到一个评估分数。
我们已经简单了解了 Kubernetes,接下来深入探索一下每个组件和抽象。
任务 3. Pod
Pod 是 Kubernetes 的核心。
Pod 代表并保存着由一个或多个容器构成的集合。通常情况下,如果您的多个容器彼此之间存在硬性依赖关系,则可以将它们封装到一个 Pod 中。
此示例中有一个包含单体式应用和 nginx 容器的 Pod。
Pod 还具有卷。卷就是数据磁盘,其存在时间与 Pod 一样长,可供该 Pod 中的容器使用。Pod 为其内容提供了一个共享命名空间,这就意味着我们的示例 Pod 中的两个容器可以与互相通信,并且还共享挂接的卷。
各 Pod 之间还共享一个网络命名空间。这意味着每个 Pod 有一个 IP 地址。
接下来,我们更深入地探索 Pod。
任务 4. 创建 Pod
Pod 可使用 Pod 配置文件创建。请花些时间了解单体式应用 Pod 配置文件。
- 切换到下面的目录:
- 运行以下命令:
输出显示了打开的配置文件:
这里有几点需要注意。您会看到:
- 您的 Pod 由一个容器(单体式应用)构成。
- 在这个容器启动时,您向其传递了几个参数。
- 您为 http 流量打开了 80 端口。
- 使用
kubectl
命令创建单体式应用 Pod:
- 检查您的 Pod。使用
kubectl get pods
命令列出默认命名空间内运行的所有 Pod:
- 在 Pod 进入运行状态后,使用
kubectl describe
命令获得有关单体式应用 Pod 的更多信息:
您会看到有关单体式应用 Pod 的大量信息,包括 Pod IP 地址和事件日志。在进行问题排查时,会用到这些信息。
借助 Kubernetes,您只需在配置文件中描述 Pod 即可轻松创建 Pod,并且可以在 Pod 运行时轻松查看其信息。至此,您已经具备了创建部署所需的全部 Pod 的能力!
任务 5. 与 Pod 交互
默认情况下,系统会为 Pod 分配一个专用 IP 地址,从集群外部无法访问 Pod。使用 kubectl port-forward
命令将本地端口映射到单体式应用 Pod 内的一个端口。
-
打开第二个 Cloud Shell 终端。现在您有了两个终端,一个用来运行
kubectl port-forward
命令,另一个用来发出curl
命令。 -
在第 2 个终端中,运行以下命令设置端口转发:
- 现在,在第 1 个终端内,开始使用
curl
与您的 Pod 交互:
很好!您的容器返回了一条非常友好的问候:“hello”。
- 现在,使用
curl
命令,看看访问一个安全端点时会发生什么情况:
糟糕。
- 尝试登录,以便从单体式应用获取一个身份验证令牌:
- 在看到登录提示时,使用超级机密密码
password
登录。
登录会引发系统显示一个 JWT 令牌。
- Cloud Shell 不能很好地处理长字符串的复制,因此我们为令牌创建一个环境变量。
-
在系统提示输入主机密码时,再次输入超级机密密码
password
。 -
使用以下命令复制令牌,随后通过
curl
使用该令牌访问该安全端点:
此时,您应该会收到应用返回的一条响应,表明一切重归正常。
- 使用
kubectl logs
命令查看单体式应用
Pod 的日志。
-
打开第 3 个终端,使用
-f
标志获得实时日志流:
- 如果您在第 1 个终端内使用
curl
与单体式应用交互,则可以看到日志更新(在第 3 个终端内):
- 使用
kubectl exec
命令在单体式应用 Pod 内运行交互式 shell。如果您想在容器内进行问题排查,这会非常方便:
- 例如,在您通过 shell 进入单体式应用容器之后,可以使用
ping
命令测试外部连接:
- 在此交互式 shell 中完成操作后,请务必退出登录。
您可以看到,与 Pod 交互就像使用 kubectl
命令一样轻松。如果您需要远程访问容器,或者获取登录 shell,Kubernetes 提供了执行这些操作所需的一切。
任务 6. Service
Pod 的性质决定了它们无法持久存在。Pod 可能会出于多种原因停止或启动,比如活跃度或就绪性检查失败,而这会造成问题。
如果您想与一组 Pod 通信,会发生什么情况?在重新启动后,它们的 IP 地址可能会发生变化。
此时就要用到 Service。Service 为 Pod 提供了稳定的端点。
Service 使用标签确定它们在哪个 Pod 上运行。如果 Pod 具有正确的标签,Service 会自动选择并公开 Pod。
Service 所提供的针对一组 Pod 的访问权限级别取决于 Service 的类型。Service 目前有三种类型:
-
ClusterIP
(内部):这是默认类型,表示此 Service 仅在集群内部可见 -
NodePort
:为集群中的每个节点分配一个可从外部访问的 IP 地址 -
LoadBalancer
:添加来自云服务提供商的负载均衡器,将流量从服务转发到其中的节点
接下来您将学习如何执行以下操作:
- 创建 Service
- 使用标签选择器向外部公开限定的一组 Pod
任务 7. 创建 Service
您必须先创建可处理 https 流量的安全 Pod,然后才能创建 Service。
- 如果您变更过目录,请务必返回到
~/orchestrate-with-kubernetes/kubernetes
目录:
- 查看单体式应用服务配置文件:
- 创建 secure-monolith Pod 及其配置数据:
现在,您有了一个安全 Pod,可以对外公开 secure-monolith Pod 了。为此,您需要创建一个 Kubernetes Service。
- 查看单体式应用服务配置文件:
(输出):
* 有一个选择器可用于自动查找并公开带有“app: monolith”和“secure: enabled”标签的任何 Pod。
* 现在,您必须公开 nodeport,这样才能将外部流量从 31000 端口转发到 nginx(443 端口)。
- 使用
kubectl create
命令,通过单体式应用服务配置文件创建单体式应用 Service:
(输出):
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了单体式应用 Pod 和 Service,就会看到一个评估分数。
您是使用端口公开 Service 的。因此,如果有另外一个应用尝试绑定到您的某个服务器上的 31000 端口,就有可能发生端口冲突。
通常情况下,Kubernetes 会处理此类端口分配。在本实验中,您选择了一个端口,因此稍后可以更轻松地配置健康检查。
- 使用
gcloud compute firewall-rules
命令,允许流量传输到公开的 nodeport 上的单体式应用服务:
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了一条防火墙规则,允许在 31000 端口上传输 TCP 流量,就会看到一个评估分数。
至此,我们已经设置好了一切,您应该能从集群外部访问 secure-monolith 服务,而不需要使用端口转发。
- 首先,获取其中一个节点的外部 IP 地址。
- 然后尝试使用
curl
访问 secure-monolith 服务:
糟糕!超时了。哪里出问题了?
注意:现在来进行一次简短的知识测验。
请使用以下命令回答下面的问题:kubectl get services monolith
kubectl describe services monolith
问题:
提示:这与标签有关。您将在下一部分中解决此问题。
任务 8. 向 Pod 添加标签
单体式应用服务目前没有端点。排查此类问题的方法之一是结合标签查询使用 kubectl get pods
命令。
- 可以看到,您目前运行的 Pod 中有几个 Pod 带有 monolith 标签。
- 如果执行“app=monolith”和“secure=enabled”查询会有什么结果?
请注意,此标签查询未显示任何结果。您似乎需要为 Pod 添加“secure=enabled”标签。
- 使用
kubectl label
命令,为 secure-monolith Pod 添加缺失的secure=enabled
标签。然后,您可以检查标签是否已更新。
- 此时,您的 Pod 已使用了正确的标签,我们来查看一下单体式应用服务的端点列表:
现在有一个端点了!
- 再次访问我们的一个节点来检验一下。
成功了!终于连接成功。
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功为单体式应用 Pod 添加了标签,就会看到一个评估分数。
任务 9. 使用 Kubernetes 部署应用
本实验的目标是帮您为在生产环境中扩缩和管理容器做好准备。这就要用到 Deployment。Deployment 是确保运行的 Pod 数量等于所需 Pod 数量(这个数量由用户指定)的声明式方法。
Deployment 的主要优势在于,它能抽离 Pod 管理中的低层级细节。在幕后,Deployment 使用副本集管理 Pod 的启动和停止。如果需要更新或扩缩 Pod,Deployment 会处理相应情况。在 Pod 出于某些原因发生故障时,Deployment 还能处理 Pod 的重启。
我们来看一个简单的例子:
Pod 与用于创建 Pod 的节点的生命周期相关联。在上面的例子中,节点 3 发生了故障(致使一个 Pod 随之停止)。您的 Deployment 创建了一个新 Pod,并在节点 2 上启动了这个 Pod,因此您不必手动创建新 Pod 并为其寻找节点。
这真的是太棒了!
下面我们将您学到的 Pod 和 Service 相关知识整合起来,使用 Deployment 将单体式应用拆分为较小的 Service。
任务 10. 创建 Deployment
您需要将该单体式应用拆分为三个独立的部分:
- auth - 为通过身份验证的用户生成 JWT 令牌。
- hello - 问候通过身份验证的用户。
- frontend - 将流量路由到 auth 和 hello 服务。
您可以创建 Deployment 了(每个服务一个)。随后,您将为 auth 和 hello Deployment 定义内部服务,为 frontend Deployment 定义外部服务。完成之后,您就可以与微服务进行交互,就像与单体式应用交互一样,不同之处在于,现在每一个部分都可以独立扩缩和部署!
- 首先查看 auth Deployment 配置文件。
(输出)
该 Deployment 会创建 1 个副本,并且您使用的是 auth 容器的 2.0.0 版本。
当您运行 kubectl create
命令创建 auth Deployment 时,该命令将生成一个与 Deployment 清单中的数据相符的 Pod。这表示您可以通过更改 Replicas 字段中指定的数值来调整 Pod 数量。
- 继续操作,创建 Deployment 对象:
- 现在,可以为 auth Deployment 创建 Service 了。使用
kubectl create
命令创建 auth Service:
- 下面,执行相同的操作来创建和公开 hello Deployment:
- 再次执行同一过程来创建和公开 frontend Deployment。
- 获取 frontend 的外部 IP 地址,然后对其执行 curl 命令,以便与其交互:
EXTERNAL-IP
列的状态为 pending,请再次运行上述命令。此时,您会收到 hello 响应!
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Auth Deployment、Hello Deployment 和 Frontend Deployment,就会看到一个评估分数。
恭喜!
恭喜!您已经使用 Kubernetes 开发了一个包含多个服务的应用。利用通过本实验学到的知识,您可以使用 Deployment 和 Service 的集合,在 Kubernetes 上部署复杂的应用。
后续步骤/了解详情
- 您可以在 X 和社区博客上了解 Kubernetes 的最新动态。
- 请注意,Kubernetes 是 GitHub 上托管的一个开源项目 (http://kubernetes.io/)。我们衷心欢迎您的反馈意见和积极贡献。
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2024 年 4 月 29 日
上次测试实验的时间:2024 年 4 月 29 日
版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。