

 **Ayude a mejorar esta página** 

Para contribuir a esta guía del usuario, elija el enlace **Edit this page on GitHub** que se encuentra en el panel derecho de cada página.

# Uso del almacenamiento de volúmenes de Kubernetes con Amazon EBS
<a name="ebs-csi"></a>

**nota**  
 **Nuevo:** el modo automático de Amazon EKS automatiza las tareas rutinarias para el almacenamiento en bloque. Información sobre cómo [Implementación de una carga de trabajo con estado de ejemplo en el modo automático de EKS](sample-storage-workload.md).

El [controlador de la interfaz de almacenamiento de contenedores (CSI) de Amazon Elastic Block Store (Amazon EBS)](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/) administra el ciclo de vida de los volúmenes de Amazon EBS como almacenamiento para los volúmenes de Kubernetes que se creen. El controlador CSI de Amazon EBS crea volúmenes de Amazon EBS para estos tipos de volúmenes de Kubernetes: [volúmenes efímeros](https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/) genéricos y [volúmenes persistentes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/).

## Consideraciones
<a name="ebs-csi-considerations"></a>
+ No necesita instalar el controlador de CSI de Amazon EBS en los clústeres de modo automático de EKS.
+ No puede montar volúmenes de Amazon EBS en los pods de Fargate.
+ Puede ejecutar el controlador CSI de Amazon EBS en nodos de Fargate, pero el nodo CSI de Amazon EBS `DaemonSet` solo se puede ejecutar en instancias de Amazon EC2.
+ Los volúmenes de Amazon EBS y el controlador CSI de Amazon EBS no son compatibles con los nodos híbridos de Amazon EKS.
+ Se ofrecerá soporte para la versión más reciente del complemento y para una versión anterior. Las correcciones para errores o vulnerabilidades encontrados en la versión más reciente se trasladarán a la versión anterior en una nueva versión menor.
+ El modo automático de EKS requiere que las clases de almacenamiento usen `ebs.csi.eks.amazonaws.com` como aprovisionador. El controlador de CSI estándar de Amazon EBS (`ebs.csi.aws.com`) administra sus propios volúmenes por separado. Para utilizar los volúmenes existentes con el modo automático de EKS, mígrelos mediante instantáneas de volumen a una clase de almacenamiento que utilice el aprovisionador de modo automático.

**importante**  
Para utilizar la funcionalidad de instantáneas del controlador de CSI de Amazon EBS, primero deberá instalar el controlador de instantáneas de CSI. Para obtener más información, consulte [Habilitación de la funcionalidad de instantáneas para volúmenes de CSI](csi-snapshot-controller.md).

## Requisitos previos
<a name="ebs-csi-prereqs"></a>
+ Un clúster existente. Para ver la versión de plataforma requerida, ejecute el siguiente comando.

  ```
  aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  ```
