1. 概览
手动重写或重新设计现有应用以使其在 Kubernetes 上运行并不总是可行或可行的。Migrate for Anthos 可帮助您对现有应用进行现代化改造,并使其在 Kubernetes 中运行。在此 Codelab 中,您将使用 Migrate for Anthos 将托管在 Compute Engine 上的现有 Web 应用迁移到 Kubernetes Engine。
学习内容
- 如何在 Kubernetes 集群上部署 Migrate for Anthos
- 如何从现有 Compute Engine 实例创建有状态集中的容器
- 如何将容器部署到 Kubernetes 并使用负载平衡器进行配置
所需条件
- 已设置结算功能的 Google Cloud 项目。如果您没有 Google 账号,则必须创建一个。
2. 准备工作
此 Codelab 可完全在 Google Cloud Platform 上运行,无需进行任何本地安装或配置。
启用 API
开始之前,请务必在 Google Cloud 项目中启用所需的 API:
创建 Compute 实例网络服务器
我们来创建一个计算实例,用于托管初始 nginx Web 服务器,并创建防火墙规则,以便我们查看该 Web 服务器的默认着陆页。我们可以通过多种方式实现此目的,但为了便于使用,我们将使用 Cloud Shell。
在 Cloud Shell 中,运行以下命令:
gcloud compute instances create webserver --zone=us-central1-a && \ gcloud compute firewall-rules create default-allow-http --allow=tcp:80
此命令的前半部分将在 us-central1-a 可用区中创建一个 Google Cloud 实例,后半部分将创建一个名为“default-allow-http”的防火墙规则,该规则将允许 HTTP 流量进入我们的网络。
成功创建实例后,系统会显示一个包含实例详细信息的表格。记下外部 IP - 我们稍后需要使用此 IP 来验证 Web 服务器是否正在运行。

实例启动并运行后,我们可以通过 Cloud Shell 通过 SSH 连接到实例,以安装 nginx 并启动 Web 服务器:
gcloud compute ssh --zone us-central1-a webserver
登录到计算实例后,安装 nginx:
sudo apt install nginx
使用 logout 命令退出 SSH 会话
我们来验证一下 Web 服务器是否正在运行,方法是将之前实例的外部 IP 输入到浏览器中。您应该会看到默认的 nginx 欢迎界面:

此 Web 服务器将充当我们将使用 Migrate for Anthos 迁移到 Kubernetes 的旧版 Web 应用。
3. 包含 Migrate for Anthos 的 Kubernetes 集群
接下来,我们将创建一个 GKE 集群,最终将 Compute Engine Web 服务器迁移到该集群。在 Cloud 控制台中,运行以下命令:
gcloud container clusters create my-gke-cluster \ --zone us-central1-a \ --cluster-version 1.13 \ --machine-type n1-standard-4 \ --image-type "UBUNTU" \ --num-nodes 1 \ --enable-stackdriver-kubernetes
此命令需要几分钟才能完成。创建集群后,您会收到一些包含其详细信息的输出:

接下来,前往 GCP Marketplace 部署 Migrate for Anthos:

在 Migrate for Anthos 的 Marketplace 页面上,点击“配置”,然后根据提示从列表中选择您的项目。下一页将显示一个已输入一些默认值的表单。确保所选集群是我们刚刚创建的集群,然后点击部署:

Migrate for Anthos 现在应已部署在我们的 Kubernetes 集群上。部署完成后,您会在 Kubernetes Engine 应用页面上看到“正常”状态:

