¿Cómo puedo utilizar el almacenamiento persistente en Amazon EKS?

12 minutos de lectura
0

Quiero utilizar el almacenamiento persistente en Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descripción

Para configurar el almacenamiento persistente en Amazon EKS, utilice una de las siguientes opciones:

Para utilizar una de estas opciones, siga los pasos de una de las siguientes secciones:

  • Opción A: Desplegar y probar el controlador CSI de Amazon EBS
  • Opción B: Desplegar y probar el controlador CSI de Amazon EFS

Los comandos de este artículo requieren la versión 1.14 o superior de kubectl. Para ver su versión de kubectl, ejecute el siguiente comando:

kubectl version --client --short

Nota: Se recomienda asegurarse de instalar la versión más reciente de los controladores. Para obtener más información, consulte los repositorios de GitHub para el controlador CSI de Amazon EBS y el controlador CSI de Amazon EFS.

Solución

Nota: Si se muestran errores al ejecutar los comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), compruebe si está utilizando la versión más reciente de AWS CLI.

Antes de completar los pasos de cualquiera de las secciones, deberá:

  1. Instalar AWS CLI.

  2. Establezca los permisos de AWS Identity and Access Management (IAM) para crear y asociar una política al rol de nodo de trabajo de Amazon EKS CSI Driver Role.
    Nota: Los comandos de las siguientes secciones no siempre utilizan la variable --region. Si no usa --region, los comandos utilizarán el valor predeterminado para su región de AWS. Para comprobar el valor predeterminado, ejecute el comando de configuración de AWS CLI.

  3. Cree su clúster de Amazon EKS y una sus nodos de trabajo al clúster.
    Nota: Ejecute el comando para obtener nodos de kubectl con el fin de comprobar si los nodos de trabajo están asociados al clúster.

  4. Ejecute el siguiente comando para comprobar si su proveedor de OpenID Connect (OIDC) de AWS IAM existe para su clúster:

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

    Nota: Sustituya your_cluster_name por el nombre de su clúster.

  5. Compruebe que su proveedor de OIDC de IAM esté configurado:

    aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID

    Nota: Reemplace el ID del proveedor de OIDC por su ID de OIDC. Si se muestra el error No OpenIDConnect provider found in your account, deberá crear un proveedor de OIDC de IAM.

  6. Instale o actualice eksctl.

  7. Cree un proveedor de OIDC de IAM:

    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

    Nota: Sustituya my-cluster por el nombre de su clúster.

Opción A: Desplegar y probar el controlador CSI de Amazon EBS

Despliegue el controlador CSI de Amazon EBS:

  1. Cree un archivo de política de confianza de IAM similar al del siguiente ejemplo:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/YOUR_OIDC ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    Nota: Sustituya YOUR_AWS_ACCOUNT_ID por el ID de su cuenta. Sustituya YOUR_AWS_REGION por su región. Sustituya su ID de OIDC por el obtenido al crear su proveedor de OIDC de IAM.

  2. Cree un rol de IAM denominado Amazon_EBS_CSI_Driver:

    aws iam create-role \
     --role-name AmazonEKS_EBS_CSI_Driver \
     --assume-role-policy-document file://"trust-policy.json"
  3. Asocie la política de IAM administrada de AWS para el controlador CSI de EBS al rol de IAM que ha creado:

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --role-name AmazonEKS_EBS_CSI_Driver
  4. Despliegue el controlador CSI de Amazon EBS.

    aws eks create-addon \
     --cluster-name my-cluster \
     --addon-name aws-ebs-csi-driver \
     --service-account-role-arn arn:aws:iam::
    YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

    Nota: Sustituya my-cluster por el nombre de su clúster y YOUR_AWS_ACCOUNT_ID por el ID de su cuenta.

    Puede desplegar el controlador CSI de EBS con Kustomize, Helm o un complemento administrado por Amazon EKS. En este ejemplo, se utiliza la característica complementaria de Amazon EKS para desplegar el controlador. Para obtener más información, consulte la guía de instalación del controlador aws-ebs-csi-driver en GitHub.

  5. Compruebe que el controlador CSI de EBS se haya instalado correctamente:

    eksctl get addon --cluster my-cluster | grep ebs

    Si la instalación se realiza correctamente, se obtiene el siguiente resultado:

    aws-ebs-csi-driver    v1.20.0-eksbuild.1    ACTIVE    0    arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_Driver

Pruebe el controlador CSI de Amazon EBS:

