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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon FSx for Lustre CSI 驱动程序

重要

此功能在 中国 区域中不可用。

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

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

注意

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

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

Prerequisites

您必须:

  • 已安装 AWS CLI 的版本 1.18.190 或更高版本。您可以使用 aws --version 命令检查当前已安装的版本。要安装或升级 AWS CLI,请参阅安装 AWS CLI

  • 使用现有 Amazon EKS 集群。如果您当前没有集群,请参阅Amazon EKS 入门创建一个集群。

  • 已安装 eksctl 的版本 0.35.0 或更高版本。您可以使用 eksctl version 命令检查当前已安装的版本。要安装或升级 eksctl,请参阅安装或升级 eksctl

  • 已安装与您的集群版本相对应的 kubectl 的最新版本。您可以使用 kubectl version --short --client 命令检查当前已安装的版本。有关更多信息,请参阅安装kubectl

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

  1. 创建 AWS Identity and Access Management OIDC 提供程序,并将该提供程序与您的集群关联。

    eksctl utils associate-iam-oidc-provider \ --region <region-code> \ --cluster <prod> \ --approve
  2. 创建允许驱动程序代表您调用 IAM AWS APIs 的 策略和服务账户。

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

      { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "iam:CreateServiceLinkedRole", "iam:AttachRolePolicy", "iam:PutRolePolicy" ], "Resource":"arn:aws: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. 创建策略。

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

      记下返回的策略 Amazon 资源名称 (ARN)。

  3. 为驱动程序创建一个 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"

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

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

    1. https://console.amazonaws.cn/cloudformation 打开 AWS CloudFormation 控制台。

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

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

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

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

    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
  6. 修补驱动程序部署以添加在步骤 3 中创建的服务账户,并将 ARN 替换为在第 4 步中记录的 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 驱动程序是否正常工作

此过程使用来自 Amazon S3 Container Storage Interface (CSI) 驱动程序 存储库的 的动态卷预配置Amazon FSx for Lustre来使用动态预配置的 卷。GitHubAmazon 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 values> 替换为您自己的值。

    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 – for Lustre 文件系统的子网 ID。FSx并非所有FSx都支持适用于 Lustre 的 Amazon 可用区。通过 FSx 打开 Amazon https://console.amazonaws.cn/fsx/ for Lustre 控制台,确认您要使用的子网是否位于受支持的 可用区 中。子网可以包含您的节点,也可以是不同的子网或 VPC。如果您指定的子网不是具有节点的子网,则必须VPCs连接您的 ,并且必须确保在安全组中打开了必要的端口。

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

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

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

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

    注意

    s3ImportPaths3ExportPath 的 Amazon S3 存储桶必须相同,否则驱动程序无法创建 Amazon 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 文件。根据您的存储要求和您在上一步中选择的 <value>,将以下 deploymentType 更改为下面列出的增量值之一。

    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 之上的 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 之前,Pending 可能会在 5-10 分钟内显示为 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

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

如果您只希望导入和读取数据,而不执行任何修改和创建操作,则在 storageclass.yaml 文件中不需要 s3ExportPath 的值。验证示例应用程序已将数据写入 Amazon 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