

 **協助改進此頁面** 

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

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

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

# 透過 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/AmazonEBSCSIDriverPolicyV2.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicyV2.html) 並建立具有減少許可的自訂 IAM 政策。如果從 遷移`AmazonEBSCSIDriverPolicy`，請參閱 [EBS CSI 驅動程式政策遷移](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/issues/2918)。

**注意**  
本程序中的特定步驟是針對將驅動程式用作 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/AmazonEBSCSIDriverPolicyV2 \
           --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** (篩選政策) 方塊中，輸入 `AmazonEBSCSIDriverPolicyV2`。

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

   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/AmazonEBSCSIDriverPolicyV2 \
         --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)。