Puede probar su controlador CSI de Amazon EBS con una aplicación de ejemplo que utilice el aprovisionamiento dinámico para los pods. El volumen de Amazon EBS se aprovisiona bajo demanda.

  1. Clone el repositorio aws-ebs-csi-driver de AWS GitHub:

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. Cambie su directorio de trabajo a la carpeta que contiene los archivos de prueba del controlador de Amazon EBS:

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. Cree los recursos de Kubernetes necesarios para las pruebas:

    kubectl apply -f manifests/

    Nota: El comando kubectl crea una StorageClass, una PersistentVolumeClaim (PVC) y un pod. El pod hace referencia a la PVC. Un volumen de Amazon EBS solo se aprovisiona cuando se crea el pod. Para obtener más información, consulte Clases de almacenamiento y PersistentVolumeClaims en el sitio web de Kubernetes.

  4. Describa la clase de almacenamiento ebs-sc:

    kubectl describe storageclass ebs-sc
  5. Observe los pods en el espacio de nombres predeterminado y espere a que el estado del pod de la aplicación cambie a En ejecución. Por ejemplo:

    kubectl get pods --watch
  6. Visualice el volumen persistente creado debido al pod que hace referencia a la PVC:

    kubectl get pv
  7. Visualice información sobre el volumen persistente:

    kubectl describe pv your_pv_name

    Nota: Sustituya your_pv_name por el nombre del volumen persistente devuelto en el paso 6 de la sección anterior. El valor de la propiedad Source.VolumeHandle del resultado es el ID del volumen físico de Amazon EBS creado en su cuenta.

  8. Compruebe que el pod esté escribiendo datos en el volumen:

    kubectl exec -it app -- cat /data/out.txt

    Nota: El resultado del comando muestra la fecha y la hora actuales almacenadas en el archivo /data/out.txt. El archivo incluye el día, el mes, la fecha y la hora.

Opción B: Desplegar y probar el controlador CSI de Amazon EFS

Antes de desplegar el controlador CSI, cree un rol de IAM que permita a la cuenta de servicio del controlador de CSI realizar llamadas a las API de AWS en su nombre.

  1. Descargue el documento de la política de IAM de GitHub:

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. Cree una política de IAM:

    aws iam create-policy \
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
        --policy-document file://iam-policy-example.json
  3. Ejecute el siguiente comando para determinar la URL del proveedor de OIDC de su clúster:

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

    Nota: En el paso 3, sustituya your_cluster_name por el nombre de su clúster.

  4. Cree la siguiente política de confianza de IAM y, a continuación, conceda la acción AssumeRoleWithWebIdentity a su cuenta de servicio de Kubernetes:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    Nota: En el paso 4, sustituya YOUR_AWS_ACCOUNT_ID por el ID de su cuenta. Sustituya YOUR_AWS_REGION por su región. Sustituya XXXXXXXXXX45D83924220DC4815XXXXX por el valor devuelto en el paso 3.

  5. Cree un rol de IAM:

    aws iam create-role \
      --role-name AmazonEKS_EFS_CSI_DriverRole \
      --assume-role-policy-document file://"trust-policy.json"
  6. Asocie su nueva política de IAM al rol:

    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
      --role-name AmazonEKS_EFS_CSI_DriverRole
  7. Guarde el siguiente contenido en un archivo denominado efs-service-account.yaml.

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
  8. Cree la cuenta de servicio de Kubernetes en su clúster. La cuenta de servicio de Kubernetes denominada efs-csi-controller-sa está anotada con el rol de IAM que ha creado.

    kubectl apply -f efs-service-account.yaml
  9. Descargue el manifiesto para instalar el controlador mediante las imágenes almacenadas en el registro público de Amazon ECR:

    kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.5" > public-ecr-driver.yaml

    Nota: Puede instalar el controlador CSI de EFS mediante Helm y Kustomize con registro público o privado de AWS. Para obtener más información, consulte la documentación del controlador CSI de Amazon EFS.

    A continuación, edite el archivo public-ecr-driver.yaml para eliminar el manifiesto efs-csi-controller-sa:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system

Despliegue del controlador CSI de Amazon EFS

El controlador CSI de Amazon EFS permite que varios pods escriban en un volumen al mismo tiempo con el modo ReadWriteMany.

  1. Para desplegar el controlador CSI de Amazon EFS, aplique el manifiesto:

    kubectl apply -f public-ecr-driver.yaml
  2. Si su clúster solo contiene pods de AWS Fargate (sin nodos), despliegue el controlador con el siguiente comando (en todas las regiones):

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