+ El controlador CSI de EBS necesita permisos de AWS IAM.
  +  AWS sugiere usar Pod Identities de EKS. Para obtener más información, consulte [Información general de configuración de las Pod Identities de EKS](pod-identities.md#pod-id-setup-overview).
  + Para obtener información sobre roles de IAM para cuentas de servicio, consulte [Crear un proveedor de OIDC de IAM para su clúster](enable-iam-roles-for-service-accounts.md).

## Paso 1: creación de un rol de IAM
<a name="csi-iam-role"></a>

El complemento CSI de Amazon EBS requiere permisos de IAM para realizar llamadas a las API de AWS en su nombre. Si no lleva a cabo estos pasos, aparecerá `failed to provision volume with StorageClass` con el error `could not create volume in EC2: UnauthorizedOperation` cuando intente instalar el complemento y ejecutar `kubectl describe pvc`. Para obtener más información, consulte [Configurar el permiso del controlador](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions) en GitHub.

**nota**  
Los pods tendrán acceso a los permisos asignados al rol de IAM, a menos que bloquee el acceso al IMDS. Para obtener más información, consulte [Protección de los clústeres de Amazon EKS con las prácticas recomendadas](security-best-practices.md).

El siguiente procedimiento muestra cómo crear un rol de IAM y asociarle la política administrada de AWS. Para implementar este procedimiento, puede utilizar una de las siguientes herramientas:
+  [`eksctl`](#eksctl_store_app_data) 
+  [Consola de administración de AWS](#console_store_app_data) 
+  [AWS CLI](#awscli_store_app_data) 

**nota**  
Puede crear una política autoadministrada con permisos limitados. Consulte [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html) y cree una política de IAM personalizada con permisos reducidos.

**nota**  
Los pasos específicos de este procedimiento están diseñados para usar el controlador como complemento de Amazon EKS. Se necesitan diferentes pasos para usar el controlador como complemento autoadministrado. Para obtener más información, consulte [Set up driver permissions](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions) en GitHub.

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

1. Cree un rol de IAM y asóciele una política. AWS mantiene una política administrada de AWS, pero también puede crear su propia política personalizada. Puede crear un rol de IAM y asociar la política administrada de AWS con el siguiente comando. Reemplace *my-cluster* por el nombre de su clúster. El comando implementa una pila de AWS CloudFormation que crea un rol de IAM y le adjunta la política de IAM.

   ```
   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. Puede omitir este paso si no utiliza una [clave KMS](https://aws.amazon.com/kms/) personalizada. Si utiliza una para el cifrado en los volúmenes de Amazon EBS, personalice el rol de IAM según sea necesario. Por ejemplo, haga lo siguiente:

   1. Copie y pegue el siguiente código en un nuevo archivo `kms-key-for-encryption-on-ebs.json`. Reemplace *custom-key-arn* por el [ARN de clave de KMS](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) personalizado.

      ```
      {
            "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. Creación de la política. Puede cambiar *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* por un nombre diferente. Sin embargo, si lo hace, asegúrese de hacerlo también en pasos posteriores.

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

   1. Adjunte una política de IAM y adjunte la política de IAM al rol con el siguiente comando. Reemplace *111122223333* por el ID de su cuenta.

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

### Consola de administración de AWS
<a name="console_store_app_data"></a>

1. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

1. En el panel de navegación izquierdo, elija **Roles**.

1. En la página **Roles**, elija **Crear rol**.

1. En la página **Seleccionar entidad de confianza**, haga lo siguiente:

   1. En la sección **Tipo de entidad de confianza**, elija **Identidad web**.

   1. Para **Identity provider** (Proveedor de identidades), elija **OpenID Connect provider URL** (URL del proveedor de OpenID Connect) para el clúster, como se muestra en **Overview** (Resumen) en Amazon EKS.

   1. En **Audiencia**, elija `sts.amazonaws.com`.

   1. Elija **Siguiente**.

1. En la página **Agregar permisos**, haga lo siguiente:

   1. En el cuadro **Filtrar políticas**, escriba `AmazonEBSCSIDriverPolicy`.

   1. Marque la casilla situada a la izquierda del nombre de la `AmazonEBSCSIDriverPolicy` que obtuvo en la búsqueda.

   1. Elija **Siguiente**.

1. En la página **Nombrar, revisar y crear**, haga lo siguiente:

   1. En **Nombre del rol**, ingrese un nombre único para su rol, por ejemplo, *AmazonEKS\$1EBS\$1CSI\$1DriverRole*.

   1. En **Agregar etiquetas (Opcional)**, de manera opcional, agregue metadatos al rol asociando etiquetas como pares de clave-valor. Para obtener más información sobre el uso de etiquetas en IAM, consulte [Etiquetado de recursos de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) en la *Guía de usuario de IAM*.

   1. Elija **Creación de rol**.

1. Una vez creado el rol, seleccione el rol en la consola para abrirlo y editarlo.

1. Elija la pestaña **Relaciones de confianza** y, a continuación, **Editar política de confianza**.

1. Busque la línea que se parezca a la siguiente:

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

   Agregue una coma al final de la línea anterior y, luego, agregue la siguiente línea después de la anterior. Reemplace *region-code* por la región de AWS en la que se encuentra el clúster. Reemplace *EXAMPLED539D4633E53DE1B71EXAMPLE* con el ID de proveedor de OIDC de su clúster.

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

1. Elija **Actualizar política** para terminar.

1. Si utiliza una [clave de KMS](https://aws.amazon.com/kms/) personalizada para el cifrado en los volúmenes de Amazon EBS, personalice el rol de IAM según sea necesario. Por ejemplo, haga lo siguiente:

   1. En el panel de navegación izquierdo, elija **Políticas**.

   1. En la página **Políticas**, seleccione **Crear una política**.

   1. En la página **Crear política**, elija la pestaña **JSON**.

   1. Copie y pegue el siguiente código en el editor y reemplace *custom-key-arn* por el [ARN de la clave de KMS](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) personalizado.

      ```
      {
            "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. Elija **Siguiente: etiquetas**.

   1. En la página **Agregar etiquetas (opcional)**, elija **Siguiente: revisar**.

   1. En **Nombre**, introduzca un nombre exclusivo para la política (por ejemplo, *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*).

   1. Elija **Crear política**.

   1. En el panel de navegación izquierdo, elija **Roles**.

   1. Elija ***AmazonEKS\$1EBS\$1CSI\$1DriverRole*** en la consola para abrirlo y editarlo.

   1. En la lista desplegable **Agregar permisos**, seleccione **Asociar políticas**.

   1. En el cuadro **Políticas de filtrado**, escriba *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*.

   1. Seleccione la casilla situada a la izquierda del nombre de la *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* que obtuvo en la búsqueda.

   1. Seleccione **Asociar políticas**.

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

1. Visualización de la URL del proveedor de OIDC de su clúster. Sustituya *my-cluster* por el nombre del clúster. Si la salida del comando es `None`, revise los **Requisitos previos**.

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

   Un ejemplo de salida sería el siguiente.

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

1. Creación del rol de IAM y otorgamiento de la acción `AssumeRoleWithWebIdentity`.

   1. Copie el siguiente contenido en un archivo con el nombre `aws-ebs-csi-driver-trust-policy.json`. Reemplace *111122223333* por el ID de su cuenta. Reemplace *EXAMPLED539D4633E53DE1B71EXAMPLE* y *region-code* por los valores que se devolvieron en el paso anterior.

      ```
      {
            "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. Creación del rol. Puede cambiar *AmazonEKS\$1EBS\$1CSI\$1DriverRole* a un nombre diferente. Si lo cambia, asegúrese de hacerlo también en pasos posteriores.

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

1. Asocie una política. AWS mantiene una política administrada de AWS, pero también puede crear su propia política personalizada. Asocie la política administrada de AWS al rol con el siguiente comando.

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

1. Si utiliza una [clave de KMS](https://aws.amazon.com/kms/) personalizada para el cifrado en los volúmenes de Amazon EBS, personalice el rol de IAM según sea necesario. Por ejemplo, haga lo siguiente:

   1. Copie y pegue el siguiente código en un nuevo archivo `kms-key-for-encryption-on-ebs.json`. Reemplace *custom-key-arn* por el [ARN de clave de KMS](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) personalizado.

      ```
      {
            "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. Creación de la política. Puede cambiar *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* por un nombre diferente. Sin embargo, si lo hace, asegúrese de hacerlo también en pasos posteriores.

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

   1. Adjunte una política de IAM y adjunte la política de IAM al rol con el siguiente comando. Reemplace *111122223333* por el ID de su cuenta.

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

Ahora que ha creado el rol de IAM del controlador de CSI de Amazon EBS, puede continuar con la siguiente sección. Cuando implementa el complemento con este rol de IAM, se crea y se configura para utilizar una cuenta de servicio que se llama `ebs-csi-controller-sa`. La cuenta de servicio está vinculada a un `clusterrole` de Kubernetes al que se le asignan los permisos de Kubernetes necesarios.

## Paso 2: obtención del controlador de CSI de Amazon EBS
<a name="managing-ebs-csi"></a>

Le recomendamos que instale el controlador de CSI de Amazon EBS a través del complemento de Amazon EKS para mejorar la seguridad y reducir la cantidad de trabajo. Para agregar un complemento de Amazon EKS al clúster, consulte [Cómo crear un complemento de Amazon EKS](creating-an-add-on.md). Para obtener más información sobre los complementos, consulte [Complementos de Amazon EKS](eks-add-ons.md).

**importante**  
Antes de añadir el controlador de Amazon EBS como complemento de Amazon EKS, confirme que no tiene una versión autoadministrada del controlador instalada en su clúster. Si es así, consulte [Uninstalling a self-managed Amazon EBS CSI driver](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#uninstalling-the-ebs-csi-driver) en GitHub.

**nota**  
De forma predeterminada, el rol de RBAC que utiliza la CSI de EBS tiene permisos para mutar nodos a fin de admitir la característica de eliminación de taints. Debido a las limitaciones de RBAC de Kubernetes, también le permite mutar cualquier otro nodo del clúster. El gráfico de Helm tiene un parámetro (`node.serviceAccount.disableMutation`) que desactiva los permisos de RBAC del nodo mutante para la cuenta de servicio ebs-csi-node. Cuando se activan, las características del controlador, como la eliminación de taints, no funcionarán.

Como alternativa, si desea una instalación autoadministrada del controlador CSI de Amazon EBS, consulte [Installation](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md) en GitHub.

## Paso 3: implementación de una aplicación de muestra
<a name="ebs-sample-app"></a>

Puede implementar una variedad de aplicaciones de muestra y modificarlas según sea necesario. Para obtener más información, consulte [Kubernetes Examples](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes) en GitHub.