

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 部署适用于 Lustre 的 FSx 驱动程序
<a name="fsx-csi-create"></a>

本主题演示如何将[适用于 Lustre 的 FSx CSI 驱动程序](fsx-csi.md)部署到 Amazon EKS 集群，以及验证驱动程序是否正常工作。建议使用最新版本的驱动程序。有关可用版本，请参阅 GitHub 上的 [CSI Specification Compatibility Matrix](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/blob/master/docs/README.md#csi-specification-compatibility-matrix)（CSI 规范兼容性矩阵）。

**注意**  
Fargate 不支持该驱动程序。

有关可用参数的详细说明和演示驱动程序功能的完整示例，请参阅 GitHub 上的 [FSx for Lustre Container Storage Interface (CSI) driver](https://github.com/kubernetes-sigs/aws-fsx-csi-driver) 项目。

## 先决条件
<a name="fsx-csi-prereqs"></a>
+ 现有集群。
+ Amazon FSx CSI 驱动程序 EKS 附加组件支持通过 EKS 容器组身份或服务账户的 IAM 角色（IRSA）进行身份验证。要使用 EKS 容器组身份，请在部署 FSx CSI 驱动程序附加组件之前或之后安装容器组身份代理。有关更多信息，请参阅 [设置 Amazon EKS 容器组身份代理](pod-id-agent-setup.md)。要改用 IRSA，请参阅 [为集群创建 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)。
+ 在您的设备或 Amazon CloudShell 上安装和配置 Amazon 命令行界面（Amazon CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本，请参阅《Amazon 命令行界面用户指南》**中的[安装](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《Amazon CloudShell 用户指南》**中的[将 Amazon CLI 安装到您的主目录](https://docs.amazonaws.cn/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 您的设备或 Amazon CloudShell 上安装 `0.215.0` 版或更高版本的 `eksctl` 命令行工具。要安装或更新 `eksctl`，请参阅 `eksctl` 文档中的 [Installation](https://eksctl.io/installation)。
+ 您的设备或 Amazon CloudShell 上安装了 `kubectl` 命令行工具。该版本可以与集群的 Kubernetes 版本相同，或者最多早于或晚于该版本一个次要版本。例如，如果您的集群版本为 `1.29`，则可以将 `kubectl` 的 `1.28`、`1.29` 或 `1.30` 版本与之配合使用。要安装或升级 `kubectl`，请参阅 [设置 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 第 1 步：创建 IAM 角色
<a name="fsx-create-iam-role"></a>

Amazon FSx CSI 插件需要 IAM 权限才能代表您调用 Amazon API。

**注意**  
容器组（pod）将有权访问分配给 IAM 角色的权限，除非您阻止对 IMDS 的访问。有关更多信息，请参阅 [使用最佳实践保护 Amazon EKS 集群](security-best-practices.md)。

以下过程为您演示了如何创建 IAM 角色并向其附加 Amazon 托管策略。

1. 使用以下命令创建 IAM 角色并附加 Amazon 托管策略。将 `my-cluster` 替换为您要使用的集群的名称。此命令将部署 Amazon CloudFormation 堆栈，该堆栈将创建 IAM 角色，并会将 IAM 策略附加到该堆栈。

   ```
   eksctl create iamserviceaccount \
       --name fsx-csi-controller-sa \
       --namespace kube-system \
       --cluster my-cluster \
       --role-name AmazonEKS_FSx_CSI_DriverRole \
       --role-only \
       --attach-policy-arn arn:aws-cn:iam::aws:policy/AmazonFSxFullAccess \
       --approve
   ```

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

   ```
   [ℹ]  1 task: {
       2 sequential sub-tasks: {
           create IAM role for serviceaccount "kube-system/fsx-csi-controller-sa",
           create serviceaccount "kube-system/fsx-csi-controller-sa",
       } }
   [ℹ]  building iamserviceaccount stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  deploying stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  waiting for CloudFormation stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  created serviceaccount "kube-system/fsx-csi-controller-sa"
   ```

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

现在您已经创建了 Amazon FSx CSI 驱动程序 IAM 角色，可以前往完成下一部分。使用此 IAM 角色部署附加组件后，该附加组件会创建一个名为 `fsx-csi-controller-sa` 的服务账户，并配置为使用该服务账户。服务账户绑定到被分配了所需的 Kubernetes 权限的 Kubernetes `clusterrole`。

## 第 2 步：安装 Amazon FSx CSI 驱动程序
<a name="fsx-csi-deploy-driver"></a>

我们建议您通过 Amazon EKS 附加组件来安装 Amazon FSx CSI 驱动程序，从而提高安全性并减少工作量。要将 Amazon EKS 附加组件添加到您的集群，请参阅 [创建 Amazon EKS 附加组件](creating-an-add-on.md)。有关附加组件的更多信息，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。

**重要**  
集群中预先安装的 Amazon FSx CSI 驱动程序可能会导致附加组件安装失败。当您在存在非 EKS FSx CSI 驱动程序的情况下尝试安装 Amazon EKS 附加组件版本时，由于资源冲突，安装将失败。在安装过程中使用 `OVERWRITE` 标志解决此问题。  

```
aws eks create-addon --addon-name aws-fsx-csi-driver --cluster-name my-cluster --resolve-conflicts OVERWRITE
```

如果要对 Amazon FSx CSI 驱动程序进行自主管理型安装，请参阅 GitHub 上的 [Installation](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/blob/master/docs/install.md)。

## 第 3 步：部署存储类、持久卷声明和示例应用程序
<a name="fsx-csi-deploy-storage-class"></a>

此过程利用 [FSx for Lustre Container Storage Interface（CSI）驱动程序](https://github.com/kubernetes-sigs/aws-fsx-csi-driver) GitHub 存储库来使用动态预置的 FSx for Lustre 卷。

1. 注意集群的安全组。您可以在 Amazon Web Services 管理控制台中的**联网**部分下或通过使用以下 Amazon CLI 命令来查看它。将 `my-cluster` 替换为您要使用的集群的名称。

   ```
   aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.clusterSecurityGroupId
   ```

1. 根据《Amazon FSx for Lustre 用户指南》中的 [Amazon VPC 安全组](https://docs.amazonaws.cn/fsx/latest/LustreGuide/limit-access-security-groups.html#fsx-vpc-security-groups)显示的标准，为您的 Amazon FSx 文件系统创建安全组。对于 **VPC**，选择 **Networking**（联网）部分下显示的集群的 VPC。对于“与 Lustre 客户端关联的安全组”，请使用您的集群安全组。您可以单独保留出站规则以允许**所有流量**。

1. 使用下面的命令下载存储类清单。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
   ```

1. 编辑 `storageclass.yaml` 文件的参数部分。将所有 example value 替换为您自己的值。

   ```
   parameters:
     subnetId: subnet-0eabfaa81fb22bcaf
     securityGroupIds: sg-068000ccf82dfba88
     deploymentType: PERSISTENT_1
     automaticBackupRetentionDays: "1"
     dailyAutomaticBackupStartTime: "00:00"
     copyTagsToBackups: "true"
     perUnitStorageThroughput: "200"
     dataCompressionType: "NONE"
     weeklyMaintenanceStartTime: "7:09:00"
     fileSystemTypeVersion: "2.12"
   ```
   +  **`subnetId`** – 应在其中创建 Amazon FSx for Lustre 文件系统的子网 ID。并非所有可用区都支持 Amazon FSx for Lustre。打开 https://console.aws.amazon.com/fsx/ 中 Amazon FSx for Lustre 控制台，确认您要使用的子网是否位于支持的可用区中。该子网可以包含您的节点，也可以是不同的子网或 VPC：
     + 您可以通过在 **Compute**（计算）部分下选择节点组来在 Amazon Web Services 管理控制台 中检查节点子网。
     + 如果您指定的子网不是节点所在的子网，则必须[已连接](https://docs.amazonaws.cn/whitepapers/latest/aws-vpc-connectivity-options/amazon-vpc-to-amazon-vpc-connectivity-options.html) VPC，并且必须确保已在您的安全组中打开必要的端口。
   +  **`securityGroupIds`** – 您为文件系统创建的安全组的 ID。
   +  **`deploymentType`（可选）**– 文件系统部署类型。有效值为 `SCRATCH_1`、`SCRATCH_2`、`PERSISTENT_1` 和 `PERSISTENT_2`。有关部署类型的更多信息，请参阅[创建 Amazon FSx for Lustre 文件系统](https://docs.amazonaws.cn/fsx/latest/LustreGuide/getting-started-step1.html)。
   +  **其他参数（可选）** – 有关其他参数的信息，请参阅 GitHub 上的[编辑 StorageClass](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/tree/master/examples/kubernetes/dynamic_provisioning#edit-storageclass)。

1. 创建存储类清单。

   ```
   kubectl apply -f storageclass.yaml
   ```

   示例输出如下。

   ```
   storageclass.storage.k8s.io/fsx-sc created
   ```

1. 下载持久卷注册清单。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/claim.yaml
   ```

1. （可选）编辑 `claim.yaml` 文件。根据您的存储需求和上一步选择的 `deploymentType`，将 `1200Gi` 更改为下面列出的增量值之一。

   ```
   storage: 1200Gi
   ```
   +  `SCRATCH_2` 和 `PERSISTENT` – `1.2 TiB`、`2.4 TiB`，或 2.4TiB 之上 2.4TiB 的增量。
   +  `SCRATCH_1` 和 `1.2 TiB` – `2.4 TiB`、`3.6 TiB`，或 3.6TiB 之上 3.6TiB 的增量。

1. 创建持久卷注册。

   ```
   kubectl apply -f claim.yaml
   ```

   示例输出如下。

   ```
   persistentvolumeclaim/fsx-claim created
   ```

1. 确认已预配置文件系统。

   ```
   kubectl describe pvc
   ```

   示例输出如下。

   ```
   Name:          fsx-claim
   Namespace:     default
   StorageClass:  fsx-sc
   Status:        Bound
   [...]
   ```
**注意**  
`Status` 可能会在 5-10 分钟内显示为 `Pending`，然后才会更改为 `Bound`。在 `Status` 变成 `Bound` 之前，请勿继续执行下一步。如果 `Status` 显示 `Pending` 10 分钟以上，使用 `Events` 中的警告消息作为解决任何问题的参考。

1. 部署示例应用程序。

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
   ```

1. 验证示例应用程序正在运行。

   ```
   kubectl get pods
   ```

   示例输出如下。

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

1. 验证应用程序是否正确挂载了文件系统。

   ```
   kubectl exec -ti fsx-app -- df -h
   ```

   示例输出如下。

   ```
   Filesystem                   Size  Used Avail Use% Mounted on
   overlay                       80G  4.0G   77G   5% /
   tmpfs                         64M     0   64M   0% /dev
   tmpfs                        3.8G     0  3.8G   0% /sys/fs/cgroup
   192.0.2.0@tcp:/abcdef01      1.1T  7.8M  1.1T   1% /data
   /dev/nvme0n1p1                80G  4.0G   77G   5% /etc/hosts
   shm                           64M     0   64M   0% /dev/shm
   tmpfs                        6.9G   12K  6.9G   1% /run/secrets/kubernetes.io/serviceaccount
   tmpfs                        3.8G     0  3.8G   0% /proc/acpi
   tmpfs                        3.8G     0  3.8G   0% /sys/firmware
   ```

1. 验证示例应用程序已将数据写入 FSx for Lustre 文件系统。

   ```
   kubectl exec -it fsx-app -- ls /data
   ```

   示例输出如下。

   ```
   out.txt
   ```

   此示例输出显示示例应用程序成功编写了 `out.txt` 文件到文件系统。

**注意**  
删除集群之前，请务必删除 FSx for Lustre 文件系统。有关更多信息，请参阅《适用于 Lustre 的 FSx 用户指南》**中的[清理资源](https://docs.amazonaws.cn/fsx/latest/LustreGuide/getting-started-step4.html)。

## 适用于 Lustre 的 FSx 的性能调整
<a name="_performance_tuning_for_fsx_for_lustre"></a>

在 Amazon EKS 中使用适用于 Lustre 的 FSx 时，您可以通过在节点初始化期间应用 Lustre 调整来优化性能。建议使用启动模板用户数据来确保所有节点的配置一致。

这些调优包括：
+ 网络和 RPC 优化
+ Lustre 模块管理
+ LRU（锁定资源单位）调优：
+ 客户端缓存控制设置
+ OST 和 MDC 的 RPC 控件

有关实现这些性能调优的详细说明：
+ 要优化标准节点（非 EFA）的性能，请参阅[优化节点上的适用于 Lustre 的 Amazon FSx 性能（非 EFA）](fsx-csi-tuning-non-efa.md)，了解可添加到启动模板用户数据的完整脚本。
+ 要优化启用 EFA 的节点的性能，请参阅[优化节点上的适用于 Lustre 的 Amazon FSx 性能（EFA）](fsx-csi-tuning-efa.md)。