Creación de un sistema de archivos de Amazon EFS

  1. Obtenga el ID de VPC para su clúster de Amazon EKS:

    aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text

    Nota: En el paso 3, sustituya your_cluster_name por el nombre de su clúster.

  2. Obtenga el rango CIDR para su clúster de VPC:

    aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text

    Nota: En el paso 4, sustituya YOUR_VPC_ID por el ID de VPC del paso 3 de la sección anterior.

  3. Cree un grupo de seguridad que permita el tráfico entrante del sistema de archivos de red (NFS) para sus puntos de montaje de Amazon EFS:

    aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID

    Nota: Sustituya YOUR_VPC_ID por el resultado del paso 3 de la sección anterior. Guarde GroupId para más adelante.

  4. Añada una regla de entrada de NFS para que los recursos de la VPC puedan comunicarse con el sistema de archivos de Amazon EFS:

    aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR

    Nota: Sustituya YOUR_VPC_CIDR por el resultado del paso 4 de la sección anterior. Sustituya sg-xxx por el ID del grupo de seguridad del paso 5 de la sección anterior.

  5. Cree un sistema de archivos de Amazon EFS para su clúster de Amazon EKS:

    aws efs create-file-system --creation-token eks-efs

    Nota: Guarde FileSystemId para más adelante.

  6. Para crear un destino de montaje para Amazon EFS, ejecute el siguiente comando:

    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx

    Importante: Asegúrese de ejecutar el comando para todas las zonas de disponibilidad con el SubnetID en la zona de disponibilidad en la que se ejecutan los nodos de trabajo. Sustituya FileSystemId por el resultado del paso 7 de la sección anterior (donde creó el sistema de archivos de Amazon EFS). Sustituya sg-xxx por el resultado del paso 5 anterior (en el que creó el grupo de seguridad). Sustituya SubnetID por la subred utilizada por los nodos de trabajo. Para crear destinos de montaje en varias subredes, debe ejecutar el comando del paso 8 por separado para cada ID de subred. Se recomienda crear un destino de montaje en cada zona de disponibilidad en la que se ejecuten los nodos de trabajo.

    Nota: Puede crear destinos de montaje para todas las zonas de disponibilidad en las que se lanzan los nodos de trabajo. A continuación, todas las instancias de Amazon Elastic Compute Cloud (Amazon EC2) de la zona de disponibilidad con el destino de montaje pueden utilizar el sistema de archivos.

El sistema de archivos de Amazon EFS y sus destinos de montaje ya están en ejecución y listos para ser utilizados por los pods del clúster.

Prueba del controlador CSI de Amazon EFS

Puede probar el controlador CSI de Amazon EFS mediante el despliegue de dos pods que escriban en el mismo archivo.

  1. Clone el repositorio aws-efs-csi-driver de AWS GitHub:

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. Cambie su directorio de trabajo a la carpeta que contiene los archivos de prueba del controlador CSI de Amazon EFS:

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. Recupere el ID del sistema de archivos de Amazon EFS que se ha creado anteriormente:

    aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

    Nota: Si el comando del paso 3 devuelve más de un resultado, puede utilizar el ID del sistema de archivos de Amazon EFS que guardó antes.

  4. En el archivo specs/pv.yaml, sustituya el valor spec.csi.volumeHandle por el FileSystemId de Amazon EFS de los pasos anteriores.

  5. Cree los recursos de Kubernetes necesarios para las pruebas:

    kubectl apply -f specs/

    Nota: El comando kubectl del paso 5 anterior crea una clase de almacenamiento de Amazon EFS, una PVC, un volumen persistente y dos pods (app1 y app2).

  6. Genere una lista de los volúmenes persistentes en el espacio de nombres predeterminado y busque un volumen persistente con la solicitud default/efs-claim:

    kubectl get pv efs-pv
  7. Describa el volumen persistente:

    kubectl describe pv efs-pv
  8. Compruebe si los dos pods están escribiendo datos en el archivo:

    kubectl exec -it app1 -- tail /data/out1.txt  
    kubectl exec -it app2 -- tail /data/out1.txt

    Espere aproximadamente un minuto. El resultado muestra la fecha actual escrita en /data/out1.txt por ambos pods.

    Información relacionada

    Troubleshooting Amazon EFS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año