为运行异步批处理任务构建预配置的 Amazon EKS 集群

将可扩展的数据存储解决方案与 eksctl “quickstart” 模板结合使用
发布时间:2023 年 10 月 2 日
EKS 集群设置
EKS
Kubernetes
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
30 分钟
前提条件

注册 / 登录 亚马逊云科技账户

上次更新时间
2023 年 10 月 2 日

在云原生应用程序的多样化生态系统中,有时实时交互性或即时响应并不是您的首要目标。关键实际上在于精确高效地执行异步后台任务。无论您是要传输大型文件、协调不同的数据集,还是编排复杂的作业计划,您都需要一个专为处理工作负载波动而构建、针对资源利用率而优化的环境。借助 Amazon EKS 和 EFS CSI 驱动程序提供的可扩展存储功能,以及 Cluster Autoscaler 支持的自动扩展策略,您可以轻松建立一个 EKS 集群,使之不仅针对异步操作进行优化,而且还能智能适应工作负载需求。

本教程介绍如何使用 eksctl “quickstart” 模板创建基于托管节点组的 Amazon EKS 集群。该集群旨在与 Amazon SQS 和 Amazon EFS 无缝集成,实现作业编排解耦和持久、可扩展的存储,并为本系列文章后续探讨的高级使用场景奠定基础。

前提条件

在开始本教程之前,您需要:

  • 安装最新版本的 kubectl。运行以下命令检查您的 kubectl 版本:kubectl version --short。
  • 安装最新版本的 eksctl。运行以下命令检查您的 eksctl 版本:eksctl info。

概述

本教程是关于优化 Amazon EKS 批处理工作负载的系列教程的第一部分。它旨在指导您使用 eksctl “quickstart” 模板完成用于处理中小型异步后台任务的集群的预配置。此模板不仅有助于批处理作业的执行,而且还增加了额外的安全层,与生产部署的最佳实践保持一致。该模板配置以下组件:

  • 自动扩展:此设置中的托管节点组使用 c5a.xlarge 实例类型,非常适合使用高性能处理器的计算密集型应用程序以及批处理工作负载。这些节点组的最小节点数量为 3,最大节点数量为 6,可以动态适应工作负载需求。子网标签允许 Kubernetes Cluster Autoscaler (CA) 按需动态扩展集群。
  • 身份验证:必要的服务账户 IAM 角色 (IRSA) 映射,用于实现 Kubernetes Pod 和亚马逊云科技服务之间的通信。这包括用于动态扩展的 Kubernetes Cluster Autoscaler (CA)、用于容器映像私有存储库访问的 Amazon ECR(对于批处理工作负载至关重要)、用于块级持久数据存储的 Amazon EBS CSI 驱动程序、用于跨多个节点共享文件系统存储的 Amazon EFS CSI 驱动程序。此外,OpenID Connect (OIDC) 端点可实现无缝且安全的通信。
  • 附加组件:该模板包含 EFS CSI 驱动程序附加组件,可简化设置复杂的批处理作业所需的共享文件系统。
  • 私有网络:托管节点组利用私有网络和 NAT 网关来限制互联网直接访问,从而增强安全性。
  • 监控:Amazon CloudWatch IAM 策略附加到服务账户 IAM 角色 (IRSA),帮助 CloudWatch Container Insights 等可选组件收集和汇总指标和日志。

步骤 1:配置集群

在本节中,您将配置 Amazon EKS 集群以满足高流量微服务应用程序的特定需求。创建 cluster-config.yaml 这一文件,您就可以定义 IAM 角色、可扩展资源、私有网络和监控的设置。这些配置至关重要,能够确保集群安全、可靠、可扩展,且在动态可扩展性和数据持久性方面达成最优性能。

为创建集群配置,请您:

  • 创建 cluster-config.yaml 文件,并将以下内容粘贴到其中。替换 region。
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
 name: async-batch-quickstart
 region: us-east-1
 version: "1.27"

managedNodeGroups:
- name: managed-ng
 minSize: 3
 maxSize: 6
 desiredCapacity: 3
 instanceType: c5a.xlarge
 privateNetworking: true
 tags:
 k8s.io/cluster-autoscaler/enabled: 'true'
 k8s.io/cluster-autoscaler/async-batch-quickstart: 'owned'

addons:
 - name: aws-efs-csi-driver
 
