Configuración del complemento de CNI de Amazon VPC para utilizar IRSA - Amazon EKS

Configuración del complemento de CNI de Amazon VPC para utilizar IRSA

El Complemento CNI de Amazon VPC para Kubernetes 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 nodos de Kubernetes y establecer la configuración de red necesaria para los Pods de cada nodo. 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 AmazonEKS_CNI_Policy de AWS. Si el clúster utiliza la familia IPv6, los permisos se deben añadir a la política de IAM que cree; para obtener instrucciones, consulte Cree una política de IAM para clústeres que utilizan la familia IPv6. 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. 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 Kubernetes clusterrole denominado aws-node, al que se le asignan los permisos de Kubernetes necesarios.

nota

Los Pods correspondientes al Amazon VPC CNI plugin for Kubernetes tienen acceso a los permisos asignados al Rol de IAM de nodo de Amazon EKSrol de IAM del nodo de Amazon EKS, 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.

Paso 1: Crear el rol de IAM Amazon VPC CNI plugin for Kubernetes

  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.

  2. Cree el 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 aws-node[.noloc]`Kubernetes 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_CNI_IPv6_Policy 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 para crear uno. Para utilizar IPv6 con su clúster, debe cumplir varios requisitos. Para obtener más información, consulte Obtenga información sobre la asignación de direcciones IPv6 a clústeres, pods y servicios.

        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. Vea 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 Creación de un proveedor de OIDC de IAM para su clústercrear un proveedor de OIDC de IAM para el clúster.

    2. 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.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. Cree el 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"
    4. Adjunte la política de IAM necesaria al rol de IAM Ejecute el comando que coincida con la familia IP del clúster.

    5. 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
  3. (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.

Paso 2: Nueva implementación de Amazon VPC CNI plugin for KubernetesPods

  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 Pods que se están ejecutando actualmente sin la anotación. El siguiente comando elimina los aws-node[.noloc]`DaemonSet[.noloc]Pods existentes y los implementa con la anotación de cuenta de servicio.

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. Confirme que todos los Pods se reiniciaron.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. Describa uno de los Pods y verifique que existen 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, entonces 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

Si actualmente su Rol de IAM de nodo de Amazon EKSrol de IAM del nodo de Amazon EKS tiene adjunta la política AmazonEKS_CNI_Policy de IAM (IPv4) o una política Cree una política de IAM para clústeres que utilizan la familia IPv6IPv6, y ha creado un rol de IAM independiente, le ha adjuntado la política y lo ha asignado a la cuenta de servicio de aws-node[.noloc]`Kubernetes, se recomienda eliminar la política del rol del nodo con el comando de la AWS CLI que coincida con la familia de IP de su 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_CNI_IPv6_Policy 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

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 Amazon VPC CNI plugin for 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 Obtenga información sobre la asignación de direcciones IPv6 a clústeres, pods y servicios.

  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/*" ] } ] }
  2. Cree la política de IAM.

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