

 **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.

# Configuración del complemento de CNI de Amazon VPC para utilizar IRSA
<a name="cni-iam-role"></a>

El [complemento CNI de Amazon VPC para Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) es el complemento de red para redes de pod en clústeres de Amazon EKS. El complemento se encarga de asignar direcciones IP de la VPC a los pods de Kubernetes y establecer la configuración de red necesaria para los pods de cada nodo.

**nota**  
El complemento CNI de Amazon VPC también es compatible con Amazon EKS Pod Identities. Para obtener más información, consulte [Asignación de un rol de IAM a una cuenta de servicio de Kubernetes](pod-id-association.md).

El complemento:
+ Requiere los permisos de AWS Identity and Access Management (IAM). Si el clúster utiliza la familia `IPv4`, los permisos se especifican en la política administrada de AWS [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html). Si el clúster utiliza la familia `IPv6`, se deben agregar los permisos a una política de IAM que crea. Para obtener instrucciones, consulte [Cree una política de IAM para clústeres que utilizan la familia `IPv6`](#cni-iam-role-create-ipv6-policy). Puede asociar la política al rol de IAM del nodo de Amazon EKS o a un rol de IAM independiente. Para obtener instrucciones sobre cómo asociar la política al rol de IAM del nodo de Amazon EKS, consulte [Rol de IAM de nodo de Amazon EKS](create-node-role.md). Le recomendamos que lo adjunte a un rol independiente, tal y como se detalla en este tema.
+ Crea y está configurado para utilizar una cuenta de servicio de Kubernetes con el nombre `aws-node` cuando se implementa. La cuenta de servicio está vinculada a un `clusterrole` de Kubernetes denominado `aws-node`, al que se le asignan los permisos de Kubernetes necesarios.

**nota**  
Los pods correspondientes al complemento CNI de Amazon VPC para Kubernetes tienen acceso a los permisos asignados al [rol de IAM del nodo de Amazon EKS](create-node-role.md), a menos que se bloquee el acceso a IMDS. Para obtener más información, consulte [Restringir el acceso al perfil de instancias asignado al nodo de trabajo](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node).
+ Requiere un clúster existente de Amazon EKS. Para implementar uno, consulte [Introducción a Amazon EKS](getting-started.md).
+ Requiere un proveedor existente de OpenID Connect (OIDC) de AWS Identity and Access Management (IAM) para su clúster. Para determinar si ya tiene un proveedor o para crear uno, consulte [Crear un proveedor de OIDC de IAM para su clúster](enable-iam-roles-for-service-accounts.md).

## Paso 1: creación del rol de IAM del complemento CNI de Amazon VPC para Kubernetes
<a name="cni-iam-role-create-role"></a>

1. Determine la familia de IP del clúster.

   ```
   aws eks describe-cluster --name my-cluster | grep ipFamily
   ```

   Un ejemplo de salida sería el siguiente.

   ```
   "ipFamily": "ipv4"
   ```

   La salida puede devolver `ipv6` en cambio.

1. Creación del rol de IAM. Puede utilizar `eksctl` o `kubectl` y la AWS CLI para crear el rol de IAM.  
eksctl  
   + Cree un rol de IAM y adjunte la política de IAM al rol con el comando que coincida con la familia IP del clúster. Este comando crea e implementa una pila de AWS CloudFormation que crea un rol de IAM, adjunta la política que especifica para el rol y anota la cuenta de servicio de Kubernetes de `aws-node` existente con el ARN del rol de IAM que se crea.
     +  `IPv4` 

       Reemplace *my-cluster* con su propio valor.

       ```
       eksctl create iamserviceaccount \
           --name aws-node \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKSVPCCNIRole \
           --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
           --override-existing-serviceaccounts \
           --approve
       ```
     +  `IPv6` 

       Reemplace *my-cluster* con su propio valor. Reemplace *111122223333* con su ID de cuenta y reemplace *Amazoneks\$1CNI\$1IPv6\$1Policy* con el nombre de su política `IPv6`. Si no dispone de una política `IPv6`, consulte [Cree una política de IAM para clústeres que utilizan la familia `IPv6`](#cni-iam-role-create-ipv6-policy) para crear uno. Para utilizar `IPv6` con su clúster, debe cumplir varios requisitos. Para obtener más información, consulte [Información sobre la asignación de direcciones IPv6 a clústeres, pods y servicios](cni-ipv6.md).

       ```
       eksctl create iamserviceaccount \
           --name aws-node \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKSVPCCNIRole \
           --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
           --override-existing-serviceaccounts \
           --approve
       ```  
kubectl y la AWS CLI  

   1. Visualización de la URL del proveedor de OIDC de su clúster.

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

      Si no se devuelve ninguna salida, debe [crear un proveedor de OIDC de IAM para el clúster](enable-iam-roles-for-service-accounts.md).

   1. Copie el siguiente contenido en un archivo con el nombre *vpc-cni-trust-policy.json*. Reemplace *111122223333* con su ID de cuenta y *EXAMPLED539D4633E53DE1B71EXAMPLE* con el resultado que obtuvo en el paso anterior. Reemplace *region-code* por la región de AWS en la que se encuentra el clúster.

      ```
      {
          "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:aws-node"
                      }
                  }
              }
          ]
      }
      ```

   1. Creación del rol. Puede reemplazar *AmazonEKSVPCCNIRole* por el nombre que elija.

      ```
      aws iam create-role \
        --role-name AmazonEKSVPCCNIRole \
        --assume-role-policy-document file://"vpc-cni-trust-policy.json"
      ```

   1. Adjunte la política de IAM necesaria al rol de IAM Ejecute el comando que coincida con la familia IP del clúster.
      +  `IPv4` 

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```
      +  `IPv6` 

        Reemplace *111122223333* con su ID de cuenta y *Amazoneks\$1CNI\$1IPv6\$1Policy* con el nombre de su política `IPv6`. Si no dispone de una política `IPv6`, consulte [Cree una política de IAM para clústeres que utilizan la familia `IPv6`](#cni-iam-role-create-ipv6-policy) para crear uno. Para utilizar `IPv6` con su clúster, debe cumplir varios requisitos. Para obtener más información, consulte [Información sobre la asignación de direcciones IPv6 a clústeres, pods y servicios](cni-ipv6.md).

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```

   1. Ejecute el siguiente comando para anotar la cuenta de servicio del `aws-node` con el ARN del rol de IAM que creó anteriormente. Sustituya los valores de ejemplo por sus propios valores.

      ```
      kubectl annotate serviceaccount \
          -n kube-system aws-node \
          eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
      ```

1. (Opcional) Configure el tipo de punto de conexión de AWS Security Token Service que utiliza su cuenta de servicio de Kubernetes. Para obtener más información, consulte [Configure el punto de conexión AWS Security Token Service de una cuenta de servicio](configure-sts-endpoint.md).

## Paso 2: nueva implementación de pods del complemento CNI de Amazon VPC para Kubernetes
<a name="cni-iam-role-redeploy-pods"></a>

1. Elimine y vuelva a crear todos los pods existentes asociados a la cuenta de servicio para aplicar las variables de entorno de credenciales. La anotación no se aplica a los pods que se están ejecutando actualmente sin la anotación. El siguiente comando elimina los pods de DaemonSet de `aws-node` existentes y los implementa con la anotación de cuenta de servicio.

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. Confirme que todos los pods se reiniciaron.

   ```
   kubectl get pods -n kube-system -l k8s-app=aws-node
   ```

1. Describa uno de los pods y verifique que existan las variables de entorno `AWS_WEB_IDENTITY_TOKEN_FILE` y `AWS_ROLE_ARN`. Reemplace *cpjw7* por el nombre de uno de los pods que obtuvo en la salida del paso anterior.

   ```
   kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'
   ```

   Un ejemplo de salida sería el siguiente.

   ```
   AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
         AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
         AWS_ROLE_ARN:                           arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
         AWS_WEB_IDENTITY_TOKEN_FILE:            /var/run/secrets/eks.amazonaws.com/serviceaccount/token
   ```

   Se devuelven dos conjuntos de resultados duplicados porque el pod contiene dos contenedores. Ambos contenedores tienen los mismos valores.

   Si su pod está utilizando el punto de conexión regional de AWS, la siguiente línea también se devuelve en la salida anterior.

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```

## Paso 3: Eliminar la política de CNI del rol de IAM del nodo
<a name="remove-cni-policy-node-iam-role"></a>

Si actualmente el [rol de IAM del nodo de Amazon EKS](create-node-role.md) tiene asociada la política `AmazonEKS_CNI_Policy` de IAM (`IPv4`) o una [política IPv6](#cni-iam-role-create-ipv6-policy), y ha creado un rol de IAM independiente, le ha adjuntado la política y lo ha asignado a la cuenta de servicio de Kubernetes de `aws-node`, le recomendamos eliminar la política del rol del nodo con el comando de la AWS CLI que coincida con la familia de IP del clúster. Reemplace *AmazonEKSNodeRole* con el nombre del rol de nodo.
+  `IPv4` 

  ```
  aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  ```
+  `IPv6` 

  Reemplace *111122223333* con su ID de cuenta y *Amazoneks\$1CNI\$1IPv6\$1Policy* con el nombre de su política `IPv6`.

  ```
  aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy
  ```

## Cree una política de IAM para clústeres que utilizan la familia `IPv6`
<a name="cni-iam-role-create-ipv6-policy"></a>

Si creó un clúster que utiliza la familia `IPv6` y el clúster tiene configurada la versión `1.10.1` o posterior del complemento CNI de Amazon VPC para Kubernetes, debe crear una política de IAM que pueda asignar a un rol de IAM en un paso posterior. Si tiene un clúster existente que no configuró con la familia `IPv6` cuando lo creó, deberá crear un clúster nuevo para poder utilizar `IPv6`. Para obtener más información acerca del uso de `IPv6` con su clúster, consulte [Información sobre la asignación de direcciones IPv6 a clústeres, pods y servicios](cni-ipv6.md).

1. Copie el siguiente texto y guárdelo en un archivo llamado `vpc-cni-ipv6-policy.json`.

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:AssignIpv6Addresses",
                   "ec2:DescribeInstances",
                   "ec2:DescribeTags",
                   "ec2:DescribeNetworkInterfaces",
                   "ec2:DescribeInstanceTypes"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateTags"
               ],
               "Resource": [
                   "arn:aws:ec2:*:*:network-interface/*"
               ]
           }
       ]
   }
   ```

1. Cree la política de IAM.

   ```
   aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
   ```