4. 从计算实例到有状态集
我们已有一个运行 Migrate for Anthos 的 Kubernetes 集群,现在可以开始迁移流程了。为了将计算实例部署到 Kubernetes 集群,我们将关闭 Compute Engine 实例,以便能够拍摄磁盘快照。在继续操作之前,请记下实例 ID,我们稍后会用到:
gcloud compute instances describe webserver --zone us-central1-a | grep ^id
我们来关闭计算实例:
gcloud compute instances stop webserver --zone us-central1-a
现在,实例已停止,我们可以通过运行以下脚本安全地为磁盘创建快照。请务必插入您的项目 ID 和实例 ID:
python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \ -p <project-id> -i <instance-id> \ -z us-central1-a \ -T us-central1-a \ -A webserver-statefulset \ -o containerized-webserver.yaml
使用这些标志后,clone_vm_disks.py 将:
- 验证 GCE 实例是否已关闭
- 从实例的每个磁盘创建快照
- 根据每个快照创建新磁盘
- 删除其创建的快照
- 在当前工作目录中生成一个 YAML 文件,用于部署将托管 Web 服务器的有状态集
生成的 YAML 文件将在我们的 Kubernetes 集群中预配一个有状态集,以及将复制的磁盘装载到 Web 服务器容器所需的永久性卷声明。我们可以使用 kubectl 应用这些更改:
kubectl apply -f containerized-webserver.yaml
在“工作负载”页面上检查 webserver-statefulset 的状态:
运行 kubectl apply 后,状态显示“Pod 处于待处理状态”几分钟是正常现象。当状态显示为“正常”时,继续操作。
5. 向负载平衡器公开集群
此时,我们的 Kubernetes 集群应该正在以有状态集的形式运行 Web 服务器,但我们还需要将其容器公开给负载平衡器,以便通过外部 IP 地址访问我们的 Web 服务器。在 Cloud Shell 中,创建一个名为 loadbalancer.yaml 的新文件,其中包含以下内容:
loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver-statefulset
ports:
- protocol: TCP
port: 80
targetPort: 80
现在,使用 kubectl 应用该效果:
kubectl apply -f loadbalancer.yaml
我们可以使用 kubectl 检索 webserver-container 服务的外部 IP 地址:
kubectl get services
如果在浏览器中输入外部 IP 地址,我们应该会看到与之前相同的默认 nginx 欢迎界面:

我们成功了!我们的 GCE Web 服务器现在托管在 Kubernetes 上了!很好!
6. Stackdriver 监控
指标
作为一项托管式 Kubernetes 服务,Kubernetes Engine 会自动配置 Stackdriver,以进行日志记录和监控。我们来看看 Stackdriver 会自动为我们捕获哪些指标。
点击产品菜单中的 Monitoring 链接 - 首次从项目中访问此链接可能需要几分钟时间,因为系统会设置您的工作区。
加载完成后,将光标悬停在左侧窗格中的“资源”上,然后从菜单中选择“Kubernetes Engine NEW”。

此处显示的信息中心中的每一行都代表一个 Kubernetes 资源。您可以使用信息中心上方的链接在基础架构、工作负载或服务视图之间切换。

在“工作负载”视图中,展开“my-gke-cluster”,然后依次向下深入分析 default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset。点击 webserver-stateful set 容器。您可以在此处找到 Stackdriver 捕获的一些开箱即用型指标,包括内存利用率和 CPU 利用率。

此信息中心中显示的图表可用于创建自定义信息中心。
自定义信息中心
借助 Stackdriver,我们可以创建自定义信息中心,用于整理我们可用的任何指标数据的图表。让我们创建一个自定义信息中心,以便快速查看一些 Web 服务器的指标。
在左侧窗格中,将光标悬停在“信息中心”上,然后点击“创建信息中心”。

现在,我们已经创建了一个空白信息中心,接下来可以添加要密切关注的指标。我们为“未命名信息中心”指定一个有用的名称,例如“我的 Web 服务器容器”,然后点击右上角的“添加图表”:

还记得开箱即用的指标吗?我们来添加一个容器 CPU 利用率图表。在“图表标题”字段中,输入“CPU 利用率”。在“查找资源类型和指标”框中,输入 request_utilization,然后从过滤后的列表中选择“CPU request utilization”。此选择将为我们填充“资源类型”和“指标”字段。
接下来,我们需要按 project_id(如果我们有多个项目)和 container_name 进行过滤。在“过滤条件”框中,输入 project_id,从过滤后的列表中选择该项,然后在“值”字段中选择您的项目。我们还需要按 container_name 进行过滤。在“过滤条件”框中,输入 container_name,从过滤后的列表中选择该名称,然后在“值”字段中选择 webserver-statefulset。点击“保存”。
现在,我们有了一个包含第一个图表的信息中心。

