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,稍后我们需要用它来验证网络服务器是否正在运行。
当实例启动并运行后,我们可以通过 Cloud Shell 通过 SSH 连接到实例,以安装 nginx 并启动 Web 服务器:
gcloud compute ssh --zone us-central1-a webserver
登录我们的计算实例后,安装 nginx:
sudo apt install nginx
使用 logout
命令退出 SSH 会话
现在,在浏览器中输入先前的实例的外部 IP,从而验证网络服务器是否正在运行。您应该会看到默认的 nginx 欢迎屏幕:
此 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
此命令需要几分钟才能完成。创建集群后,您将收到一些输出,其中包含其详细信息:
接下来,导航到 GCP Marketplace 以部署 Migrate for Anthos:
在 Migrate for Anthos 的 Marketplace 页面上,点击“配置”,如果系统提示,请从列表中选择您的项目。随后的页面将显示输入了一些默认值的表单。确保所选的集群就是我们刚刚创建的集群,然后点击部署:
现在,Migrate for Anthos 应该部署在我们的 Kubernetes 集群上。部署完成后,您会看到状态显示为“OK”在 Kubernetes Engine 应用页面上:
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 欢迎屏幕:
我们成功了!我们的 GCE Web 服务器现在托管在 Kubernetes 上了!很好!
6. Stackdriver 监控
指标
作为一项托管式 Kubernetes 服务,Kubernetes Engine 会自动进行插桩,以便使用 Stackdriver 进行日志记录和监控。我们来看看 Stackdriver 自动捕获的一些指标。
点击产品菜单上的 Monitoring 链接 - 首次从项目中访问此链接可能需要几分钟时间,因为项目中会设置工作区。
加载完成后,将鼠标悬停在左侧窗格中的“资源”上,然后选择“Kubernetes Engine NEW”。
此处显示的信息中心内的每一行都代表一个 Kubernetes 资源。您可以使用信息中心上方的链接在基础架构、工作负载或服务视图之间切换。
在“工作负载”视图中,展开“my-gke-cluster”并展开细目到默认值 >webserver-statefulsetwebserver-statefulset-0webserver-statefulset。点击 webserver-stateful set 容器。在这里,您会看到 Stackdriver 获取的一些开箱即用的指标,包括内存利用率和 CPU 利用率。
我们可以使用此信息中心中显示的图表来创建自定义信息中心。
自定义信息中心
Stackdriver 让我们可以创建自定义信息中心,用来整理各种可用指标数据的图表和图形。让我们创建一个自定义信息中心,以便提供一些网络服务器指标的概览。
在左侧窗格中,将鼠标悬停在“信息中心”,然后点击“创建信息中心”。
现在,我们的信息中心已经为空,接下来我们可以添加需要关注的指标了。我们不妨给未命名的信息中心取个有用的名称,比如“My Web Server Containers”然后点击“添加图表”:
还记得现成的指标吗?我们来添加一个容器 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”。点击“保存”。
我们现在有一个包含第一个图表的信息中心。
7. 拨测和提醒政策
借助 Stackdriver,我们可以设置提醒,以便在任何指标达到我们指定的任何阈值时通知我们。例如,我们可以在上一步的 CPU 利用率持续超过特定阈值时让 Stackdriver 通过电子邮件向我们发送电子邮件,这可能表明我们的应用存在问题。为了演示此类提醒是什么样的,我们来设置一项正常运行时间检查,然后模拟服务中断的情况。
在左侧窗格中,依次选择“Uptime Checks”和“Uptime Checks Overview:
正如“拨测”页面所示,我们来设置第一次拨测。点击页面右上角的 Add Uptime Check 按钮。
在开始表单中,输入“Endpoint Uptime”将负载平衡器的外部 IP 地址用作主机名。
点击保存,系统会提示您创建随附的提醒政策:
点击创建提醒政策。
将其命名为“Endpoint Uptime Policy”在配置部分中,设置“条件触发条件”更改为“任何违反时间序列的情况”然后点击保存。
我们还没有完全完成。接下来,我们将指定一个通知渠道,以便在违反提醒政策时能收到通知。在 Notification Channel Type (通知渠道类型)下拉菜单中,选择 Email(电子邮件),后跟一个有效的电子邮件地址。
点击添加通知渠道。最后,在表单底部将政策命名为“Web App Uptime”然后点击“保存”
如需查看提醒的显示效果,请在 Cloud 控制台中再次打开 Cloud Shell。以下命令将停止在我们的网络服务器 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
信息中心
在信息中心页面,点击页面顶部的设置图标 ,然后选择删除信息中心。
提醒政策
在“政策”页面中,从右侧的“操作”菜单 中为您创建的每项政策选择删除。
拨测
在“拨测”页面中,从您创建的每项检查右侧的“操作”菜单中选择 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 并构建了一个自定义信息中心,
- 我们配置了正常运行时间检查和提醒政策,以便在我们的网络服务器出现故障时通知我们