iam:
 withOIDC: true
 serviceAccounts:
 - metadata:
 name: cluster-autoscaler
 namespace: kube-system
 wellKnownPolicies:
 autoScaler: true
 - metadata:
 name: efs-csi-controller-sa
 namespace: kube-system
 wellKnownPolicies:
 efsCSIController: true
 - metadata:
 name: ecr-sa
 namespace: default
 attachPolicyARNs:
 - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser

cloudWatch:
 clusterLogging:
 enableTypes: ["*"]
 logRetentionInDays: 30

步骤 2:创建集群

现在,我们已准备好创建 Amazon EKS 集群。此过程需要几分钟才能完成。如果要监控状态,请查看 Amazon CloudFormation 控制台。

  • 运行以下命令创建 EKS 集群:
eksctl create cluster -f cluster-config.yaml

请注意:如果您在响应中收到 “Error: checking AWS STS access”(错误:正在检查 AWS STS 访问),请检查当前 shell 会话使用的用户身份是否正确。您可能还需要指定命名配置文件,例如 --profile clusteradmin。这取决于您配置 Amazon CLI 的方式。

完成后,您应当会看到以下输出结果:

2023-08-15 19:48:34 [✔] EKS cluster "async-batch-quickstart" in "us-east-1" region is ready

上一个命令完成后,使用以下命令验证所有节点是否都已达到 Ready 状态:

`kubectl get nodes`

输出结果应该如下所示:

NAME STATUS ROLES AGE VERSION
ip-192-168-157-61.us-east-1.compute.internal Ready <none>34m v1.27.1-eks-2f008fe
ip-192-168-119-216.us-east-1.compute.internal Ready <none>34m v1.27.1-eks-2f008fe
ip-192-168-40-177.us-east-1.compute.internal Ready <none>34m v1.27.1-eks-2f008fe

步骤 3:验证集群节点和 Pod 运行状况

检查您的集群上是否安装了 EFS CSI 驱动程序附加组件。替换 region 的示例值。

eksctl get addon --cluster async-batch-quickstart --region us-east-1 | grep efs
  • 对于调度到 Windows 节点上的 Windows Pod, 需要配置 nodeSelector 和合适的匹配 toleration 以便选择 Windows 节点。我们在 Windows 负载部署清单里配置了 nodeSelector (kubernetes.io/os=windows) 和 toleration (os=windows),以确保 Windows Pod 只会被部署到 Windows 节点上。运行以下命令部署实例应用:
kubectl apply -f windows-workload.yaml
输出结果应该如下所示:
aws-efs-csi-driver v1.5.8-eksbuild.1 ACTIVE 0

使用以下命令验证集群中创建的所有服务帐户:

kubectl get sa -A | egrep "ecr-sa|efs-csi-controlle`r`|amazon-ebs|cluster-autoscaler"

输出结果应该如下所示:

default ecr-sa 0 43m
kube-system cluster-autoscaler 0 43m
kube-system efs-csi-controller-sa 0 43m

恭喜您!您已经成功搭建了 Amazon EKS 集群的基础设施,为部署数据密集型批处理流程奠定了必要的基础。这套环境能为您提供部署批处理作业和作业队列所需的所有条件。

(可选)部署示例应用程序

现在,您已准备好在 Kubernetes 集群中编排批处理工作负载,将 Amazon SQS 用作作业队列,利用 Amazon EFS 实现数据持久性。若需查看详细教程,请参阅在 Amazon EKS 中使用 SQS 和 EFS 持久性存储管理异步任务。此教程将指导您设置 Amazon SQS 以进行任务队列管理、集成 Amazon EFS 以进行持久性存储。最后,您可以选择配置 EFS CSI 驱动程序附加组件,以处理需要跨节点共享文件系统的复杂批处理作业。

清理资源

为避免持续产生费用,建议您删除在学习本教程的过程中创建的资源。您可以使用以下命令删除 EKS 集群。替换 region。

eksctl delete cluster -f ./cluster-config.yaml

结论

当您顺利完成本教程时,您就成功搭建了一个专为批处理任务优化的 Amazon EKS 集群。选用计算优化型 EC2 实例并实施关键 IAM 策略后,您就构建了一个兼具敏捷性和稳健性的集群。本教程指导您创建和部署 Amazon EKS 集群,以及验证节点和 Pod 运行状况。要扩展集群的功能,请考虑设置 Cluster Autoscaler 以根据资源要求动态调整工作线程节点的数量,从而确保资源利用率和成本效益最佳,或者设置 Amazon EFS 以实现跨多个节点甚至跨不同可用区共享的持久存储。这些额外的配置将为您提供一个适用于部署无状态及数据密集型批处理作业的多用途且完备的环境。