在GKE集群中将x86应用迁移至Arm架构

在完成本学习路径后,将能够:

  • 在现有的基于x86GKE集群中添加基于Arm的节点
  • 重建基于x86的应用,使其成为多架构应用,并在Arm上运行
  • 学习如何在GKE集群中添加污点和容忍,以在特定架构的节点上调度应用Pod
  • 在单个GKE集群上跨多种架构运行多架构应用

先决条件

开始之前,需要以下条件:

  • 一个Google Cloud账户。如果需要,请创建一个账户。
  • 一台安装了Google Cloud CLI和kubectl的计算机。
  • 一个现有的基于x86的Google Kubernetes Engine (GKE)集群。

在单个GKE集群中将现有的基于x86的应用迁移至基于Arm的节点

Google Kubernetes Engine (GKE)支持混合集群,包含基于x86和Arm的节点。Arm节点可以在Tau T2A系列虚拟机上部署。Tau T2A虚拟机由Ampere Altra基于Arm的处理器提供支持。

在本地机器上安装以下工具:

  • Google Cloud账户。如果需要,请创建一个账户。
  • 需要在本地机器上安装三个工具。请按照链接安装所需的工具。
  • Kubectl
  • Google Cloud CLI
  • Docker

本节假设环境中有一个运行3个基于x86的节点的GKE集群。如果没有集群,请按照创建一个。

设置以下环境变量:

export PROJECT_ID= export ZONE= export 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= \ --description="Docker repository for multi-arch images"

替换为想要创建仓库存储的位置。

配置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.1 .

将创建的Docker镜像推送到Docker仓库:

docker push us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/x86-hello:v0.1

获取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.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

向GKE集群添加基于Arm的节点

使用以下命令向GKE集群添加基于Arm的节点池,使用VM类型t2a-standard-2:

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.1 -f Dockerfile_arm . docker push us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/arm-hello:v0.1

现在,使用污点和容忍,在集群中部署此应用:

$(cd k8s/overlays/arm && kustomize edit set image hello=us-central1-docker.pkg.dev/$PROJECT_ID/docker-repo/arm-hello:v0.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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485