Amazon FSx for Lustre CSI 驱动程序 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon FSx for Lustre CSI 驱动程序

FSx for Lustre Container Storage Interface (CSI) 驱动程序提供了一个 CSI 接口,允许 Amazon EKS 集群管理 FSx for Lustre 文件系统的生命周期。

本主题介绍了如何部署 FSx for Lustre CSI 驱动程序到您的 Amazon EKS 集群,并验证它是否正常工作。我们建议使用 0.4.0 版本的驱动程序。

注意

此驱动程序在 Kubernetes 版本 1.21 及更高版本的 Amazon EKS 集群和节点上受支持。此驱动程序在 Fargate 或 Arm 节点上不受支持。Amazon EKS 集群上不支持 FSx for Lustre CSI 驱动程序的 Alpha 功能。驱动程序处于 Beta 版本。它经过了严格测试且 Amazon EKS 支持将它用于生产。不会删除对此驱动程序的支持,尽管详细信息可能会发生变化。如果驱动程序的架构或原理图发生变化,则将提供迁移到下一版本的说明。

有关可用参数的详细说明和演示驱动程序功能的完整示例,请参阅 GitHub 上的 FSx for Lustre Container Storage Interface (CSI) 驱动程序项目。

先决条件

您必须:

  • 您的计算机或 Amazon CloudShell 上安装并配置了 2.4.9 版或更高版本,或 1.22.30 版或更高版本的 Amazon CLI。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装、更新和卸载 Amazon CLI使用 aws configure 进行快速配置

  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 集群的现有 Amazon Identity and Access Management IAM OpenID Connect (OIDC) 提供程序。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

  • 计算机或 Amazon CloudShell 上已安装 0.84.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅安装 eksctl

  • 计算机或 Amazon CloudShell 上安装的 kubectl 命令行工具。其版本必须与您的集群版本相同,或者最多高出两个版本。要安装或升级 kubectl,请参阅 安装 kubectl

将 FSx for Lustre CSI 驱动程序部署到 Amazon EKS 集群

  1. 创建允许驱动程序代表您调用 Amazon API 的 IAM 策略和服务账户。

    1. 复制以下文本并将其保存到名为 fsx-csi-driver.json 的文件。

      { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "iam:CreateServiceLinkedRole", "iam:AttachRolePolicy", "iam:PutRolePolicy" ], "Resource":"arn:aws-cn:iam::*:role/aws-service-role/s3.data-source.lustre.fsx.amazonaws.com/*" }, { "Action":"iam:CreateServiceLinkedRole", "Effect":"Allow", "Resource":"*", "Condition":{ "StringLike":{ "iam:AWSServiceName":[ "fsx.amazonaws.com" ] } } }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "fsx:CreateFileSystem", "fsx:DeleteFileSystem", "fsx:DescribeFileSystems" ], "Resource":[ "*" ] } ] }
    2. 创建策略。您可以将 Amazon_FSx_Lustre_CSI_Driver 替换为其他名称。

      aws iam create-policy \ --policy-name Amazon_FSx_Lustre_CSI_Driver \ --policy-document file://fsx-csi-driver.json

      记下返回的策略 Amazon Resource Name (ARN)。

  2. 为驱动程序创建一个 Kubernetes 服务账户,并将策略附加到该服务账户。将策略的 ARN 替换为上一步骤中返回的 ARN。

    eksctl create iamserviceaccount \ --region region-code \ --name fsx-csi-controller-sa \ --namespace kube-system \ --cluster prod \ --attach-policy-arn arn:aws:iam::111122223333:policy/Amazon_FSx_Lustre_CSI_Driver \ --approve

    输出:

    创建服务账户时,您将看到几行输出。输出的最后一行类似于以下示例行。

    [ℹ] created serviceaccount "kube-system/fsx-csi-controller-sa"

    记录已部署的 Amazon CloudFormation 堆栈的名称。在上面的示例输出中,堆栈的名称为 eksctl-prod-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa

  3. 记录所创建角色的角色 ARN

    1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

    2. 确保将控制台设置为您在其中创建 IAM 角色的 Amazon Web Services 区域,然后选择 Stacks(堆栈)。

    3. 选择名为 eksctl-prod-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa 的堆栈。

    4. 选择 Outputs(输出)选项卡。Role ARN(角色 ARN)列在 Output(1)(输出 (1))页面上。

  4. 使用以下命令部署驱动程序。

    注意

    要查看或手动下载 yaml 文件,您可以在 aws-fsx-csi-driver Github 上找到它。

    kubectl apply -k "github.com/kubernetes-sigs/aws-fsx-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"

    输出

    Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply serviceaccount/fsx-csi-controller-sa configured clusterrole.rbac.authorization.k8s.io/fsx-csi-external-provisioner-role created clusterrolebinding.rbac.authorization.k8s.io/fsx-csi-external-provisioner-binding created deployment.apps/fsx-csi-controller created daemonset.apps/fsx-csi-node created csidriver.storage.k8s.io/fsx.csi.aws.com created
  5. 修补驱动程序部署以添加之前创建的服务账户,并将 ARN 替换为记录的 ARN。

    kubectl annotate serviceaccount -n kube-system fsx-csi-controller-sa \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-NPFTLHJ5PJF5 --overwrite=true

部署 Kubernetes 存储类、持久卷注册和示例应用程序,以验证 CSI 驱动程序是否正常工作

