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

1. 概览

通过手动重写或重新设计现有应用并不总是可行或可行的。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:

创建计算实例 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,稍后我们需要用它来验证网络服务器是否正在运行。

a08aa5bf924b107d.png

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

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

登录我们的计算实例后,安装 nginx:

sudo apt install nginx

使用 logout 命令退出 SSH 会话

现在,在浏览器中输入先前的实例的外部 IP,从而验证网络服务器是否正在运行。您应该会看到默认的 nginx 欢迎屏幕:

5c08e3b2bd17e03

此 Web 服务器将用作我们使用 Migrate for Anthos 迁移到 Kubernetes 的旧版 Web 应用。

3. 使用 Migrate for Anthos 的 Kubernetes 集群

接下来,我们将创建一个 GKE 集群,我们最终会在该集群中迁移 Compute Engine 网络服务器。在 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

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

94dc6238b2affd16

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

5bf601103a5335cf.png

4. 从计算实例到有状态集

现在,我们已经有一个运行 Migrate for Anthos 的 Kubernetes 集群,可以开始迁移过程了。为了将计算实例部署到 Kubenetes 集群,我们将关闭计算引擎实例,以便能够截取磁盘快照。在继续操作之前,请记下实例 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 集群中预配一个有状态集,以及将复制磁盘装载到网络服务器容器所需的永久性卷声明。我们可以使用 kubectl 应用这些更改:

kubectl apply -f containerized-webserver.yaml

在“工作负载”页面上检查 webserver-statefulset 的状态:

显示“Pod 待处理”状态是正常现象运行 kubectl apply 之后几分钟。状态显示为“正常”后继续。

5. 将集群公开给负载平衡器

此时,我们的 Kubenetes 集群应该以有状态集的形式运行我们的网络服务器,但我们还需要将其容器公开给负载平衡器,以便通过外部 IP 地址访问我们的网络服务器。在 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

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

6. Stackdriver 监控

指标

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

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

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

4e62c8ad3f2b3fe9

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

62066a9251d19843

在“工作负载”视图中,展开“my-gke-cluster”并展开细目到默认值 >webserver-statefulsetwebserver-statefulset-0webserver-statefulset。点击 webserver-stateful set 容器。在这里,您会看到 Stackdriver 获取的一些开箱即用的指标,包括内存利用率和 CPU 利用率。

d054778de301429e.png

我们可以使用此信息中心中显示的图表来创建自定义信息中心。

自定义信息中心

Stackdriver 让我们可以创建自定义信息中心,用来整理各种可用指标数据的图表和图形。让我们创建一个自定义信息中心,以便提供一些网络服务器指标的概览。

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

56a0513efe60de3e

现在,我们的信息中心已经为空,接下来我们可以添加需要关注的指标了。我们不妨给未命名的信息中心取个有用的名称,比如“My Web Server Containers”然后点击“添加图表”:

bd66ba91f3125028.png

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

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

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

3d3d45e4357454e0

7. 拨测和提醒政策

借助 Stackdriver,我们可以设置提醒,以便在任何指标达到我们指定的任何阈值时通知我们。例如,我们可以在上一步的 CPU 利用率持续超过特定阈值时让 Stackdriver 通过电子邮件向我们发送电子邮件,这可能表明我们的应用存在问题。为了演示此类提醒是什么样的,我们来设置一项正常运行时间检查,然后模拟服务中断的情况。

在左侧窗格中,依次选择“Uptime Checks”和“Uptime Checks Overview:

49368e5700274cf2

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

d884560f91011009.png

在开始表单中,输入“Endpoint Uptime”将负载平衡器的外部 IP 地址用作主机名。

568a8f1e27ae8417

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

f89d53a106a709f4.png

点击创建提醒政策

将其命名为“Endpoint Uptime Policy”在配置部分中,设置“条件触发条件”更改为“任何违反时间序列的情况”然后点击保存

74609849348bd03e

我们还没有完全完成。接下来,我们将指定一个通知渠道,以便在违反提醒政策时能收到通知。在 Notification Channel Type (通知渠道类型)下拉菜单中,选择 Email(电子邮件),后跟一个有效的电子邮件地址。

44c474e28a497659

点击添加通知渠道。最后,在表单底部将政策命名为“Web App Uptime”然后点击“保存”

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

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

几分钟后,您应该会收到服务中断的提醒电子邮件:

808ac1d75ce3681f

让我们撤消这一操作。返回 Cloud Shell,重启 nginx:

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

几分钟后,您会收到一封 Stackdriver 电子邮件,这一次有比以往更好的消息:

5b8262fbbc4877c

8. 清理

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

删除项目

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

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

如果您希望逐个删除不同的组件,请继续学习下一部分。

Stackdriver

信息中心

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

提醒政策

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

拨测

在“拨测”页面中,从您创建的每项检查右侧的“操作”菜单中选择 Delete

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 并构建了一个自定义信息中心,
  • 我们配置了正常运行时间检查和提醒政策,以便在我们的网络服务器出现故障时通知我们