使用 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 项目。如果您没有此类项目,则必须 创建一个

2. 准备工作

本 Codelab 可以在 Google Cloud Platform 上完全运行,无需进行任何本地安装或配置。

启用 API

在开始之前,请务必在 Google Cloud 项目上启用所需的 API:

创建 Compute 实例 Web 服务器

我们来创建一个计算实例,用于托管初始 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 服务器将充当旧版 Web 应用,我们将使用 Migrate for Anthos 将其迁移到 Kubernetes。

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 集群,现在可以开始迁移过程了。 为了将 Compute 实例部署到 Kubernetes 集群,我们将关闭 Compute Engine 实例,以便能够为磁盘拍摄快照。在继续之前,请记下实例 ID,我们稍后需要使用此 ID:

gcloud compute instances describe webserver --zone us-central1-a | grep ^id

我们来关闭 Compute 实例:

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-statefulset 容器。在这里,您会发现 Stackdriver 捕获的一些现成指标,包括内存利用率和 CPU 利用率。

d054778de301429e.png

此信息中心中显示的图表是我们能够用来创建自定义信息中心的图表。

自定义信息中心

Stackdriver 允许我们创建自定义信息中心,我们可以使用这些信息中心来整理可供我们使用的任何指标数据的图表。 我们来创建一个自定义信息中心,以便一目了然地查看 Web 服务器的一些指标。

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

56a0513efe60de3e.png

现在我们有了一个空的信息中心,可以添加想要关注的指标。我们来为“无标题信息中心”指定一个有用的名称,例如“我的 Web 服务器容器”,然后点击右上角的“添加图表”:

bd66ba91f3125028.png

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

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

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

3d3d45e4357454e0.png

7. 拨测和提醒政策

借助 Stackdriver,我们可以设置提醒,以便在任何指标达到我们指定的任何阈值时收到通知。 例如,我们可以让 Stackdriver 在上一步中的 CPU 利用率持续超过某个阈值时向我们发送电子邮件,这可能表明我们的应用存在问题。为了演示这些提醒的外观,我们来设置一个拨测 ,然后模拟中断。

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

49368e5700274cf2.png

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

d884560f91011009.png

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

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

点击创建提醒政策

我们来将其命名为“Endpoint Uptime Policy”。 在配置 部分中,将“条件触发的条件”设置为“每当违反时序时”,然后点击保存

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 服务器关闭时收到通知