此过程利用来自 FSx for Lustre Container Storage Interface (CSI) 驱动程序 GitHub 存储库的适用于 Amazon S3 的动态卷预置来使用动态预置的 FSx for Lustre 卷。

  1. 创建 Amazon S3 存储桶,然后通过创建文件并将文件复制到该存储桶,从而在存储桶中创建一个名为 export 的文件夹。

    aws s3 mb s3://fsx-csi echo test-file >> testfile aws s3 cp testfile s3://fsx-csi/export/testfile
  2. 使用下面的命令下载 storageclass 清单。

    curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning_s3/specs/storageclass.yaml
  3. 编辑文件并将每个 example-value 替换为自己的值。

    parameters: subnetId: subnet-056da83524edbe641 securityGroupIds: sg-086f61ea73388fb6b s3ImportPath: s3://ml-training-data-000 s3ExportPath: s3://ml-training-data-000/export deploymentType: SCRATCH_2
    • subnetId – 应在其中创建 Amazon FSx for Lustre 文件系统的子网 ID。并非所有可用区都支持 Amazon FSx for Lustre。打开 https://console.aws.amazon.com/fsx/ 中 Amazon FSx for Lustre 控制台,确认您要使用的子网是否位于支持的可用区中。该子网可以包含您的节点,也可以是不同的子网或 VPC。如果您指定的子网不是节点所在的子网,则必须已连接 VPC,并且必须确保已在您的安全组中打开必要的端口。

    • securityGroupIds – 您的节点的安全组 ID。

      注意

      安全组必须允许入站/出站访问 Lustre 端口 988 和 1021–1023。有关更多信息,请参阅 Amazon FSx for Lustre 用户指南的 Lustre 客户端 VPC 安全组规则

    • s3ImportPath – 要将数据从中复制到持久性卷的 Amazon Simple Storage Service 数据存储库。指定之前创建的 fsx-csi 存储桶。

    • s3ExportPath – 要将新文件或修改过的文件导出到的 Amazon S3 数据存储库。指定之前创建的 fsx-csi/export 文件夹。

    • deploymentType – 文件系统部署类型。有效值包括 SCRATCH_1SCRATCH_2PERSISTENT_1。有关部署类型的更多信息,请参阅创建 Amazon FSx for Lustre 文件系统

    注意

    s3ImportPaths3ExportPath 的 Amazon S3 存储桶必须相同,否则驱动程序无法创建 FSx for Lustre 文件系统。s3ImportPath 可以是独立的。系统将自动创建随机路径,例如 s3://ml-training-data-000/FSxLustre20190308T012310Z。如果不为 s3ExportPath 指定值,则无法使用 S3ImportPath

  4. 创建 storageclass

    kubectl apply -f storageclass.yaml
  5. 下载持久卷注册清单。

    curl -o claim.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning_s3/specs/claim.yaml
  6. (可选)编辑 claim.yaml 文件。根据您的存储需求和上一步选择的 deploymentType,将 1200Gi 更改为下面列出的增量值之一。

    storage: 1200Gi
    • SCRATCH_2PERSISTENT – 1.2 TiB、2.4 TiB 或 2.4 TiB 之上的 2.4 TiB 增量。

    • SCRATCH_1 – 1.2 TiB、2.4 TiB、3.6 TiB 或 3.6 TiB 之上的 3.6 TiB 增量。

  7. 创建持久卷注册。

    kubectl apply -f claim.yaml
  8. 确认已预配置文件系统。

    kubectl get pvc

    输出。

    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fsx-claim Bound pvc-15dad3c1-2365-11ea-a836-02468c18769e 1200Gi RWX fsx-sc 7m37s
    注意

    STATUS 可能会在 5-10 分钟内显示为 Pending,然后才会更改为 Bound。请勿继续下一步,直到 STATUS 变成 Bound

  9. 部署示例应用程序。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning_s3/specs/pod.yaml
  10. 验证示例应用程序正在运行。

    kubectl get pods

    输出

    NAME READY STATUS RESTARTS AGE fsx-app 1/1 Running 0 8s

从 FSx for Lustre 文件系统访问 Amazon S3 文件

如果您只希望导入和读取数据,而不执行任何修改和创建操作,则在 s3ExportPath 文件中不需要 storageclass.yaml 的值。验证示例应用程序已将数据写入 FSx for Lustre 文件系统。

kubectl exec -it fsx-app ls /data

输出。

export out.txt

示例应用程序已将 out.txt 文件写入文件系统。

将文件存档到 s3ExportPath

对于新文件以及修改后的文件,您可以通过 Lustre 用户空间工具,使用您为 s3ExportPath 指定的值将数据存档回 Amazon S3。

  1. 将文件重新导出到 Amazon S3。

    kubectl exec -ti fsx-app -- lfs hsm_archive /data/out.txt
    注意
    • 新文件不会自动同步回 Amazon S3。为了将文件同步到 s3ExportPath,您需要在容器映像中安装 Lustre 客户端,并手动运行 lfs hsm_archive 命令。该容器应该在具有 CAP_SYS_ADMIN 功能的特权模式下运行。

    • 本示例使用生命周期挂钩来安装 Lustre 客户端,以便进行演示。常用的方法是使用 Lustre 客户端来构建容器镜像。

  2. 确认 out.txt 文件已写入到 Amazon S3 中的 s3ExportPath 文件夹。

    aws s3 ls fsx-csi/export/

    输出

    2019-12-23 12:11:35 4553 out.txt 2019-12-23 11:41:21 10 testfile