使用 Migrate for Anthos 从 Compute Engine 迁移到 Kubernetes Engine

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 服务器是否正在运行。

a08aa5bf924b107d.png

实例启动并运行后,我们可以通过 Cloud Shell 通过 SSH 连接到实例,以安装 nginx 并启动 Web 服务器:

gcloud compute ssh --zone us-central1-a webserver

登录到计算实例后,安装 nginx:

sudo apt install nginx

使用 logout 命令退出 SSH 会话

我们来验证一下 Web 服务器是否正在运行,方法是将之前实例的外部 IP 输入到浏览器中。您应该会看到默认的 nginx 欢迎界面:

5c08e3b2bd17e03.png

此 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

此命令需要几分钟才能完成。创建集群后,您会收到一些包含其详细信息的输出:

c69778b8fb8ac72b.png

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

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

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

5bf601103a5335cf.png

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 欢迎界面:

5c08e3b2bd17e03.png

我们成功了!我们的 GCE Web 服务器现在托管在 Kubernetes 上了!很好!

6. Stackdriver 监控

指标

作为一项托管式 Kubernetes 服务,Kubernetes Engine 会自动配置 Stackdriver,以进行日志记录和监控。我们来看看 Stackdriver 会自动为我们捕获哪些指标。

点击产品菜单中的 Monitoring 链接 - 首次从项目中访问此链接可能需要几分钟时间,因为系统会设置您的工作区。

加载完成后,将光标悬停在左侧窗格中的“资源”上,然后从菜单中选择“Kubernetes Engine NEW”。

4e62c8ad3f2b3fe9.png

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

62066a9251d19843.png

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

d054778de301429e.png

此信息中心中显示的图表可用于创建自定义信息中心。

自定义信息中心

借助 Stackdriver,我们可以创建自定义信息中心,用于整理我们可用的任何指标数据的图表。让我们创建一个自定义信息中心,以便快速查看一些 Web 服务器的指标。

在左侧窗格中,将光标悬停在“信息中心”上,然后点击“创建信息中心”。

56a0513efe60de3e.png

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

bd66ba91f3125028.png

还记得开箱即用的指标吗?我们来添加一个容器 CPU 利用率图表。在“图表标题”字段中,输入“CPU 利用率”。在“查找资源类型和指标”框中,输入 request_utilization,然后从过滤后的列表中选择“CPU request utilization”。此选择将为我们填充“资源类型”和“指标”字段。

接下来,我们需要按 project_id(如果我们有多个项目)和 container_name 进行过滤。在“过滤条件”框中,输入 project_id,从过滤后的列表中选择该项,然后在“值”字段中选择您的项目。我们还需要按 container_name 进行过滤。在“过滤条件”框中,输入 container_name,从过滤后的列表中选择该名称,然后在“值”字段中选择 webserver-statefulset。点击“保存”。

现在,我们有了一个包含第一个图表的信息中心。

3d3d45e4357454e0.png

7. 拨测和提醒政策

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

在左侧窗格中,依次选择“拨测”和“拨测概览”:

49368e5700274cf2.png

正如“拨测”页面所建议的那样,我们来设置第一个拨测。点击页面右上角的 Add Uptime Check 按钮。

d884560f91011009.png

在后续表单中,输入“Endpoint Uptime”作为标题,并输入负载平衡器的外部 IP 地址作为主机名。

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

点击创建提醒政策

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

74609849348bd03e.png

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

44c474e28a497659.png

点击 Add Notification Channel。最后,在表单底部,将政策命名为“Web 应用正常运行时间”,然后点击“保存”。

如需查看提醒的显示效果,请在 Cloud 控制台中再次打开 Cloud Shell。以下命令将停止在 Web 服务器 pod 中运行的 nginx 服务:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

几分钟后,您应该会收到一封电子邮件,其中会提醒您发生了中断:

808ac1d75ce3681f.png

让我们撤消该操作。回到 Cloud Shell,我们来重启 nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

几分钟后,您会收到另一封 Stackdriver 电子邮件,这次是好消息:

5b8262fbbc4877c.png

8. 清理

现在,我们已使用 Migrate for Anthos 从 GCE 迁移到 GKE,接下来我们来清理项目中的所有已创建资源。

删除项目

如果您愿意,可以删除整个项目。 在 GCP Console 中,转到 Cloud Resource Manager 页面:

在项目列表中,选择我们一直使用的项目,然后点击删除。此时,系统会提示您输入项目 ID。输入项目 ID,然后点击关停

如果您想逐个删除不同的组件,请继续阅读下一部分。

Stackdriver

信息中心

在信息中心页面中,点击页面顶部的“设置”图标 dc259295eb33cb42.png,然后选择删除信息中心

提醒政策

“政策”页面中,从右侧的“操作”菜单 2ef75d82e76accaa.png 中选择删除,以删除您创建的每项政策。

拨测

在“拨测”页面上,从您创建的每个拨测右侧的“操作”菜单中选择删除

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 服务器发生故障时收到通知