在完成本学习路径后,将能够:
开始之前,需要以下条件:
Google Kubernetes Engine (GKE)支持混合集群,包含基于x86和Arm的节点。Arm节点可以在Tau T2A系列虚拟机上部署。Tau T2A虚拟机由Ampere Altra基于Arm的处理器提供支持。
在本地机器上安装以下工具:
本节假设环境中有一个运行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的节点池,使用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。
本学习路径中使用的应用是用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