7. 拨测和提醒政策
借助 Stackdriver,我们可以设置提醒,以便在任何指标达到我们指定的任何阈值时收到通知。例如,当上一步中的 CPU 利用率在一段时间内持续高于某个阈值时,Stackdriver 可以向我们发送电子邮件,这可能表明我们的应用存在问题。为了演示这些 Google 快讯 的显示效果,我们来设置一个拨测,然后模拟一次服务中断。
在左侧窗格中,依次选择“拨测”和“拨测概览”:

正如“拨测”页面所建议的那样,我们来设置第一个拨测。点击页面右上角的 Add Uptime Check 按钮。
在后续表单中,输入“Endpoint Uptime”作为标题,并输入负载平衡器的外部 IP 地址作为主机名。

点击保存,系统会提示您创建配套的提醒政策:

点击创建提醒政策。
我们将其命名为“端点正常运行时间政策”。在配置部分中,将“何时触发条件”设置为“每当违反时间序列时”,然后点击保存。

我们尚未完全完成。接下来,我们将指定一个通知渠道,以便在提醒政策遭到违反时收到通知。在“通知渠道类型”下拉菜单中,选择“电子邮件”,然后输入有效的电子邮件地址。

点击 Add Notification Channel。最后,在表单底部,将政策命名为“Web 应用正常运行时间”,然后点击“保存”。
如需查看提醒的显示效果,请在 Cloud 控制台中再次打开 Cloud Shell。以下命令将停止在 Web 服务器 pod 中运行的 nginx 服务:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
几分钟后,您应该会收到一封电子邮件,其中会提醒您发生了中断:

让我们撤消该操作。回到 Cloud Shell,我们来重启 nginx:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
几分钟后,您会收到另一封 Stackdriver 电子邮件,这次是好消息:

8. 清理
现在,我们已使用 Migrate for Anthos 从 GCE 迁移到 GKE,接下来我们来清理项目中的所有已创建资源。
删除项目
如果您愿意,可以删除整个项目。 在 GCP Console 中,转到 Cloud Resource Manager 页面:
在项目列表中,选择我们一直使用的项目,然后点击删除。此时,系统会提示您输入项目 ID。输入项目 ID,然后点击关停。
如果您想逐个删除不同的组件,请继续阅读下一部分。
Stackdriver
信息中心
在信息中心页面中,点击页面顶部的“设置”图标
,然后选择删除信息中心。
提醒政策
在“政策”页面中,从右侧的“操作”菜单
中选择删除,以删除您创建的每项政策。
拨测
在“拨测”页面上,从您创建的每个拨测右侧的“操作”菜单中选择删除。
GCE 和 Kubernetes
Google Compute Engine 实例
gcloud compute instances delete webserver --zone=us-central1-a
Kubernetes 集群(包括 Migrate for Anthos、有状态集和负载平衡器服务)
gcloud container clusters delete my-gke-cluster --zone=us-central1-a
磁盘
我们的有状态集使用了我们创建的磁盘。使用以下代码检索名称:
gcloud compute disks list --filter=webserver
使用您的磁盘名称替换我的磁盘名称,然后使用以下命令删除该磁盘:
gcloud compute disks delete vls-690d-webserver --zone=us-central1-a
全部清理完毕!
9. 恭喜!
真棒!您使用 Migrate for Anthos 将 Web 服务器从 GCE 实例迁移到了 Kubernetes 集群。
所学内容
- 我们使用 Migrate for Anthos 将 Web 服务器从 GCE 迁移到了 Kubernetes 集群
- 我们通过 Kubernetes 负载平衡器服务公开了有状态集 Web 服务器,使其可供全球访问。
- 我们启用了 Stackdriver 并创建了自定义信息中心
- 我们配置了拨测和提醒政策,以便在 Web 服务器发生故障时收到通知
