

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 針對您的叢集使用應用程式資料儲存
<a name="storage"></a>

您可以搭配 Amazon EKS 使用一系列 AWS 儲存服務，以滿足應用程式的儲存需求。透過容器儲存介面 (CSI) 驅動程式的 AWS支援廣度，您可以輕鬆使用 Amazon EBS、Amazon S3、Amazon EFS、Amazon FSX 和 Amazon File Cache，以滿足在 Amazon EKS 上執行之應用程式的儲存需求。若要管理 Amazon EKS 叢集的備份，請參閱 [AWS Amazon EKS 的備份支援](https://docs.aws.amazon.com/aws-backup/latest/devguide/working-with-supported-services.html#working-with-eks)。

本章涵蓋 Amazon EKS 叢集的儲存選項。

**Topics**
+ [透過 Amazon EBS 使用 Kubernetes 磁碟區儲存](ebs-csi.md)
+ [透過 Amazon EFS 使用彈性檔案系統儲存](efs-csi.md)
+ [搭配 Amazon FSx for Lustre 使用高效能應用程式儲存](fsx-csi.md)
+ [搭配 FSx for NetApp ONTAP 使用高效能應用程式儲存](fsx-ontap.md)
+ [搭配 Amazon FSx for OpenZFS 使用資料儲存](fsx-openzfs-csi.md)
+ [使用 Amazon File Cache 將延遲降到最低](file-cache-csi.md)
+ [使用適用於 Amazon S3 的掛載點 CSI 驅動程式存取 Amazon S3 物件](s3-csi.md)
+ [啟用 CSI 磁碟區的快照功能](csi-snapshot-controller.md)

# 透過 Amazon EBS 使用 Kubernetes 磁碟區儲存
<a name="ebs-csi"></a>

**注意**  
 **新功能：**Amazon EKS 自動模式現可自動執行區塊儲存的常規任務。了解如何 [部署具狀態工作負載範例至 EKS 自動模式](sample-storage-workload.md)。

[Amazon Elastic Block Store (Amazon EBS) 容器儲存介面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/)可管理 Amazon EBS 磁碟區的生命週期，作為您所建立 Kubernetes 磁碟區的儲存空間。Amazon EBS CSI 驅動程式為以下類型的 Kubernetes 磁碟區製作 Amazon EBS 磁碟區：一般[暫時性磁碟區](https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/)與[持續性磁碟區](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)。

## 考量事項
<a name="ebs-csi-considerations"></a>
+ 您不需要在 EKS 自動模式叢集上安裝 Amazon EBS CSI 控制器。
+ 您無法將 Amazon EBS 磁碟區掛載到 Fargate Pod。
+ 您可以在 Fargate 節點上執行 Amazon EBS CSI 控制器，但是 Amazon EBS CSI 節點 `DaemonSet` 僅能在 Amazon EC2 執行個體上執行。
+ Amazon EBS 磁碟區及 Amazon EBS CSI 驅動程式與 Amazon EKS 混合節點不相容。
+ 將為最新的附加元件版本和一個先前版本提供支援。最新版本中發現的錯誤或漏洞修正會以新的次要版本形式回溯至先前的版本。
+ EKS 自動模式需要使用儲存類別 `ebs.csi.eks.amazonaws.com` 作為佈建程式。標準 Amazon EBS CSI 驅動程式 (`ebs.csi.aws.com`) 會單獨管理其自己的磁碟區。要將現有磁碟區與 EKS 自動模式一起使用，請使用磁碟區快照將其移轉到使用自動模式佈建程式的儲存類別。

**重要**  
要使用 Amazon EBS CSI 驅動程式的快照功能，您必須先安裝 CSI 快照控制器。如需詳細資訊，請參閱[啟用 CSI 磁碟區的快照功能](csi-snapshot-controller.md)。

## 先決條件
<a name="ebs-csi-prereqs"></a>
+ 現有的叢集。若要查看所需的平台版本，請執行下列命令。

  ```
  aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  ```
+ EBS CSI 驅動程式需要 AWS IAM 許可。
  +  AWS 建議使用 EKS Pod 身分。如需詳細資訊，請參閱[設定 EKS Pod 身分識別的概觀](pod-identities.md#pod-id-setup-overview)。
  + 如需有關服務帳戶 IAM 角色的詳細資訊，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。

## 步驟 1：建立 IAM 角色
<a name="csi-iam-role"></a>

Amazon EBS CSI 外掛程式需要 IAM 許可，才能代表您呼叫 AWS APIs。如果您沒有完成這些步驟，則嘗試安裝附加元件並執行 `kubectl describe pvc` 將會顯示 `failed to provision volume with StorageClass` 以及 `could not create volume in EC2: UnauthorizedOperation` 錯誤。如需詳細資訊，請參閱 GitHub 上的[設定驅動程式許可](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions)。

**注意**  
Pod 可以存取指派給 IAM 角色的許可，除非您封鎖對 IMDS 的存取。如需詳細資訊，請參閱[藉助最佳實務來保護 Amazon EKS 叢集](security-best-practices.md)。

下列程序說明如何建立 IAM 角色，並將 AWS 受管政策連接至該角色。若要實作此程序，您可使用下列其中一個工具：
+  [`eksctl`](#eksctl_store_app_data) 
+  [AWS 管理主控台](#console_store_app_data) 
+  [AWS CLI](#awscli_store_app_data) 

**注意**  
您可建立具有縮小範圍許可的自我管理政策。請檢閱 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html) 並建立具有減少許可的自訂 IAM 政策。

**注意**  
本程序中的特定步驟是針對將驅動程式用作 Amazon EKS 附加元件而編寫。需要執行不同的步驟，才能將驅動程式用作自我管理附加元件。如需詳細資訊，請參閱 GitHub 上的[設定驅動程式許可](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions)。

### `eksctl`
<a name="eksctl_store_app_data"></a>

1. 建立 IAM 角色並連接政策。 AWS 維護 AWS 受管政策，或者您可以建立自己的自訂政策。您可以使用下列命令建立 IAM 角色並連接 AWS 受管政策。使用您叢集的名稱取代 *my-cluster*。命令會部署建立 IAM 角色並將 IAM 政策連接至其中的 AWS CloudFormation 堆疊。

   ```
   eksctl create iamserviceaccount \
           --name ebs-csi-controller-sa \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKS_EBS_CSI_DriverRole \
           --role-only \
           --attach-policy-arn arn:aws: iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
           --approve
   ```

1. 如果您不使用自訂 [KMS 金鑰](https://aws.amazon.com/kms/)，可以跳過此步驟。如果在 Amazon EBS 磁碟區上使用一個進行加密，請視需要自訂 IAM 角色。例如，請執行以下操作：

   1. 複製以下程式碼並貼到新 `kms-key-for-encryption-on-ebs.json` 檔案中。將 *custom-key-arn* 取代為自訂 [KMS 金鑰 ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 建立政策。您可將 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 變更為不同的名稱。但是，如果您這樣做，請務必在稍後的步驟中也進行變更。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 使用以下命令將 IAM 政策連接至角色。使用您的帳戶 ID 取代 *111122223333*。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws: iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

### AWS 管理主控台
<a name="console_store_app_data"></a>

1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 在 **Roles** (角色) 頁面上，選擇 **Create role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 在 **Trusted entity type** (信任的實體類型) 區段中，選擇 **Web identity** (Web 身分)。

   1. 對於 **Identity provider** (身分提供者)，為您的叢集選擇 **OpenID Connect provider URL** (OpenID Connect 供應商 URL)(如 Amazon EKS **Overview** (概觀) 下所示)。

   1. 針對 **Audience** (對象)，選擇 `sts.amazonaws.com`。

   1. 選擇**下一步**。

1. 在 **Add permissions** (新增許可) 頁面上，執行以下作業：

   1. 在 **Filter policies** (篩選政策) 方塊中，輸入 `AmazonEBSCSIDriverPolicy`。

   1. 勾選在搜尋中傳回的 `AmazonEBSCSIDriverPolicy` 左側的核取方塊。

   1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，執行以下作業：

   1. 針對**角色名稱**，為您的角色輸入唯一名稱 (例如 *AmazonEKS\$1EBS\$1CSI\$1DriverRole*)。

   1. 藉由連接標籤做為鍵值對，在**新增標籤 (選用)** 下將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱《IAM 使用者指南》**中的[標記 IAM 資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

   1. 選擇建**立角色**。

1. 建立角色之後，在主控台中選擇角色，以開啟角色進行編輯。

1. 選擇 **Trust Relationships** (信任關係) 標籤，然後選擇 **Edit Trust Relationship** (編輯信任政策)。

1. 查找與下列行相似的行：

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
   ```

   在上一行的末尾新增一個逗號，然後在上一行之後新增下一行。將 *region-code* 取代為您的叢集所在的 AWS 區域。使用叢集的 OIDC 提供商 ID 取代 *EXAMPLED539D4633E53DE1B71EXAMPLE*。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
   ```

1. 選擇 **Update policy** (更新政策) 以完成操作。

1. 如果在 Amazon EBS 磁碟區上使用自訂 [KMS 金鑰](https://aws.amazon.com/kms/)進行加密，請視需要自訂 IAM 角色。例如，請執行以下操作：

   1. 在左側導覽窗格中選擇 **Policies** (政策)。

   1. 在 **Policies** (政策) 頁面上，選擇 **Create a policy** (建立政策)。

   1. 在**建立政策**頁面上，選擇 **JSON** 標籤。

   1. 複製以下程式碼並貼到編輯器中，將 *custom-key-arn* 取代為自訂 [KMS 金鑰 ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 選擇下**一步：標籤**。

   1. 在 **Add tags (Optional)** (新增標籤 (選用)) 頁面上，選擇 **Next: Review** (下一步：檢閱)。

   1. 對於**名稱**，輸入政策的唯一名稱 (例如 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*)。

   1. 選擇**建立政策**。

   1. 在左側導覽窗格中，選擇 **Roles** (角色)。

   1. 在主控台中選擇** *AmazonEKS\$1EBS\$1CSI\$1DriverRole***，將其開啟以進行編輯。

   1. 在**新增許可**下拉式清單中，選擇**連接政策**。

   1. 在**篩選政策**方塊中，輸入 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*。

   1. 選取在搜尋中傳回的 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 左側的核取方塊。

   1. 選擇**連接政策**。

### AWS CLI
<a name="awscli_store_app_data"></a>

1. 檢視叢集的 OIDC 提供商 URL。使用您的叢集名稱取代 *my-cluster*。如果來自命令的輸出是 `None`，則請檢閱**先決條件**。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
   ```

   範例輸出如下。

   ```
   https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
   ```

1. 建立 IAM 角色，授予其 `AssumeRoleWithWebIdentity` 動作。

   1. 將以下內容複製到名為 `aws-ebs-csi-driver-trust-policy.json` 的檔案。使用您的帳戶 ID 取代 *111122223333*。使用前一個步驟傳回的值取代 *EXAMPLED539D4633E53DE1B71EXAMPLE* 和 *region-code*。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                  "StringEquals": {
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
                  }
                }
              }
            ]
          }
      ```

   1. 建立角色。您可將 *AmazonEKS\$1EBS\$1CSI\$1DriverRole* 變更為不同的名稱。若要變更名稱，請務必在稍後的步驟中進行變更。

      ```
      aws iam create-role \
            --role-name AmazonEKS_EBS_CSI_DriverRole \
            --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
      ```

1. 連接政策。 會 AWS 維護 AWS 受管政策，或者您可以建立自己的自訂政策。使用下列命令將 AWS 受管政策連接至角色。

   ```
   aws iam attach-role-policy \
         --policy-arn arn:aws: iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
         --role-name AmazonEKS_EBS_CSI_DriverRole
   ```

1. 如果在 Amazon EBS 磁碟區上使用自訂 [KMS 金鑰](https://aws.amazon.com/kms/)進行加密，請視需要自訂 IAM 角色。例如，請執行以下操作：

   1. 複製以下程式碼並貼到新 `kms-key-for-encryption-on-ebs.json` 檔案中。將 *custom-key-arn* 取代為自訂 [KMS 金鑰 ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key)。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. 建立政策。您可將 *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* 變更為不同的名稱。但是，如果您這樣做，請務必在稍後的步驟中也進行變更。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 使用以下命令將 IAM 政策連接至角色。使用您的帳戶 ID 取代 *111122223333*。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws: iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

現在，您已建立 Amazon EBS CSI 驅動程式 IAM 角色，即可繼續進行下一節。當您使用此 IAM 角色部署附加元件時，即會建立並設定為使用名為 `ebs-csi-controller-sa` 的服務帳戶。該服務帳戶會繫結至獲指派所需 Kubernetes 許可的 Kubernetes `clusterrole`。

## 步驟 2：取得 Amazon EBS CSI 驅動程式
<a name="managing-ebs-csi"></a>

建議您透過 Amazon EKS 附加元件安裝 Amazon EBS CSI 驅動程式，以提升安全性並減少工作量。若要將 Amazon EKS 附加元件新增至叢集，請參閱 [建立 Amazon EKS 附加元件](creating-an-add-on.md)。如需附加元件的詳細資訊，請參閱 [Amazon EKS 附加元件](eks-add-ons.md)。

**重要**  
將 Amazon EBS 驅動程式新增為 Amazon EKS 附加元件之前，請確認您的叢集上並未安裝自我管理的驅動程式版本。如果是這樣，請參閱 GitHub 上的[解除安裝自我管理的 Amazon EBS CSI 驅動程式](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#uninstalling-the-ebs-csi-driver)。

**注意**  
根據預設，EBS CSI 使用的 RBAC 角色具有變更節點以支援其污點移除功能的許可。由於 Kubernetes RBAC 的限制，這也允許它變更叢集中的任何其他節點。Helm Chart 具有參數 (`node.serviceAccount.disableMutation`)，可停用 ebs-csi-node 服務帳戶的變動節點 RBAC 許可。啟用時，清除污點等驅動程式功能將無法運作。

或者，如果您想要 Amazon EBS CSI 驅動程式的自我管理安裝，請參閱 GitHub 上的[安裝](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md)。

## 步驟 3：部署範例應用程式
<a name="ebs-sample-app"></a>

您可以部署各種範例應用程式，再視需要進行修改。如需詳細資訊，請參閱 GitHub 上的 [Kubernetes 範例](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes)。

# 透過 Amazon EFS 使用彈性檔案系統儲存
<a name="efs-csi"></a>

 [Amazon Elastic File System](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) (Amazon EFS) 提供無伺服器、完全彈性的檔案儲存功能，讓您無需佈建或管理儲存容量和效能，即可分享檔案資料。[Amazon EFS 容器儲存界面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-efs-csi-driver)提供 CSI 界面，允許在 上執行的 Kubernetes 叢集 AWS 管理 Amazon EFS 檔案系統的生命週期。本主題旨在說明如何將 Amazon EFS CSI 驅動程式部署到您的 Amazon EKS 叢集。

## 考量事項
<a name="efs-csi-considerations"></a>
+ Amazon EFS CSI 驅動程式與以 Windows 為基礎的容器映像不相容。
+ 您不能將[動態持續性磁碟區佈建](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/dynamic_provisioning/README.md)與 Fargate 節點搭配使用，但可以使用[靜態佈建](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/static_provisioning/README.md)。
+  [動態佈建](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/dynamic_provisioning/README.md)需要 [1.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v12) 或更新版本的驅動程序。您可以在任何支援的 Amazon EKS 叢集版本上，使用版本 `1.1` 驅動程式[靜態佈建](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/static_provisioning/README.md)持續性磁碟區 (請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html))。
+ 此驅動程式的 [1.3.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v132) 或更新版本支援 Arm64 架構，包括基於 Amazon EC2 Graviton 的執行個體。
+ 此驅動程式的 [1.4.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v142) 版或更新版本皆支援使用 FIPS 掛載檔案系統。
+ 記下 Amazon EFS 的資源配額。例如，每個 Amazon EFS 檔案系統都有建立 1000 個存取點的配額。如需詳細資訊，請參閱[無法變更的 Amazon EFS 資源配額](https://docs.aws.amazon.com/efs/latest/ug/limits.html#limits-efs-resources-per-account-per-region)。
+ 從 [2.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-2.x.md#v200) 版開始，此驅動程式會從使用 `stunnel` 切換至 `efs-proxy` 以進行 TLS 連線。當使用 `efs-proxy` 時，它將開啟的執行緒數量等於其執行節點的核心數加一。
+ Amazon EFS CSI 驅動程式與 Amazon EKS 混合節點不相容。

## 先決條件
<a name="efs-csi-prereqs"></a>
+ Amazon EFS CSI 驅動程式需要 AWS Identity and Access Management (IAM) 許可。
  +  AWS 建議使用 EKS Pod 身分。如需詳細資訊，請參閱[設定 EKS Pod 身分識別的概觀](pod-identities.md#pod-id-setup-overview)。
  + 如需有關服務帳戶的 IAM 角色，以及為叢集設定 IAM OpenID Connect (OIDC) 供應商的資訊，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。

**注意**  
在 Fargate 上執行的 Pod 會自動掛載 Amazon EFS 檔案系統，而無需執行手動驅動程式安裝步驟。

## 步驟 1：建立 IAM 角色
<a name="efs-create-iam-resources"></a>

Amazon EFS CSI 驅動程式需要 IAM 許可才能與檔案系統互動。建立 IAM 角色，並將所需的 AWS 受管政策連接到該角色。若要實作此程序，您可使用下列其中一個工具：
+  [`eksctl`](#eksctl_efs_store_app_data) 
+  [AWS 管理主控台](#console_efs_store_app_data) 
+  [AWS CLI](#awscli_efs_store_app_data) 

**注意**  
本程序中的特定步驟是針對將驅動程式用作 Amazon EKS 附加元件而編寫。如需有關自我管理安裝的詳細資訊，請參閱 GitHub 上的[設定驅動程式許可](https://github.com/kubernetes-sigs/aws-efs-csi-driver#set-up-driver-permission)一節。

### `eksctl`
<a name="eksctl_efs_store_app_data"></a>

#### 如果使用 Pod 身分識別
<a name="efs-eksctl-pod-identities"></a>

執行以下命令以使用 `eksctl` 建立 IAM 角色和 Pod 身分識別關聯。使用您的叢集名稱取代 `my-cluster`。也可使用不同名稱取代 `AmazonEKS_EFS_CSI_DriverRole`。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --permission-policy-arns arn:aws: iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy
```

#### 如果為服務帳戶使用 IAM 角色
<a name="efs-eksctl-irsa"></a>

執行以下命令以使用 `eksctl` 建立 IAM 角色。使用您的叢集名稱取代 `my-cluster`。也可使用不同名稱取代 `AmazonEKS_EFS_CSI_DriverRole`。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws: iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --output json --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"
```

### AWS 管理主控台
<a name="console_efs_store_app_data"></a>

執行下列操作以使用 建立 IAM 角色 AWS 管理主控台。

1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 在 **Roles** (角色) 頁面上，選擇 **Create role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 如果使用 EKS Pod 身分識別：

      1. 在**信任的實體類型**區段中，選擇** AWS 服務**。

      1. 在**服務或使用案例**下拉式清單中，選擇 **EKS**。

      1. 在**使用案例**區段中，選擇 **EKS - Pod 身分識別**。

      1. 選擇**下一步**。

   1. 如果為服務帳戶使用 IAM 角色：

      1. 在 **Trusted entity type** (信任的實體類型) 區段中，選擇 **Web identity** (Web 身分)。

      1. 對於 **Identity provider** (身分提供者)，為您的叢集選擇 **OpenID Connect provider URL** (OpenID Connect 供應商 URL)(如 Amazon EKS **Overview** (概觀) 下所示)。

      1. 針對 **Audience** (對象)，選擇 `sts.amazonaws.com`。

      1. 選擇**下一步**。

1. 在 **Add permissions** (新增許可) 頁面上，執行以下作業：

   1. 在 **Filter policies** (篩選政策) 方塊中，輸入 `AmazonEFSCSIDriverPolicy`。

   1. 勾選在搜尋中傳回的 `AmazonEFSCSIDriverPolicy` 左側的核取方塊。

   1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，執行以下作業：

   1. 針對 **Role name** (角色名稱)，為您的角色輸入唯一名稱 (例如 `AmazonEKS_EFS_CSI_DriverRole`)。

   1. 藉由連接標籤做為鍵值對，在**新增標籤 (選用)** 下將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱《IAM 使用者指南》**中的[標記 IAM 資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

   1. 選擇建**立角色**。

1. 建立角色之後：

   1. 如果使用 EKS Pod 身分識別：

      1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

      1. 在左側導覽窗格中，選取**叢集**，然後選取您要為其設定 EKS Pod 身分識別關聯之叢集的名稱。

      1. 選擇**存取**索引標籤。

      1. 在 **Pod 身分識別關聯**中，選擇**建立**。

      1. 選擇 **IAM 角色**下拉式清單，然後選取新建立的角色。

      1. 選擇 **Kubernetes 命名空間**欄位，並輸入 `kube-system`。

      1. 選擇 **Kubernetes 服務帳戶**欄位，並輸入 `efs-csi-controller-sa`。

      1. 選擇**建立**。

      1. 如需建立 Pod 身分識別關聯的詳細資訊，請參閱 [建立 Pod Identity 關聯AWS （主控台）](pod-id-association.md#pod-id-association-create)。

   1. 如果為服務帳戶使用 IAM 角色：

      1. 選擇角色以開啟進行編輯。

      1. 選擇 **Trust Relationships** (信任關係) 標籤，然後選擇 **Edit Trust Relationship** (編輯信任政策)。

      1. 查找與下列行相似的行：

         ```
         "oidc.eks.region-code.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com"
         ```

         在前一行上方加入下列行。`<region-code>` 將 取代為叢集所在的 AWS 區域。將 `<EXAMPLED539D4633E53DE1B71EXAMPLE>` 取代為叢集的 OIDC 提供商 ID。

         ```
         "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-*",
         ```

      1. 將 `Condition` 運算子從 `"StringEquals"` 修改為 `"StringLike"`。

      1. 選擇 **Update policy** (更新政策) 以完成操作。

### AWS CLI
<a name="awscli_efs_store_app_data"></a>

執行下列命令以使用 CLI 建立 IAM AWS 角色。

#### 如果使用 Pod 身分識別
<a name="efs-cli-pod-identities"></a>

1. 建立將 `AssumeRole` 和 `TagSession` 動作授予 `pods.eks.amazonaws.com` 服務的 IAM 角色。

   1. 將下列內容複製到名為 `aws-efs-csi-driver-trust-policy-pod-identity.json` 的檔案。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "pods.eks.amazonaws.com"
                  },
                  "Action": [
                      "sts:AssumeRole",
                      "sts:TagSession"
                  ]
              }
          ]
      }
      ```

   1. 建立角色。使用您的叢集名稱取代 `my-cluster`。也可使用不同名稱取代 `AmazonEKS_EFS_CSI_DriverRole`。

      ```
      export cluster_name=my-cluster
      export role_name=AmazonEKS_EFS_CSI_DriverRole
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
      ```

1. 使用下列命令將所需的 AWS 受管政策連接至角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws: iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

1. 執行下列命令以建立 Pod 身分識別關聯。將 ` arn:aws: iam::<111122223333>:role/my-role` 取代為先前步驟中建立的角色。

   ```
   aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/my-role --namespace kube-system --service-account efs-csi-controller-sa
   ```

1. 如需建立 Pod 身分識別關聯的詳細資訊，請參閱 [建立 Pod Identity 關聯AWS （主控台）](pod-id-association.md#pod-id-association-create)。

#### 如果為服務帳戶使用 IAM 角色
<a name="efs-cli-irsa"></a>

1. 檢視叢集的 OIDC 提供商 URL。使用您的叢集名稱取代 `my-cluster`。也可使用不同名稱取代 `AmazonEKS_EFS_CSI_DriverRole`。

   ```
   export cluster_name=my-cluster
   export role_name=AmazonEKS_EFS_CSI_DriverRole
   aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text
   ```

   範例輸出如下。

   ```
   https://oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>
   ```

   如果來自命令的輸出是 `None`，則請檢閱**先決條件**。

1. 建立授予 `AssumeRoleWithWebIdentity` 動作許可的 IAM 角色。

   1. 將下列內容複製到名為 `aws-efs-csi-driver-trust-policy.json` 的檔案。使用您的帳戶 ID 取代 `<111122223333>`。使用前一個步驟傳回的值取代 `<EXAMPLED539D4633E53DE1B71EXAMPLE>` 和 `<region-code>`。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. 建立角色。

      ```
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
      ```

1. 使用下列命令將所需的 AWS 受管政策連接至角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws: iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

## 步驟 2：取得 Amazon EFS CSI 驅動程式
<a name="efs-install-driver"></a>

我們建議您透過 Amazon EKS 附加元件安裝 Amazon EFS CSI 驅動程式。若要將 Amazon EKS 附加元件新增至叢集，請參閱 [建立 Amazon EKS 附加元件](creating-an-add-on.md)。如需附加元件的詳細資訊，請參閱 [Amazon EKS 附加元件](eks-add-ons.md)。如果您無法使用 Amazon EKS 附加元件，我們建議您提交有關為何無法存取[容器藍圖 GitHub 儲存庫](https://github.com/aws/containers-roadmap/issues)的問題。

**重要**  
將 Amazon EFS 驅動程式新增為 Amazon EKS 附加元件之前，請確認您的叢集上並未安裝自我管理的驅動程式版本。若是如此，請參閱 GitHub 上[解除安裝 Amazon EFS CSI 驅動程式](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#uninstalling-the-amazon-efs-csi-driver)。

或者，如果您想要 Amazon EFS CSI 驅動程式的自我管理安裝，請參閱 GitHub 上的[安裝](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#installation)。

## 步驟 3：建立 Amazon EFS 檔案系統
<a name="efs-create-filesystem"></a>

如需建立 Amazon EFS 檔案系統，請參閱 GitHub 上的[為 Amazon EKS 建立 Amazon EFS 檔案系統](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/efs-create-filesystem.md)。

## 步驟 4：部署範例應用程式
<a name="efs-sample-app"></a>

您可以部署各種範例應用程式，再視需要進行修改。如需詳細資訊，請參閱 GitHub 上的[範例](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#examples)。

# 搭配 Amazon FSx for Lustre 使用高效能應用程式儲存
<a name="fsx-csi"></a>

[Amazon FSx for Lustre 容器儲存介面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)提供 CSI 介面，允許 Amazon EKS 叢集管理 Amazon FSx for Lustre 檔案系統的生命週期。如需詳細資訊，請參閱《[Amazon FSx for Lustre 使用者指南](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)》。

如需有關如何將 Amazon FSx for Lustre CSI 驅動程式部署到您的 Amazon EKS 叢集並確認其是否正常運作的詳細資訊，請參閱 [部署 FSx for Lustre 驅動程式](fsx-csi-create.md)。

# 部署 FSx for Lustre 驅動程式
<a name="fsx-csi-create"></a>

本主題說明如何將 [FSx for Lustre CSI 驅動程式](fsx-csi.md)部署到您的 Amazon EKS 叢集，並確認是否正常運作。我們建議您使用最新版的驅動程式。如需可用版本，請參閱 GitHub 上的 [CSI 規格相容性對照表](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/blob/master/docs/README.md#csi-specification-compatibility-matrix)。

**注意**  
Fargate 或 Amazon EKS 混合節點不支援此驅動程式。

如需可用參數的詳細說明，以及示範驅動程式功能的完整範例，請參閱 GitHub 上的 [FSx for Lustre 容器儲存介面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)專案。

## 先決條件
<a name="fsx-csi-prereqs"></a>
+ 現有的叢集。
+ Amazon FSx CSI 驅動程式 EKS 附加元件需要 EKS Pod 身分識別代理程式進行身分驗證。如果沒有此元件，附加元件會失敗並出現錯誤 `Amazon EKS Pod Identity agent is not installed in the cluster`，從而防止磁碟區操作。在部署 FSx CSI 驅動程式附加元件之前或之後，安裝 Pod 身分識別代理程式。如需詳細資訊，請參閱[設定 Amazon EKS Pod 身分識別代理程式](pod-id-agent-setup.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定的 AWS 命令列界面 (AWS CLI) 版本 `1.27.160` `2.12.3`或更新版本。若要檢查您目前的版本，請使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。適用於 macOS 的 `yum`、 `apt-get`或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 * AWS 命令列界面使用者指南*》中的使用 aws 設定[安裝](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和快速組態。 [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)在 AWS CloudShell 中安裝的 AWS CLI 版本也可能是最新版本後面的幾個版本。若要更新它，請參閱《CloudShell [AWS 使用者指南》中的將 CLI 安裝到您的主目錄](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。 * AWS CloudShell *
+ 裝置或 AWS CloudShell 上安裝的`eksctl`命令列工具版本 `0.215.0`或更新版本。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 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 許可，才能代表您呼叫 AWS APIs。

**注意**  
Pod 可以存取指派給 IAM 角色的許可，除非您封鎖對 IMDS 的存取。如需詳細資訊，請參閱[藉助最佳實務來保護 Amazon EKS 叢集](security-best-practices.md)。

下列程序說明如何建立 IAM 角色，並將 AWS 受管政策連接至該角色。

1. 建立 IAM 角色，並使用下列命令連接 AWS 受管政策。使用您要使用的叢集名稱取代 `my-cluster`。命令會部署建立 IAM 角色並將 IAM 政策連接至其中的 AWS CloudFormation 堆疊。

   ```
   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: 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"
   ```

   請注意已部署的 AWS 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 驅動程式安裝可能會導致附加元件安裝失敗。當您嘗試安裝 Amazon EKS 附加元件版本而又存在非 EKS FSx CSI 驅動程式時，安裝會因資源衝突而失敗。在安裝期間使用 `OVERWRITE` 旗標以解決此問題。  

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

或者，如果您想要 Amazon FSx CSI 驅動程式的自我管理安裝，請參閱 GitHub 上的[安裝](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 容器儲存介面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-fsx-csi-driver) GitHub 儲存庫，來耗用動態佈建的 FSx for Lustre 磁碟區。

1. 記下叢集的安全群組。您可以在**聯網**區段 AWS 管理主控台 下的 中或使用下列 CLI AWS 命令來查看。使用您要使用的叢集名稱取代 `my-cluster`。

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

1. 根據《Amazon FSx for Lustre 使用者指南》中的[ Amazon VPC 安全群組](https://docs.aws.amazon.com/fsx/latest/LustreGuide/limit-access-security-groups.html#fsx-vpc-security-groups)中顯示的標準，為您的 Amazon FSx 檔案系統建立安全群組。對於 **VPC**，選擇叢集的 VPC，如**聯網**區段所示。對於「與 Lustre 用戶端關聯的安全群組」，請使用您的叢集安全群組。您可以單獨保留傳出規則，以允許 **All traffic** (所有流量)。

1. 執行以下命令，下載儲存類別清單檔案。

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

1. 編輯 `storageclass.yaml` 檔案的參數區段。使用您自己的值取代每一個範例值。

   ```
   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：
     + 您可以在**運算**區段下選取節點群組， AWS 管理主控台 以檢查 中的節點子網路。
     + 若您指定的子網路與您擁有節點的子網路不同，則您的 VPC 必須[已連線](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/amazon-vpc-to-amazon-vpc-connectivity-options.html)，且您必須確認安全群組中必要的連接埠已開啟。
   +  ** `securityGroupIds` **：您為檔案系統所建立的安全群組 ID。
   +  **`deploymentType` (選用)**：檔案系統部署類型。有效值為 `SCRATCH_1`、`SCRATCH_2`、`PERSISTENT_1`、`PERSISTENT_2`。如需部署類型的詳細資訊，請參閱[建立您的 Amazon FSx for Lustre 檔案系統](https://docs.aws.amazon.com/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.4 TiB 則以 2.4 TiB 為單位遞增。
   +  `SCRATCH_1`：`1.2 TiB`、`2.4 TiB` 或 `3.6 TiB`，超過 3.6 TiB 則以 3.6 TiB 為單位遞增。

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` 可能會顯示為 `Pending` 約 5-10 分鐘，然後變更為 `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 檔案系統。如需詳細資訊，請參閱 *《FSx for Lustre 使用者指南》*中的[清除資源](https://docs.aws.amazon.com/fsx/latest/LustreGuide/getting-started-step4.html)。

## FSx for Lustre 的效能調校
<a name="_performance_tuning_for_fsx_for_lustre"></a>

搭配 Amazon EKS 使用 FSx for Lustre 時，您可以在節點初始化期間套用 Lustre 調校，進而最佳化效能。建議的方法是使用啟動範本使用者資料，以確保所有節點的組態一致。

這些調校包括：
+ 網路和 RPC 最佳化
+ Lustre 模組管理
+ LRU (鎖定資源單位) 調校
+ 用戶端快取控制設定
+ OST 和 MDC 的 RPC 控制

如需實作這些效能調校的詳細說明：
+ 如需最佳化標準節點 (非 EFA) 的效能，請參閱 [最佳化節點 (非 EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-non-efa.md)，以取得可新增至啟動範本使用者資料的完整指令碼。
+ 如需最佳化已啟用 EFA 節點的效能，請參閱 [最佳化節點 (EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-efa.md)。

# 最佳化節點 (EFA) 上的 Amazon FSx for Lustre 效能
<a name="fsx-csi-tuning-efa"></a>

本主題會說明如何使用 Amazon EKS 和 Amazon FSx for Lustre 設定 Elastic Fabric Adapter (EFA) 調校。

**注意**  
如需建立和部署 FSx for Lustre CSI 驅動程式的資訊，請參閱 [部署 FSx for Lustre 驅動程式](fsx-csi-create.md)。
如需不使用 EFA 最佳化標準節點的資訊，請參閱 [最佳化節點 (非 EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-non-efa.md)。

## 步驟 1. 建立 EKS 叢集
<a name="create-eks-cluster"></a>

使用提供的組態檔案建立叢集：

```
# Create cluster using efa-cluster.yaml
eksctl create cluster -f efa-cluster.yaml
```

範例 `efa-cluster.yaml`：

```
#efa-cluster.yaml

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: csi-fsx
  region: us-east-1
  version: "1.30"

iam:
  withOIDC: true

availabilityZones: ["us-east-1a", "us-east-1d"]

managedNodeGroups:
  - name: my-efa-ng
    instanceType: c6gn.16xlarge
    minSize: 1
    desiredCapacity: 1
    maxSize: 1
    availabilityZones: ["us-east-1b"]
    volumeSize: 300
    privateNetworking: true
    amiFamily: Ubuntu2204
    efaEnabled: true
    preBootstrapCommands:
      - |
        #!/bin/bash
        eth_intf="$(/sbin/ip -br -4 a sh | grep $(hostname -i)/ | awk '{print $1}')"
        efa_version=$(modinfo efa | awk '/^version:/ {print $2}' | sed 's/[^0-9.]//g')
        min_efa_version="2.12.1"

        if [[ "$(printf '%s\n' "$min_efa_version" "$efa_version" | sort -V | head -n1)" != "$min_efa_version" ]]; then
            sudo curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz
            tar -xf aws-efa-installer-1.37.0.tar.gz && cd aws-efa-installer
            echo "Installing EFA driver"
            sudo apt-get update && apt-get upgrade -y
            sudo apt install -y pciutils environment-modules libnl-3-dev libnl-route-3-200 libnl-route-3-dev dkms
            sudo ./efa_installer.sh -y
            modinfo efa
        else
            echo "Using EFA driver version $efa_version"
        fi

        echo "Installing Lustre client"
        sudo wget -O - https://fsx-lustre-client-repo-public-keys.s3.amazonaws.com/fsx-ubuntu-public-key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/fsx-ubuntu-public-key.gpg > /dev/null
        sudo echo "deb [signed-by=/usr/share/keyrings/fsx-ubuntu-public-key.gpg] https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu jammy main" > /etc/apt/sources.list.d/fsxlustreclientrepo.list
        sudo apt update | tail
        sudo apt install -y lustre-client-modules-$(uname -r) amazon-ec2-utils | tail
        modinfo lustre

        echo "Loading Lustre/EFA modules..."
        sudo /sbin/modprobe lnet
        sudo /sbin/modprobe kefalnd ipif_name="$eth_intf"
        sudo /sbin/modprobe ksocklnd
        sudo lnetctl lnet configure

        echo "Configuring TCP interface..."
        sudo lnetctl net del --net tcp 2> /dev/null
        sudo lnetctl net add --net tcp --if $eth_intf

        # For P5 instance type which supports 32 network cards,
        # by default add 8 EFA interfaces selecting every 4th device (1 per PCI bus)
        echo "Configuring EFA interface(s)..."
        instance_type="$(ec2-metadata --instance-type | awk '{ print $2 }')"
        num_efa_devices="$(ls -1 /sys/class/infiniband | wc -l)"
        echo "Found $num_efa_devices available EFA device(s)"

        if [[ "$instance_type" == "p5.48xlarge" || "$instance_type" == "p5e.48xlarge" ]]; then
           for intf in $(ls -1 /sys/class/infiniband | awk 'NR % 4 == 1'); do
               sudo lnetctl net add --net efa --if $intf --peer-credits 32
          done
        else
        # Other instances: Configure 2 EFA interfaces by default if the instance supports multiple network cards,
        # or 1 interface for single network card instances
        # Can be modified to add more interfaces if instance type supports it
            sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | head -n1) --peer-credits 32
            if [[ $num_efa_devices -gt 1 ]]; then
               sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | tail -n1) --peer-credits 32
            fi
        fi

        echo "Setting discovery and UDSP rule"
        sudo lnetctl set discovery 1
        sudo lnetctl udsp add --src efa --priority 0
        sudo /sbin/modprobe lustre

        sudo lnetctl net show
        echo "Added $(sudo lnetctl net show | grep -c '@efa') EFA interface(s)"
```

## 步驟 2. 建立節點群組
<a name="create-node-group"></a>

建立已啟用 EFA 的節點群組：

```
# Create node group using efa-ng.yaml
eksctl create nodegroup -f efa-ng.yaml
```

**重要**  
=== 在區段 `# 5. Mount FSx filesystem` 中調整您環境的這些值。

```
FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
```

===

範例 `efa-ng.yaml`：

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: final-efa
  region: us-east-1

managedNodeGroups:
  - name: ng-1
    instanceType: c6gn.16xlarge
    minSize: 1
    desiredCapacity: 1
    maxSize: 1
    availabilityZones: ["us-east-1a"]
    volumeSize: 300
    privateNetworking: true
    amiFamily: Ubuntu2204
    efaEnabled: true
    preBootstrapCommands:
      - |
        #!/bin/bash
        exec 1> >(logger -s -t $(basename $0)) 2>&1

        #########################################################################################
        #                                    Configuration Section                              #
        #########################################################################################

        # File System Configuration
        FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
        MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
        MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.

        # Lustre Tuning Parameters
        LUSTRE_LRU_MAX_AGE=600000
        LUSTRE_MAX_CACHED_MB=64
        LUSTRE_OST_MAX_RPC=32
        LUSTRE_MDC_MAX_RPC=64
        LUSTRE_MDC_MOD_RPC=50

        # File paths
        FUNCTIONS_SCRIPT="/usr/local/bin/lustre_functions.sh"
        TUNINGS_SCRIPT="/usr/local/bin/apply_lustre_tunings.sh"
        SERVICE_FILE="/etc/systemd/system/lustre-tunings.service"

        #EFA
        MIN_EFA_VERSION="2.12.1"

        # Function to check if a command was successful
        check_success() {
            if [ $? -eq 0 ]; then
                echo "SUCCESS: $1"
            else
                echo "FAILED: $1"
                return 1
            fi
        }

        echo "********Starting FSx for Lustre configuration********"

        # 1. Install Lustre client
        if grep -q '^ID=ubuntu' /etc/os-release; then
            echo "Detected Ubuntu, proceeding with Lustre setup..."
            # Add Lustre repository
            sudo wget -O - https://fsx-lustre-client-repo-public-keys.s3.amazonaws.com/fsx-ubuntu-public-key.asc | sudo gpg --dearmor | sudo tee /usr/share/keyrings/fsx-ubuntu-public-key.gpg > /dev/null

            echo "deb [signed-by=/usr/share/keyrings/fsx-ubuntu-public-key.gpg] https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/fsxlustreclientrepo.list

            sudo apt-get update
            sudo apt-get install -y lustre-client-modules-$(uname -r)
            sudo apt-get install -y lustre-client
        else
            echo "Not Ubuntu, exiting"
            exit 1
        fi

        check_success "Install Lustre client"

        # Ensure Lustre tools are in the PATH
        export PATH=$PATH:/usr/sbin

        # 2. Apply network and RPC tunings
        echo "********Applying network and RPC tunings********"
        if ! grep -q "options ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf; then
            echo "options ptlrpc ptlrpcd_per_cpt_max=64" | sudo tee -a /etc/modprobe.d/modprobe.conf
            check_success "Set ptlrpcd_per_cpt_max"
        else
            echo "ptlrpcd_per_cpt_max already set in modprobe.conf"
        fi

        if ! grep -q "options ksocklnd credits" /etc/modprobe.d/modprobe.conf; then
            echo "options ksocklnd credits=2560" | sudo tee -a /etc/modprobe.d/modprobe.conf
            check_success "Set ksocklnd credits"
        else
            echo "ksocklnd credits already set in modprobe.conf"
        fi

        # 3. Load Lustre modules
        manage_lustre_modules() {
            echo "Checking for existing Lustre modules..."
            if lsmod | grep -q lustre; then
                echo "Existing Lustre modules found."

                # Check for mounted Lustre filesystems
                echo "Checking for mounted Lustre filesystems..."
                if mount | grep -q "type lustre"; then
                    echo "Found mounted Lustre filesystems. Attempting to unmount..."
                    mounted_fs=$(mount | grep "type lustre" | awk '{print $3}')
                    for fs in $mounted_fs; do
                        echo "Unmounting $fs"
                        sudo umount $fs
                        check_success "Unmount filesystem $fs"
                    done
                else
                    echo "No Lustre filesystems mounted."
                fi

                # After unmounting, try to remove modules
                echo "Attempting to remove Lustre modules..."
                sudo lustre_rmmod
                if [ $? -eq 0 ]; then
                    echo "SUCCESS: Removed existing Lustre modules"
                else
                    echo "WARNING: Could not remove Lustre modules. They may still be in use."
                    echo "Please check for any remaining Lustre processes or mounts."
                    return 1
                fi
            else
                echo "No existing Lustre modules found."
            fi

            echo "Loading Lustre modules..."
            sudo modprobe lustre
            check_success "Load Lustre modules" || exit 1

            echo "Checking loaded Lustre modules:"
            lsmod | grep lustre
        }

        # Managing Lustre kernel modules
        echo "********Managing Lustre kernel modules********"
        manage_lustre_modules

        # 4. Initializing Lustre networking
        echo "********Initializing Lustre networking********"
        sudo lctl network up
        check_success "Initialize Lustre networking" || exit 1

        # 4.5 EFA Setup and Configuration
        setup_efa() {
            echo "********Starting EFA Setup********"

            # Get interface and version information
            eth_intf="$(/sbin/ip -br -4 a sh | grep $(hostname -i)/ | awk '{print $1}')"
            efa_version=$(modinfo efa | awk '/^version:/ {print $2}' | sed 's/[^0-9.]//g')
            min_efa_version=$MIN_EFA_VERSION

            # Install or verify EFA driver
            if [[ "$(printf '%s\n' "$min_efa_version" "$efa_version" | sort -V | head -n1)" != "$min_efa_version" ]]; then
                echo "Installing EFA driver..."
                sudo curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz
                tar -xf aws-efa-installer-1.37.0.tar.gz && cd aws-efa-installer

                # Install dependencies
                sudo apt-get update && apt-get upgrade -y
                sudo apt install -y pciutils environment-modules libnl-3-dev libnl-route-3-200 libnl-route-3-dev dkms

                # Install EFA
                sudo ./efa_installer.sh -y
                modinfo efa
            else
                echo "Using existing EFA driver version $efa_version"
            fi
        }

        configure_efa_network() {
            echo "********Configuring EFA Network********"

            # Load required modules
            echo "Loading network modules..."
            sudo /sbin/modprobe lnet
            sudo /sbin/modprobe kefalnd ipif_name="$eth_intf"
            sudo /sbin/modprobe ksocklnd

            # Initialize LNet
            echo "Initializing LNet..."
            sudo lnetctl lnet configure

            # Configure TCP interface
            echo "Configuring TCP interface..."
            sudo lnetctl net del --net tcp 2> /dev/null
            sudo lnetctl net add --net tcp --if $eth_intf

            # For P5 instance type which supports 32 network cards,
            # by default add 8 EFA interfaces selecting every 4th device (1 per PCI bus)
            echo "Configuring EFA interface(s)..."
            instance_type="$(ec2-metadata --instance-type | awk '{ print $2 }')"
            num_efa_devices="$(ls -1 /sys/class/infiniband | wc -l)"
            echo "Found $num_efa_devices available EFA device(s)"

            if [[ "$instance_type" == "p5.48xlarge" || "$instance_type" == "p5e.48xlarge" ]]; then
                # P5 instance configuration
                for intf in $(ls -1 /sys/class/infiniband | awk 'NR % 4 == 1'); do
                    sudo lnetctl net add --net efa --if $intf --peer-credits 32
                done
            else
                # Standard configuration
                # Other instances: Configure 2 EFA interfaces by default if the instance supports multiple network cards,
                # or 1 interface for single network card instances
                # Can be modified to add more interfaces if instance type supports it
                sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | head -n1) --peer-credits 32
                if [[ $num_efa_devices -gt 1 ]]; then
                    sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | tail -n1) --peer-credits 32
                fi
            fi

            # Configure discovery and UDSP
            echo "Setting up discovery and UDSP rules..."
            sudo lnetctl set discovery 1
            sudo lnetctl udsp add --src efa --priority 0
            sudo /sbin/modprobe lustre

            # Verify configuration
            echo "Verifying EFA network configuration..."
            sudo lnetctl net show
            echo "Added $(sudo lnetctl net show | grep -c '@efa') EFA interface(s)"
        }

        # Main execution
        setup_efa
        configure_efa_network

        # 5. Mount FSx filesystem
        if [ ! -z "$FSX_DNS" ] && [ ! -z "$MOUNT_NAME" ]; then
            echo "********Creating mount point********"
            sudo mkdir -p $MOUNT_POINT
            check_success "Create mount point"

            echo "Mounting FSx filesystem..."
            sudo mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
            check_success "Mount FSx filesystem"
        else
            echo "Skipping FSx mount as DNS or mount name is not provided"
        fi

        # 6. Applying Lustre performance tunings
        echo "********Applying Lustre performance tunings********"

        # Get number of CPUs
        NUM_CPUS=$(nproc)

        # Calculate LRU size (100 * number of CPUs)
        LRU_SIZE=$((100 * NUM_CPUS))

        #Apply LRU tunings
        echo "Apply LRU tunings"
        sudo lctl set_param ldlm.namespaces.*.lru_max_age=${LUSTRE_LRU_MAX_AGE}
        check_success "Set lru_max_age"
        sudo lctl set_param ldlm.namespaces.*.lru_size=$LRU_SIZE
        check_success "Set lru_size"

        # Client Cache Control
        sudo lctl set_param llite.*.max_cached_mb=${LUSTRE_MAX_CACHED_MB}
        check_success "Set max_cached_mb"

        # RPC Controls
        sudo lctl set_param osc.*OST*.max_rpcs_in_flight=${LUSTRE_OST_MAX_RPC}
        check_success "Set OST max_rpcs_in_flight"

        sudo lctl set_param mdc.*.max_rpcs_in_flight=${LUSTRE_MDC_MAX_RPC}
        check_success "Set MDC max_rpcs_in_flight"

        sudo lctl set_param mdc.*.max_mod_rpcs_in_flight=${LUSTRE_MDC_MOD_RPC}
        check_success "Set MDC max_mod_rpcs_in_flight"

        # 7. Verify all tunings
        echo "********Verifying all tunings********"

        # Function to verify parameter value
        verify_param() {
            local param=$1
            local expected=$2
            local actual=$3

            if [ "$actual" == "$expected" ]; then
                echo "SUCCESS: $param is correctly set to $expected"
            else
                echo "WARNING: $param is set to $actual (expected $expected)"
            fi
        }

        echo "Verifying all parameters:"

        # LRU tunings
        actual_lru_max_age=$(lctl get_param -n ldlm.namespaces.*.lru_max_age | head -1)
        verify_param "lru_max_age" "600000" "$actual_lru_max_age"

        actual_lru_size=$(lctl get_param -n ldlm.namespaces.*.lru_size | head -1)
        verify_param "lru_size" "$LRU_SIZE" "$actual_lru_size"

        # Client Cache
        actual_max_cached_mb=$(lctl get_param -n llite.*.max_cached_mb | grep "max_cached_mb:" | awk '{print $2}')
        verify_param "max_cached_mb" "64" "$actual_max_cached_mb"

        # RPC Controls
        actual_ost_rpcs=$(lctl get_param -n osc.*OST*.max_rpcs_in_flight | head -1)
        verify_param "OST max_rpcs_in_flight" "32" "$actual_ost_rpcs"

        actual_mdc_rpcs=$(lctl get_param -n mdc.*.max_rpcs_in_flight | head -1)
        verify_param "MDC max_rpcs_in_flight" "64" "$actual_mdc_rpcs"

        actual_mdc_mod_rpcs=$(lctl get_param -n mdc.*.max_mod_rpcs_in_flight | head -1)
        verify_param "MDC max_mod_rpcs_in_flight" "50" "$actual_mdc_mod_rpcs"

        # Network and RPC configurations from modprobe.conf
        actual_ptlrpc=$(grep "ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf | awk '{print $3}')
        verify_param "ptlrpcd_per_cpt_max" "ptlrpcd_per_cpt_max=64" "$actual_ptlrpc"

        actual_ksocklnd=$(grep "ksocklnd credits" /etc/modprobe.d/modprobe.conf | awk '{print $3}')
        verify_param "ksocklnd credits" "credits=2560" "$actual_ksocklnd"

        # 8. Setup persistence
        setup_persistence() {
            # Create functions file
            cat << EOF > $FUNCTIONS_SCRIPT
        #!/bin/bash

        apply_lustre_tunings() {
            local NUM_CPUS=\$(nproc)
            local LRU_SIZE=\$((100 * NUM_CPUS))

            echo "Applying Lustre performance tunings..."
            lctl set_param ldlm.namespaces.*.lru_max_age=$LUSTRE_LRU_MAX_AGE
            lctl set_param ldlm.namespaces.*.lru_size=\$LRU_SIZE
            lctl set_param llite.*.max_cached_mb=$LUSTRE_MAX_CACHED_MB
            lctl set_param osc.*OST*.max_rpcs_in_flight=$LUSTRE_OST_MAX_RPC
            lctl set_param mdc.*.max_rpcs_in_flight=$LUSTRE_MDC_MAX_RPC
            lctl set_param mdc.*.max_mod_rpcs_in_flight=$LUSTRE_MDC_MOD_RPC
        }
        EOF

            # Create tuning script
            cat << EOF > $TUNINGS_SCRIPT
        #!/bin/bash
        exec 1> >(logger -s -t \$(basename \$0)) 2>&1

        source $FUNCTIONS_SCRIPT

        # Function to check if Lustre is mounted
        is_lustre_mounted() {
            mount | grep -q "type lustre"
        }

        # Function to mount Lustre
        mount_lustre() {
            echo "Mounting Lustre filesystem..."
            mkdir -p $MOUNT_POINT
            mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} $MOUNT_POINT
            return \$?
        }

        # Main execution
        # Try to mount if not already mounted
        if ! is_lustre_mounted; then
            echo "Lustre filesystem not mounted, attempting to mount..."
            mount_lustre
        fi

        # Wait for successful mount (up to 5 minutes)
        for i in {1..30}; do
            if is_lustre_mounted; then
                echo "Lustre filesystem mounted, applying tunings..."
                apply_lustre_tunings
                exit 0
            fi
            echo "Waiting for Lustre filesystem to be mounted... (attempt $i/30)"
            sleep 10
        done

        echo "Timeout waiting for Lustre filesystem mount"
        exit 1
        EOF

        # Create systemd service

        # Create systemd directory if it doesn't exist
        sudo mkdir -p /etc/systemd/system/

            # Create service file directly for Ubuntu
            cat << EOF > $SERVICE_FILE
        [Unit]
        Description=Apply Lustre Performance Tunings
        After=network.target remote-fs.target

        [Service]
        Type=oneshot
        ExecStart=/bin/bash -c 'source $FUNCTIONS_SCRIPT && $TUNINGS_SCRIPT'
        RemainAfterExit=yes

        [Install]
        WantedBy=multi-user.target
        EOF


            # Make scripts executable and enable service
            sudo chmod +x $FUNCTIONS_SCRIPT
            sudo chmod +x $TUNINGS_SCRIPT
            systemctl enable lustre-tunings.service
            systemctl start lustre-tunings.service
        }

        echo "********Setting up persistent tuning********"
        setup_persistence

        echo "FSx for Lustre configuration completed."
```

## (選用) 步驟 3. 驗證 EFA 設定
<a name="verify-efa-setup"></a>

對節點執行 SSH：

```
# Get instance ID from EKS console or {aws} CLI
ssh -i /path/to/your-key.pem ec2-user@<node-internal-ip>
```

驗證 EFA 組態：

```
sudo lnetctl net show
```

檢查設定日誌：

```
sudo cat /var/log/cloud-init-output.log
```

以下是 `lnetctl net show` 的預期輸出範例：

```
net:
    - net type: tcp
      ...
    - net type: efa
      local NI(s):
        - nid: xxx.xxx.xxx.xxx@efa
          status: up
```

## 範例部署
<a name="example-deployments"></a>

### a. 建立 claim.yaml
<a name="_a_create_claim_yaml"></a>

```
#claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fsx-claim-efa
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 4800Gi
  volumeName: fsx-pv
```

套用宣告：

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

### b. 建立 pv.yaml
<a name="_b_create_pv_yaml"></a>

更新 `<replaceable-placeholders>`：

```
#pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: fsx-pv
spec:
  capacity:
    storage: 4800Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  mountOptions:
    - flock
  persistentVolumeReclaimPolicy: Recycle
  csi:
    driver: fsx.csi.aws.com
    volumeHandle: fs-<1234567890abcdef0>
    volumeAttributes:
      dnsname: fs-<1234567890abcdef0>.fsx.us-east-1.amazonaws.com
      mountname: <abcdef01>
```

套用持久性磁碟區：

```
kubectl apply -f pv.yaml
```

### c. 建立 pod.yaml
<a name="_c_create_pod_yaml"></a>

```
#pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: fsx-efa-app
spec:
  containers:
  - name: app
    image: amazonlinux:2
    command: ["/bin/sh"]
    args: ["-c", "while true; do dd if=/dev/urandom bs=100M count=20 > data/test_file; sleep 10; done"]
    resources:
      requests:
        vpc.amazonaws.com/efa: 1
      limits:
        vpc.amazonaws.com/efa: 1
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: fsx-claim-efa
```

套用 Pod：

```
kubectl apply -f pod.yaml
```

## 其他驗證命令
<a name="verification-commands"></a>

驗證 Pod 掛載並寫入檔案系統：

```
kubectl exec -ti fsx-efa-app -- df -h | grep data
# Expected output:
# <192.0.2.0>@tcp:/<abcdef01>  4.5T  1.2G  4.5T   1% /data

kubectl exec -ti fsx-efa-app -- ls /data
# Expected output:
# test_file
```

對節點執行 SSH，以驗證流量是否通過 EFA：

```
sudo lnetctl net show -v
```

預期輸出將顯示含有流量統計資料的 EFA 介面。

## 相關資訊
<a name="_related_information"></a>
+  [部署 FSx for Lustre 驅動程式](fsx-csi-create.md) 
+  [最佳化節點 (非 EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-non-efa.md) 
+  [Amazon FSx for Lustre 效能](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html) 
+  [Elastic Fabric Adapter](https://docs.aws.amazon.com/ec2/latest/userguide/efa.html) 

# 最佳化節點 (非 EFA) 上的 Amazon FSx for Lustre 效能
<a name="fsx-csi-tuning-non-efa"></a>

您可以使用啟動範本使用者資料，在節點初始化期間套用調校參數，以最佳化 Amazon FSx for Lustre 效能。

**注意**  
如需建立和部署 FSx for Lustre CSI 驅動程式的資訊，請參閱 [部署 FSx for Lustre 驅動程式](fsx-csi-create.md)。如需使用已啟用 EFA 的節點最佳化效能，請參閱 [最佳化節點 (EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-efa.md)。

## 為什麼要使用啟動範本使用者資料？
<a name="_why_use_launch_template_user_data"></a>
+ 在節點初始化期間自動套用調校。
+ 請確保所有節點的組態一致。
+ 無需手動設定節點組態。

## 範例指令碼概觀
<a name="_example_script_overview"></a>

本主題中定義的範例指令碼會執行這些操作：

### `# 1. Install Lustre client`
<a name="_1_install_lustre_client"></a>
+ 自動偵測您的 Amazon Linux (AL) 作業系統版本。
+ 安裝適當的 Lustre 用戶端套件。

### `# 2. Apply network and RPC tunings`
<a name="_2_apply_network_and_rpc_tunings"></a>
+ 設定 `ptlrpcd_per_cpt_max=64` 以進行平行 RPC 處理。
+ 設定 `ksocklnd credits=2560` 以最佳化網路緩衝區。

### `# 3. Load Lustre modules`
<a name="_3_load_lustre_modules"></a>
+ 安全地移除現有的 Lustre 模組 (如有)。
+ 處理現有檔案系統的卸載。
+ 載入全新的 Lustre 模組。

### `# 4. Lustre Network Initialization`
<a name="_4_lustre_network_initialization"></a>
+ 初始化 Lustre 網路組態。
+ 設定必要的網路參數。

### `# 5. Mount FSx filesystem`
<a name="_5_mount_fsx_filesystem"></a>
+ 您必須在本區段中調整您環境的值。

### `# 6. Apply tunings`
<a name="_6_apply_tunings"></a>
+ LRU (鎖定資源單位) 調校：
  +  `lru_max_age=600000` 
  +  根據 CPU 計數計算的 `lru_size`
+ 用戶端快取控制：`max_cached_mb=64`
+ RPC 控制：
  + OST `max_rpcs_in_flight=32` 
  + MDC `max_rpcs_in_flight=64` 
  + MDC `max_mod_rpcs_in_flight=50` 

### `# 7. Verify tunings`
<a name="_7_verify_tunings"></a>
+ 驗證所有套用的調校。
+ 報告每個參數的成功或警告。

### `# 8. Setup persistence`
<a name="_8_setup_persistence"></a>
+ 您同樣必須在本區段中調整您環境的值。
+ 自動偵測您的作業系統版本 (AL2023)，以決定要套用`Systemd`的服務。
+ 系統啟動。
+  `Systemd` 會啟動 `lustre-tunings` 服務 (原因是 `WantedBy=multi-user.target`)。
+ 服務執行 `apply_lustre_tunings.sh`，其會：
  + 檢查檔案系統是否已掛載。
  + 如果尚未掛載，則掛載檔案系統。
  + 等待成功掛載 (最多五分鐘)。
  + 成功掛載後套用調校參數。
+ 設定會保持作用中狀態，直到重新啟動為止。
+ 指令碼完成後，服務即會結束。
  + Systemd 會將服務標記為「作用中 (已結束)」。
+ 程序會在下次重新啟動開機時重複執行。

## 建立啟動範本
<a name="_create_a_launch_template"></a>

1. 前往 https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

1. 選擇 **Launch Templates** (啟動範本)。

1. 選擇 **Create launch template** (建立啟動範本)。

1. 在 **Advanced details** (進階詳細資訊) 中，找到 **User data** (使用者資料) 區段。

1. 貼上以下指令碼，並視需要更新任何項目。
**重要**  
在區段 `# 5. Mount FSx filesystem` 和區段 `# 8. Setup persistence` 中 `apply_lustre_tunings.sh` 的 `setup_persistence()` 函數中，為您的環境調整這些值：  

   ```
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   ```

   ```
   MIME-Version: 1.0
   Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
   --==MYBOUNDARY==
   Content-Type: text/x-shellscript; charset="us-ascii"
   #!/bin/bash
   exec 1> >(logger -s -t $(basename $0)) 2>&1
   # Function definitions
   check_success() {
       if [ $? -eq 0 ]; then
           echo "SUCCESS: $1"
       else
           echo "FAILED: $1"
           return 1
       fi
   }
   apply_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
       local params=(
           "ldlm.namespaces.*.lru_max_age=600000"
           "ldlm.namespaces.*.lru_size=$LRU_SIZE"
           "llite.*.max_cached_mb=64"
           "osc.*OST*.max_rpcs_in_flight=32"
           "mdc.*.max_rpcs_in_flight=64"
           "mdc.*.max_mod_rpcs_in_flight=50"
       )
       for param in "${params[@]}"; do
           lctl set_param $param
           check_success "Set ${param%%=*}"
       done
   }
   verify_param() {
       local param=$1
       local expected=$2
       local actual=$3
   
       if [ "$actual" == "$expected" ]; then
           echo "SUCCESS: $param is correctly set to $expected"
       else
           echo "WARNING: $param is set to $actual (expected $expected)"
       fi
   }
   verify_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
       local params=(
           "ldlm.namespaces.*.lru_max_age:600000"
           "ldlm.namespaces.*.lru_size:$LRU_SIZE"
           "llite.*.max_cached_mb:64"
           "osc.*OST*.max_rpcs_in_flight:32"
           "mdc.*.max_rpcs_in_flight:64"
           "mdc.*.max_mod_rpcs_in_flight:50"
       )
       echo "Verifying all parameters:"
       for param in "${params[@]}"; do
           name="${param%%:*}"
           expected="${param#*:}"
           actual=$(lctl get_param -n $name | head -1)
           verify_param "${name##*.}" "$expected" "$actual"
       done
   }
   setup_persistence() {
       # Create functions file
       cat << 'EOF' > /usr/local/bin/lustre_functions.sh
   #!/bin/bash
   apply_lustre_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
   
       echo "Applying Lustre performance tunings..."
       lctl set_param ldlm.namespaces.*.lru_max_age=600000
       lctl set_param ldlm.namespaces.*.lru_size=$LRU_SIZE
       lctl set_param llite.*.max_cached_mb=64
       lctl set_param osc.*OST*.max_rpcs_in_flight=32
       lctl set_param mdc.*.max_rpcs_in_flight=64
       lctl set_param mdc.*.max_mod_rpcs_in_flight=50
   }
   EOF
       # Create tuning script
       cat << 'EOF' > /usr/local/bin/apply_lustre_tunings.sh
   #!/bin/bash
   exec 1> >(logger -s -t $(basename $0)) 2>&1
   # Source the functions
   source /usr/local/bin/lustre_functions.sh
   # FSx details
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   # Function to check if Lustre is mounted
   is_lustre_mounted() {
       mount | grep -q "type lustre"
   }
   # Function to mount Lustre
   mount_lustre() {
       echo "Mounting Lustre filesystem..."
       mkdir -p ${MOUNT_POINT}
       mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
       return $?
   }
   # Main execution
   # Try to mount if not already mounted
   if ! is_lustre_mounted; then
       echo "Lustre filesystem not mounted, attempting to mount..."
       mount_lustre
   fi
   # Wait for successful mount (up to 5 minutes)
   for i in {1..30}; do
       if is_lustre_mounted; then
           echo "Lustre filesystem mounted, applying tunings..."
           apply_lustre_tunings
           exit 0
       fi
       echo "Waiting for Lustre filesystem to be mounted... (attempt $i/30)"
       sleep 10
   done
   echo "Timeout waiting for Lustre filesystem mount"
   exit 1
   EOF
       # Create systemd service
       cat << 'EOF' > /etc/systemd/system/lustre-tunings.service
   [Unit]
   Description=Apply Lustre Performance Tunings
   After=network.target remote-fs.target
   StartLimitIntervalSec=0
   [Service]
   Type=oneshot
   ExecStart=/usr/local/bin/apply_lustre_tunings.sh
   RemainAfterExit=yes
   Restart=on-failure
   RestartSec=30
   [Install]
   WantedBy=multi-user.target
   EOF
       chmod +x /usr/local/bin/lustre_functions.sh
       chmod +x /usr/local/bin/apply_lustre_tunings.sh
       systemctl enable lustre-tunings.service
       systemctl start lustre-tunings.service
   }
   echo "Starting FSx for Lustre configuration..."
   # 1. Install Lustre client
   if grep -q 'VERSION="2"' /etc/os-release; then
       amazon-linux-extras install -y lustre
   elif grep -q 'VERSION="2023"' /etc/os-release; then
       dnf install -y lustre-client
   fi
   check_success "Install Lustre client"
   # 2. Apply network and RPC tunings
   export PATH=$PATH:/usr/sbin
   echo "Applying network and RPC tunings..."
   if ! grep -q "options ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf; then
       echo "options ptlrpc ptlrpcd_per_cpt_max=64" | tee -a /etc/modprobe.d/modprobe.conf
       echo "options ksocklnd credits=2560" | tee -a /etc/modprobe.d/modprobe.conf
   fi
   # 3. Load Lustre modules
   modprobe lustre
   check_success "Load Lustre modules" || exit 1
   # 4. Lustre Network Initialization
   lctl network up
   check_success "Initialize Lustre networking" || exit 1
   # 5. Mount FSx filesystem
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   if [ ! -z "$FSX_DNS" ] && [ ! -z "$MOUNT_NAME" ]; then
       mkdir -p $MOUNT_POINT
       mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
       check_success "Mount FSx filesystem"
   fi
   # 6. Apply tunings
   apply_tunings
   # 7. Verify tunings
   verify_tunings
   # 8. Setup persistence
   setup_persistence
   echo "FSx for Lustre configuration completed."
   --==MYBOUNDARY==--
   ```

1. 建立 Amazon EKS 節點群組時，選取此啟動範本。如需詳細資訊，請參閱[建立叢集的受管節點群組](create-managed-node-group.md)。

## 相關資訊
<a name="_related_information"></a>
+  [部署 FSx for Lustre 驅動程式](fsx-csi-create.md) 
+  [最佳化節點 (EFA) 上的 Amazon FSx for Lustre 效能](fsx-csi-tuning-efa.md) 
+  [Amazon FSx for Lustre 效能](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html) 

# 搭配 FSx for NetApp ONTAP 使用高效能應用程式儲存
<a name="fsx-ontap"></a>

NetApp Trident 提供使用容器儲存介面 (CSI) 合規驅動程式的動態儲存協同運作。這允許 Amazon EKS 叢集管理由 Amazon FSx for NetApp ONTAP 檔案系統支援的持久性磁碟區 (PV) 的生命週期。請注意，Amazon FSx for NetApp ONTAP CSI 驅動程式與 Amazon EKS 混合節點不相容。若要開始使用，請參閱 NetApp Trident 文件中的[使用 Trident 與 Amazon FSx for NetApp ONTAP](https://docs.netapp.com/us-en/trident/trident-use/trident-fsx.html)。

Amazon FSx for NetApp ONTAP 是一種儲存服務，允許您在雲端中啟動和執行全受管的 ONTAP 檔案系統。ONTAP 是 NetApp 的檔案系統技術，提供受到廣泛採用的資料存取和資料管理功能。FSx for ONTAP 可提供內部部署 NetApp 檔案系統的功能、效能和 API，賦予全受管 AWS 服務敏捷性、可擴展性和簡易性。如需詳細資訊，請參閱《[FSx for ONTAP 使用者指南](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/what-is-fsx-ontap.html)》。

**重要**  
如果您搭配 Amazon EBS CSI 驅動程式使用 Amazon FSx for NetApp ONTAP 來佈建 EBS 磁碟區，則必須在 `multipath.conf` 檔案中指定不使用 EBS 裝置。如需支援的方法，請參閱[組態檔案封鎖清單](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/dm_multipath/config_file_blacklist#config_file_blacklist)。請見此處範例。  

```
 defaults {
        user_friendly_names yes
        find_multipaths no
      }
      blacklist {
        device {
          vendor "NVME"
          product "Amazon Elastic Block Store"
        }
      }
```

# 搭配 Amazon FSx for OpenZFS 使用資料儲存
<a name="fsx-openzfs-csi"></a>

Amazon FSx for OpenZFS 是一項全受管檔案儲存服務，可讓您輕鬆將資料從內部部署 ZFS 或其他以 Linux 為基礎的檔案伺服器移至 AWS。您可以執行此動作，而無需變更應用程式程式碼或資料管理方式。這項服務提供建置在開放原始碼 OpenZFS 檔案系統上的高度可靠、可擴展、高效且功能豐富的檔案儲存。其將這些功能與全受管 AWS 服務的敏捷性、可擴展性和簡易性相結合。如需詳細資訊，請參閱《[Amazon FSx for OpenZFS 使用者指南](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/what-is-fsx.html)》。

FSx for OpenZFS 容器儲存介面 (CSI) 驅動程式提供 CSI 介面，允許 Amazon EKS 叢集管理 FSx for OpenZFS 磁碟區的生命週期。請注意，適用於 OpenZFS CSI 驅動程式的 Amazon FSx 與 Amazon EKS 混合節點不相容。若要將 FSx for OpenZFS CSI 驅動程式部署到您的 Amazon EKS 叢集，請參閱 GitHub 上的 [aws-fsx-openzfs-csi-driver](https://github.com/kubernetes-sigs/aws-fsx-openzfs-csi-driver)。

# 使用 Amazon File Cache 將延遲降到最低
<a name="file-cache-csi"></a>

Amazon File Cache 是 AWS 上一種全受管的高速快取，可用來處理檔案資料，而無論資料存放在何處。Amazon File Cache 會在資料第一次存取時自動將資料載入快取，並在未使用資料時將其釋放。如需詳細資訊，請參閱 [Amazon File Cache 使用者指南](https://docs.aws.amazon.com/fsx/latest/FileCacheGuide/what-is.html)。

Amazon File Cache 容器儲存介面 (CSI) 驅動程式提供 CSI 介面，允許 Amazon EKS 叢集管理 Amazon 檔案快取的生命週期。請注意，Amazon File Cache CSI 驅動程式與 Amazon EKS 混合節點不相容。若要將 Amazon File Cache CSI 驅動程式部署到您的 Amazon EKS 叢集，請參閱 GitHub 上的 [aws-file-cache-csi-driver](https://github.com/kubernetes-sigs/aws-file-cache-csi-driver)。

# 使用適用於 Amazon S3 的掛載點 CSI 驅動程式存取 Amazon S3 物件
<a name="s3-csi"></a>

使用[適用於 Amazon S3 的掛載點容器儲存介面 (CSI) 驅動程式](https://github.com/awslabs/mountpoint-s3-csi-driver)，您的 Kubernetes 應用程式可以透過檔案系統介面存取 Amazon S3 物件，在不變更任何應用程式碼的情況下實現高彙總輸送量。CSI 驅動程式以[適用於 Amazon S3 的掛載點](https://github.com/awslabs/mountpoint-s3)為建置基礎，將 Amazon S3 儲存貯體呈現為可透過在 Amazon EKS 中的容器和自我管理 Kubernetes 叢集存取的磁碟區。

## 考量事項
<a name="s3-csi-considerations"></a>
+ 適用於 Amazon S3 的掛載點 CSI 驅動程式目前與以 Windows 為基礎的容器映像不相容。
+ 適用於 Amazon S3 的掛載點 CSI 驅動程式目前與 Amazon EKS 混合節點不相容。
+ 適用於 Amazon S3 的掛載點 CSI 驅動程式不支援 AWS Fargate。但是，系統支援在 Amazon EC2 (使用 Amazon EKS 或自訂 Kubernetes 安裝) 中執行的容器。
+ 適用於 Amazon S3 的掛載點 CSI 驅動程式僅支援靜態佈建。不支援動態佈建或建立新儲存貯體。
**注意**  
靜態佈建是指使用在 `PersistentVolume` 物件中 `volumeAttributes` 內指定為 `bucketName` 的現有 Amazon S3 儲存貯體。如需詳細資訊，請參閱 GitHub 上的[靜態佈建](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/examples/kubernetes/static_provisioning/README.md)。
+ 使用適用於 Amazon S3 的掛載點 CSI 驅動程式掛載的磁碟區不支援所有 POSIX 檔案系統功能。若要了解檔案系統行為的相關詳細資訊，請參閱 GitHub 上的[適用於 Amazon S3 的掛載點檔案系統行為](https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md)。

若要了解部署驅動程式的相關詳細資訊，請參閱 [部署適用於 Amazon S3 的掛載點驅動程式](s3-csi-create.md)。若要了解移除驅動程式的相關詳細資訊，請參閱 [移除適用於 Amazon S3 的掛載點 Amazon EKS 附加元件](removing-s3-csi-eks-add-on.md)。

# 部署適用於 Amazon S3 的掛載點驅動程式
<a name="s3-csi-create"></a>

使用[適用於 Amazon S3 的掛載點容器儲存介面 (CSI) 驅動程式](https://github.com/awslabs/mountpoint-s3-csi-driver)，您的 Kubernetes 應用程式可以透過檔案系統介面存取 Amazon S3 物件，在不變更任何應用程式碼的情況下實現高彙總輸送量。

此程序將向您展示如何部署[適用於 Amazon S3 的掛載點 CSI Amazon EKS 驅動程式](s3-csi.md)。請先檢閱[考量事項](s3-csi.md#s3-csi-considerations)再繼續操作。

## 先決條件
<a name="s3-csi-prereqs"></a>
+ 叢集的現有 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 提供者。若要判定您是否已經擁有一個，或是要建立一個，請參閱 [為您的叢集建立 IAM OIDC 身分提供者](enable-iam-roles-for-service-accounts.md)。
+ 在您的裝置或 AWS CloudShell 上安裝和設定 CLI AWS 的 2.12.3 版或更新版本。
+ `kubectl` 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與您的叢集 Kubernetes 版本相同，或是為最多比該版本更舊一版或更新一版的次要版本。例如，如果您的叢集版本為 `1.29`，則可以搭配使用 `kubectl` `1.28`、`1.29` 或 `1.30` 版。若要安裝或升級 `kubectl`，請參閱 [設定 `kubectl` 和 `eksctl`](install-kubectl.md)。

## 步驟 1：建立 IAM 政策
<a name="s3-create-iam-policy"></a>

適用於 Amazon S3 的掛載點 CSI 驅動程式需要 Amazon S3 許可才能與檔案系統互動。此節將介紹如何建立可授予必要許可的 IAM 政策。

下列範例政策遵循掛載點的 IAM 許可建議。或者，您可以使用 AWS 受管政策 [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor)，但此受管政策授予的許可超過掛載點所需的許可。

若要了解掛載點建議許可的相關詳細資訊，請參閱 GitHub 上的[掛載點 IAM 許可](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#iam-permissions)。

1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 在**政策**頁面上，選擇**建立政策**。

1. 對於**政策編輯器**，選擇 **JSON**。

1. 在**政策編輯器**下，複製並貼上以下內容：
**重要**  
將 `amzn-s3-demo-bucket1` 取代為您自己 Amazon S3 儲存貯體的名稱。

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
           {
               "Sid": "MountpointFullBucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1"
               ]
           },
           {
               "Sid": "MountpointFullObjectAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:AbortMultipartUpload",
                   "s3:DeleteObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1/*"
               ]
           }
      ]
   }
   ```

   Amazon S3 Express One Zone 儲存類別推出目錄儲存貯體，可使用與一般用途儲存貯體不同的驗證機制。您應使用 `s3express:CreateSession` 動作，而非 `s3:*` 動作。若要了解目錄儲存貯體的相關詳細資訊，請參閱*Amazon S3 使用者指南*中的[目錄儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)。

   下面介紹了您將用於目錄儲存貯體的最低權限政策範例。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3express:CreateSession",
               "Resource": "arn:aws:s3express:us-west-2:111122223333:bucket/amzn-s3-demo-bucket1--usw2-az1--x-s3"
           }
       ]
   }
   ```

1. 選擇**下一步**。

1. 在**檢閱與建立**頁面上，為您的政策命名。本範例逐步教學使用的名稱是 `AmazonS3CSIDriverPolicy`。

1. 選擇**建立政策**。

## 步驟 2：建立 IAM 角色
<a name="s3-create-iam-role"></a>

適用於 Amazon S3 的掛載點 CSI 驅動程式需要 Amazon S3 許可才能與檔案系統互動。此節將介紹如何建立 IAM 角色以委派這些許可。如需建立此角色，您可使用以下其中一個工具：
+  [eksctl](#eksctl_s3_store_app_data) 
+  [AWS 管理主控台](#console_s3_store_app_data) 
+  [AWS CLI](#awscli_s3_store_app_data) 

**注意**  
IAM 政策 `AmazonS3CSIDriverPolicy` 於上一節建立。

### eksctl
<a name="eksctl_s3_store_app_data"></a>

 **使用 `eksctl` 建立適用於 Amazon S3 的掛載點 CSI 驅動程式 IAM 角色** 

執行以下命令來建立 IAM 角色和 Kubernetes 服務帳戶。這些命令也會將 `AmazonS3CSIDriverPolicy` IAM 政策連接至角色、使用 IAM 角色 Amazon Resource Name (ARN) 標註 Kubernetes 服務帳戶 (`s3-csi-controller-sa`)，並將 Kubernetes 服務帳戶名稱新增至 IAM 角色的信任政策。

```
CLUSTER_NAME=my-cluster
REGION=region-code
ROLE_NAME=AmazonEKS_S3_CSI_DriverRole
POLICY_ARN=AmazonEKS_S3_CSI_DriverRole_ARN
eksctl create iamserviceaccount \
    --name s3-csi-driver-sa \
    --namespace kube-system \
    --cluster $CLUSTER_NAME \
    --attach-policy-arn $POLICY_ARN \
    --approve \
    --role-name $ROLE_NAME \
    --region $REGION \
    --role-only
```

### AWS 管理主控台
<a name="console_s3_store_app_data"></a>

1. 前往 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 在 **Roles** (角色) 頁面上，選擇 **Create role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 在 **Trusted entity type** (信任的實體類型) 區段中，選擇 **Web identity** (Web 身分)。

   1. 對於 **Identity provider** (身分提供者)，為您的叢集選擇 **OpenID Connect provider URL** (OpenID Connect 供應商 URL)(如 Amazon EKS **Overview** (概觀) 下所示)。

      若 URL 未顯示，則檢閱[先決條件](#s3-csi-prereqs)。

   1. 針對 **Audience** (對象)，選擇 `sts.amazonaws.com`。

   1. 選擇**下一步**。

1. 在 **Add permissions** (新增許可) 頁面上，執行以下作業：

   1. 請在**篩選政策**方塊中，輸入 AmazonS3CSIDriverPolicy。
**注意**  
此政策於上一節建立。

   1. 勾選在搜尋中傳回的 `AmazonS3CSIDriverPolicy` 結果左側的核取方塊。

   1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，執行以下作業：

   1. 針對**角色名稱**，為您的角色輸入唯一名稱 (例如 AmazonEKS\$1S3\$1CSI\$1DriverRole)。

   1. 藉由連接標籤做為鍵值對，在**新增標籤 (選用)** 下將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱《IAM 使用者指南》**中的[標記 IAM 資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

   1. 選擇建**立角色**。

1. 建立角色之後，在主控台中選擇角色，以開啟角色進行編輯。

1. 選擇 **Trust Relationships** (信任關係) 標籤，然後選擇 **Edit Trust Relationship** (編輯信任政策)。

1. 查找與下列相似的行：

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
   ```

   在上一行的末尾新增一個逗號，然後在上一行之後新增下一行。將 *region-code* 取代為您的叢集所在的 AWS 區域。使用叢集的 OIDC 提供商 ID 取代 *EXAMPLED539D4633E53DE1B71EXAMPLE*。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa"
   ```

1. 確認 `Condition` 運算子已設定為 `"StringEquals"`。

1. 選擇 **Update policy** (更新政策) 以完成操作。

### AWS CLI
<a name="awscli_s3_store_app_data"></a>

1. 檢視叢集的 OIDC 提供者 URL。使用您叢集的名稱取代 *my-cluster*。如果來自命令的輸出是 `None`，則請檢閱[先決條件](#s3-csi-prereqs)。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
   ```

   範例輸出如下。

   ```
   https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
   ```

1. 建立 IAM 角色，將 Kubernetes 服務帳戶授予 `AssumeRoleWithWebIdentity` 動作。

   1. 將下列內容複製到名為 `aws-s3-csi-driver-trust-policy.json` 的檔案。使用您的帳戶 ID 取代 *111122223333*。使用前一個步驟傳回的值取代 *EXAMPLED539D4633E53DE1B71EXAMPLE* 和 *region-code*。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringEquals": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. 建立角色。您可以將 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 變更為不同的名稱，但如果這樣做，請務必在稍後的步驟中進行變更。

      ```
      aws iam create-role \
        --role-name AmazonEKS_S3_CSI_DriverRole \
        --assume-role-policy-document file://"aws-s3-csi-driver-trust-policy.json"
      ```

1. 使用以下命令將先前建立的 IAM 政策連接至角色。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws: iam::aws:policy/AmazonS3CSIDriverPolicy \
     --role-name AmazonEKS_S3_CSI_DriverRole
   ```
**注意**  
IAM 政策 `AmazonS3CSIDriverPolicy` 於上一節建立。

1. 如果您要將驅動程式安裝為 Amazon EKS 附加元件，請略過此步驟。若為驅動程式的自我管理安裝，請建立使用您所建立的 IAM 角色之 ARN 予以註釋的 Kubernetes 服務帳戶。

   1. 將下列內容儲存到名為 `mountpoint-s3-service-account.yaml` 的檔案中。使用您的帳戶 ID 取代 *111122223333*。

      ```
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/name: aws-mountpoint-s3-csi-driver
        name: mountpoint-s3-csi-controller-sa
        namespace: kube-system
        annotations:
          eks.amazonaws.com/role-arn: arn:aws: iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
      ```

   1. 在您的叢集上建立 Kubernetes 服務帳戶。Kubernetes 服務帳戶 (`mountpoint-s3-csi-controller-sa`) 使用您建立的名稱為 *AmazonEKS\$1S3\$1CSI\$1DriverRole* 的 IAM 角色進行註解。

      ```
      kubectl apply -f mountpoint-s3-service-account.yaml
      ```
**注意**  
當您在此程序中部署外掛程式時，其會建立並設定為使用名為 `s3-csi-driver-sa` 的服務帳戶。

## 步驟 3：安裝適用於 Amazon S3 的掛載點 CSI 驅動程式
<a name="s3-install-driver"></a>

您可透過 Amazon EKS 附加元件安裝適用於 Amazon S3 的掛載點 CSI 驅動程式。您可使用下面的工具，新增附加元件至您的叢集：
+  [eksctl](#eksctl_s3_add_store_app_data) 
+  [AWS 管理主控台](#console_s3_add_store_app_data) 
+  [AWS CLI](#awscli_s3_add_store_app_data) 

或者以自我管理安裝的方式，安裝適用於 Amazon S3 的掛載點 CSI 驅動程式。若要了解執行自我管理安裝的說明，請參閱 GitHub 上的[安裝](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/docs/install.md#deploy-driver)。

從 `v1.8.0` 開始，您可設定能夠容忍 CSI 驅動程式 Pod 的污點。如需這樣做，則指定自訂的污點集來容忍 `node.tolerations`，或者透過 `node.tolerateAllTaints` 來容忍所有污點。如需詳細資訊，請參閱 Kubernetes 文件中的[污點和容差](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。

### eksctl
<a name="eksctl_s3_add_store_app_data"></a>

 **使用 `eksctl` 來新增 Amazon S3 CSI 附加元件** 

執行下列命令。使用您的叢集名稱取代 *my-cluster*、使用您的帳戶 ID 取代 *111122223333*，再以[先前建立的 IAM 角色](#s3-create-iam-role)名稱取代 *AmazonEKS\$1S3\$1CSI\$1DriverRole*。

```
eksctl create addon --name aws-mountpoint-s3-csi-driver --cluster my-cluster \
  --service-account-role-arn arn:aws: iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole --force
```

如果您移除 *--force* 選項，且任何 Amazon EKS 附加元件設定與現有設定衝突，然後更新 Amazon EKS 附加元件失敗，則您會收到錯誤訊息以協助您解決衝突。指定此選項之前，請確定 Amazon EKS 附加元件未管理您需要管理的設定，因為這些設定會被此選項覆寫。如需有關此設定之其他選項的詳細資訊，請參閱 `eksctl` 文件中的 [Addons](https://eksctl.io/usage/addons/) (附加元件)。如需有關 Amazon EKS Kubernetes 欄位管理的詳細資訊，請參閱 [確定您可為 Amazon EKS 附加元件自訂的欄位](kubernetes-field-management.md)。

您可透過組態檔案來自訂 `eksctl`。如需詳細資訊，請參閱 `eksctl` 文件中的[使用組態值](https://eksctl.io/usage/addons/#working-with-configuration-values)。以下範例說明了如何容忍所有污點。

```
# config.yaml
...

addons:
- name: aws-mountpoint-s3-csi-driver
  serviceAccountRoleARN: arn:aws: iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
  configurationValues: |-
    node:
      tolerateAllTaints: true
```

### AWS 管理主控台
<a name="console_s3_add_store_app_data"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中選擇**叢集**。

1. 選擇要為其設定適用於 Amazon S3 的掛載點 CSI 附加元件的叢集名稱。

1. 選擇**附加元件**索引標籤。

1. 選擇**取得更多附加元件**。

1. 在**選取附加元件**頁面上，執行下列動作：

   1. 在 **Amazon EKS-外掛程式**區段中，選取**適用於 Amazon S3 的掛載點 CSI 驅動程式**核取方塊。

   1. 選擇**下一步**。

1. 在**設定選取的附加元件設定**頁面上，執行以下操作：

   1. 選取您要使用的**版本**。

   1. 針對**選取 IAM 角色**，選取已連接適用於 Amazon S3 的掛載點 CSI 驅動程式 IAM 政策的 IAM 角色名稱。

   1. (選用) 展開**選用的組態設定**之後，更新**衝突解決方法**。如果您選取**覆寫**，就能使用 Amazon EKS 附加元件的設定來覆寫現有附加元件的一種或多種設定。若未啟用此選項，而且有設定與現有設定發生衝突，則操作會失敗。您可以使用產生的錯誤訊息對此衝突進行疑難排解。在選取此選項之前，請確認 Amazon EKS 附加元件未管理您需要自我管理的設定。

   1. (選用) 展開**選用的組態設定**之後，在**組態值**欄位中設定容差。

   1. 選擇**下一步**。

1. 在**檢閱並新增**頁面上，選擇**建立**。附加元件安裝完成後，您會看到已安裝的附加元件。

### AWS CLI
<a name="awscli_s3_add_store_app_data"></a>

 **使用 CLI 新增 Amazon S3 CSI AWS 附加元件的掛載點** 

執行下列命令。使用您的叢集名稱取代 *my-cluster*、使用您的帳戶 ID 取代 *111122223333*，再以先前建立的角色名稱取代 *AmazonEKS\$1S3\$1CSI\$1DriverRole*。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws: iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
```

您可使用 `--configuration-values` 標誌來自訂命令。以下替代範例說明了如何容忍所有污點。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws: iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole \
  --configuration-values '{"node":{"tolerateAllTaints":true}}'
```

## 步驟 4：設定適用於 Amazon S3 的掛載點
<a name="s3-configure-mountpoint"></a>

在大多數情況下，您只能使用儲存貯體名稱來設定適用於 Amazon S3 的掛載點。若要了解設定適用於 Amazon S3 的掛載點的相關說明，請參閱 GitHub 上的[設定適用於 Amazon S3 的掛載點](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md)。

## 步驟 5：部署範例應用程式
<a name="s3-sample-app"></a>

您可以將靜態佈建部署到現有 Amazon S3 儲存貯體上的驅動程式。如需詳細資訊，請參閱 GitHub 上的[靜態佈建](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/examples/kubernetes/static_provisioning/README.md)。

# 移除適用於 Amazon S3 的掛載點 Amazon EKS 附加元件
<a name="removing-s3-csi-eks-add-on"></a>

您可使用兩個選項來移除[適用於 Amazon S3 的掛載點 CSI 驅動程式](s3-csi.md)。
+  **Preserve add-on software on your cluster** (在叢集上保留附加元件軟體)：此選項會移除任何設定的 Amazon EKS 管理。其也會移除 Amazon EKS 通知您更新的功能，並在您啟動更新後自動更新 Amazon EKS 附加元件。不過，該選項會保留您叢集上的附加元件軟體。此選項會使附加元件成為自我管理安裝，而不是 Amazon EKS 附加元件。如果啟用此選項，附加元件就無須停機。本程序中的命令使用此選項。
+  **Remove add-on software entirely from your cluster** (從叢集中完全移除附加元件軟體)：只有叢集上沒有資源依賴於附加元件提供的功能時，我們才會建議您將 Amazon EKS 附加元件從叢集中移除。若要執行此選項，請從您在此程序中使用的命令刪除 `--preserve`。

若附加元件具有與其相關聯的 IAM 帳戶，則不會移除該 IAM 帳戶。

您可使用以下工具，來移除 Amazon S3 CSI 附加元件：
+  [eksctl](#eksctl_s3_remove_store_app_data) 
+  [AWS 管理主控台](#console_s3_remove_store_app_data) 
+  [AWS CLI](#awscli_s3_remove_store_app_data) 

## eksctl
<a name="eksctl_s3_remove_store_app_data"></a>

 **使用 `eksctl` 移除 Amazon S3 CSI 附加元件** 

使用您叢集的名稱取代 *my-cluster*，然後執行以下命令。

```
eksctl delete addon --cluster my-cluster --name aws-mountpoint-s3-csi-driver --preserve
```

## AWS 管理主控台
<a name="console_s3_remove_store_app_data"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中選擇**叢集**。

1. 選取要移除 Amazon EBS CSI 附加元件的叢集名稱。

1. 選擇**附加元件**索引標籤。

1. 選擇**適用於 Amazon S3 的掛載點 CSI 驅動程式**。

1. 選擇**移除**。

1. 在**移除：aws-mountpoint-s3-csi-driver** 確認對話方塊中，請執行以下操作：

   1. 若希望 Amazon EKS 停止管理附加元件的設定，請選取**在叢集上保留**。若要在叢集上保留附加元件軟體，請執行此動作。如此一來，您就可以自行管理附加元件的所有設定。

   1. 輸入 `aws-mountpoint-s3-csi-driver`。

   1. 選取 **Remove** (移除)。

## AWS CLI
<a name="awscli_s3_remove_store_app_data"></a>

 **使用 AWS CLI 移除 Amazon S3 CSI 附加元件** 

使用您叢集的名稱取代 *my-cluster*，然後執行以下命令。

```
aws eks delete-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver --preserve
```

# 啟用 CSI 磁碟區的快照功能
<a name="csi-snapshot-controller"></a>

快照功能可建立資料的即時複本。為了讓此功能在 Kubernetes 中運作，您需要同時具備支援快照的 CSI 驅動程式 (例如 Amazon EBS CSI 驅動程式) 和 CSI 快照控制器。快照控制器可作為 Amazon EKS 受管附加元件，或透過自行管理安裝提供。

以下是使用 CSI 快照控制器的一些注意事項。
+ 快照控制器必須與具有快照拍攝功能的 CSI 驅動程式一起安裝。如需有關安裝 Amazon EBS CSI 驅動程式的說明，請參閱 [透過 Amazon EBS 使用 Kubernetes 磁碟區儲存](ebs-csi.md)。
+ Kubernetes 不支援透過 CSI 移轉提供的磁碟區快照，例如使用具有佈建程式 `kubernetes.io/aws-ebs` 的 `StorageClass` 之 Amazon EBS 磁碟區。必須使用參照 CSI 驅動程式佈建程式 (`ebs.csi.aws.com`) 的 `StorageClass` 來建立磁碟區。
+ Amazon EKS 自動模式不包含快照控制器。EKS 自動模式的儲存功能與快照控制器相容。

我們建議您透過 Amazon EKS 受管附加元件安裝 CSI 快照控制器。此附加元件包含在 Amazon EKS 上建立和管理快照所需的自訂資源定義 (CRD)。若要將 Amazon EKS 附加元件新增至叢集，請參閱 [建立 Amazon EKS 附加元件](creating-an-add-on.md)。如需附加元件的詳細資訊，請參閱 [Amazon EKS 附加元件](eks-add-ons.md)。

或者，如果您想要 CSI 快照控制器的自我管理安裝，請參閱 GitHub 上游 Kubernetes `external-snapshotter` 中的[使用](https://github.com/kubernetes-csi/external-snapshotter/blob/master/README.md#usage)。