学习如何在 GKE 上将 x86 应用程序迁移到 Arm 的多架构。






1.73/5 (6投票s)
如何将现有的 x86 容器化应用程序迁移到 Arm。
本文面向读者?
这是一个面向希望将其现有的 x86 容器化应用程序迁移到 Arm 的软件开发人员的高级主题。
您将学到什么?
完成本学习路径后,您将能够
- 将 Arm 节点添加到现有的基于 x86 的 GKE 集群
- 重新构建基于 x86 的应用程序,使其支持多架构并在 Arm 上运行
- 了解如何为 GKE 集群添加污点和容忍度,以便将应用程序 Pod 调度到特定架构的节点上
- 在单个 GKE 集群上跨多种架构运行多架构应用程序
必备组件
开始之前,您需要准备以下内容
- 一个 Google Cloud 账号。如有需要,请创建账号。
- 一台安装了 Google Cloud CLI 和 kubectl 的计算机
- 一个已有的、带有 x86 节点 Google Kubernetes Engine (GKE) 集群
将现有的基于 x86 的应用程序迁移到单个 GKE 集群的基于 Arm 的节点上运行
Google Kubernetes Engine (GKE) 支持混合集群,其中包含 x86 和基于 Arm 的节点。基于 Arm 的节点可以部署在 Tau T2A 系列虚拟机上。Tau T2A 虚拟机搭载 Ampere Altra 基于 Arm 的处理器。
开始之前
在您的本地计算机上,安装以下工具。
您需要一个 Google Cloud 账号。如有需要,请创建账号。
您的本地计算机需要安装三个工具。请按照链接安装所需的工具。
在 Google Artifact Registry 中创建 Docker 仓库
本节假定您在环境中已有一个包含 3 个 x86 节点的 GKE 集群。如果您没有该集群,请按照 Google 官方文档 创建一个。
设置以下环境变量
export PROJECT_ID=<your-project-id>
export ZONE=<zone id - us-central1-c>
export CLUSTER_NAME=<your-cluster-name>
下面列出的 GitHub 项目仓库包含遵循此学习路径所需的所有文件。将其克隆到您的本地计算机。
git clone https://github.com/pbk8s/gke-arm
使用以下命令在 Google Artifact Registry 中创建 Docker 仓库
gcloud artifacts repositories create docker-repo \
--repository-format=docker \
--location=<your-region> \
--description="Docker repository for multi-arch images"
将上面的命令中的 <your-region>
替换为您想要创建仓库存储的位置。
配置 cli
以对 Artifact Registry 中的 Docker 仓库进行身份验证
gcloud auth configure-docker us-central1-docker.pkg.dev
为现有的基于 x86 的应用程序版本构建 Docker 镜像
docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/x86-hello:v0.0.1 .
将您创建的 Docker 镜像推送到 Docker 仓库
docker push us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/x86-hello:v0.0.1
连接到您现有的 GKE 集群(带 x86 节点)并部署应用程序
检索 GKE 集群凭证
gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE --project $PROJECT_ID
使用一个名为 Kustomize 的工具更新 Docker 镜像。此工具允许您自定义 Kubernetes 对象。
$(cd k8s/overlays/x86 && kustomize edit set image hello=us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/x86-hello:v0.0.1)
kubectl apply -k k8s/overlays/x86
要从集群外部访问应用程序,请部署以下 Kubernetes 服务
kubectl apply -f k8s/hello-service.yaml
在为此服务分配外部 IP 后,打开浏览器并访问网页,如下图所示。
http://$external_ip
或者,您也可以使用 curl
命令访问网页。
curl -w '\n' http://$external_ip
您应该会看到与下面显示的输出类似的内容。
Hello from NODE:gke-multi-arch-cluster-default-pool-45537239-q83v,
POD:x86-hello-deployment-9e7b823ed8-xutvf, CPU PLATFORM:linux/amd64
将 Arm 节点添加到您的 GKE 集群
使用以下命令将带有 VM 类型 t2a-standard-2
的 Arm 节点池添加到您的 GKE 集群。
gcloud container node-pools create arm-pool \
--cluster $CLUSTER_NAME \
--zone $ZONE \
--machine-type=t2a-standard-2 \
--num-nodes=3
成功将 Arm 节点添加到集群后,运行以下命令检查集群中是否同时显示两种类型的节点。
kubectl get nodes -o wide
输出应同时显示 x86 和基于 Arm 的节点。
您现在已成功设置了一个包含 x86 和 Arm64 架构节点的混合集群。
污点和容忍度
在具有不同架构(x86 和 Arm64)节点的混合集群设置中,GKE 会在节点上添加污点,以避免将 Pod 调度到错误架构的可能性。节点污点可告知 Kubernetes 调度程序特定节点仅供一个架构使用。容忍度允许您指定可以在污点节点上使用的 Pod。
在 GitHub 仓库中,查看以下 yaml 文件。
cat k8s/overlays/arm/add_arm_support.yaml
在此文件中,请参考下面显示的部分。
nodeSelector:
kubernetes.io/arch: arm64
此字段指定应用程序应仅在基于 Arm 的节点上运行。应用此文件后,GKE 会添加一个与 Arm 节点上的污点匹配的容忍度,以便将基于 Arm 的应用程序 Pod 调度到这些节点上。
修改应用程序以在基于 Arm 的节点上运行
此学习路径中使用的应用程序是用 Go 语言开发的。请检查以下文件的内容。
cat Dockerfile_arm
在此文件中,架构标志设置为 GOARCH=arm64
。这样,构建的应用程序将兼容 Arm。现在,您可以使用以下命令集来构建 Docker 镜像并将其推送到注册中心。
docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/arm-hello:v0.0.1 -f Dockerfile_arm .
docker push us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/arm-hello:v0.0.1
现在,使用污点和容忍度,将此应用程序部署到集群中。
$(cd k8s/overlays/arm && kustomize edit set image hello=us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/arm-hello:v0.0.1)
kubectl apply -k k8s/overlays/arm
应用程序部署后,使用以下命令检查 Pod 的状态。
kubectl get pods
打开 Web 浏览器并访问外部 IP URL,或使用 curl
命令,如下图所示。
curl -w '\n' http://$external_ip
刷新浏览器几次,您应该会看到来自应用程序的 x86 和 Arm 兼容版本的输出。
输出将与下面显示的类似。
Hello from NODE:gke-multi-arch-cluster-default-pool-45537239-q83v, POD:x86-hello-deployment-9e7b823ed8-xutvf, CPU PLATFORM:linux/amd64
Hello from NODE:gke-multi-arch-cluster-arm-pool-n381qvv-bqcr, POD:arm-hello-deployment-21b8d2exfc-o8q33, CPU PLATFORM:linux/arm64
您现在已将现有的基于 x86 的应用程序迁移到基于 Arm 的 GKE 集群上运行,并使其支持多架构。
想继续学习?请访问 learn.arm.com,查找更多旨在帮助您更快开发高质量 Arm 软件的教程。