Configuración del complemento de CNI de Amazon VPC para utilizar roles de IAM en cuentas de servicio - Amazon EKS

Configuración del complemento de CNI de Amazon VPC para utilizar roles de IAM en cuentas de servicio

El complemento de 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 permisos de IAM, proporcionados por la política administrada de AWS AmazonEKS_CNI_Policy, para realizar llamadas a las API de AWS en su nombre.

  • Crea y está configurado para utilizar una cuenta de servicio, denominada 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

Independientemente de si configura el complemento CNI de VPC a fin de utilizar roles de IAM para cuentas de servicio, los pods también tienen acceso a los permisos asignados al Rol de IAM de nodo de Amazon EKS, a menos que bloquee el acceso a IMDS. Para obtener más información, consulte Restringir el acceso a las credenciales de perfil de instancia de Amazon EC2 y IMDS.

Puede utilizar eksctl o la AWS Management Console para crear el rol de IAM del complemento de CNI.

eksctl
  1. Cree un rol de IAM y adjunte la política de IAM administrada AmazonEKS_CNI_Policy con el siguiente comando. Reemplace <cluster_name> (incluido <>) con su propio valor. Si aún no existe, este comando crea un proveedor de OIDC de IAM para el clúster. A continuación, implementa una pila de AWS CloudFormation que crea un rol de IAM, adjunta la política administrada AmazonEKS_CNI_Policy de AWS y anota la cuenta de servicio aws-node existente con el ARN del rol de IAM.

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster <cluster_name> \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. Describa uno de los pods y verifique que existen las variables de entorno AWS_WEB_IDENTITY_TOKEN_FILE y AWS_ROLE_ARN.

    kubectl exec -n kube-system aws-node-<9rgzw> env | grep AWS

    Salida:

    AWS_VPC_K8S_CNI_LOGLEVEL=DEBUG AWS_ROLE_ARN=arn:aws:iam::<111122223333>:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-<V66K5I6JLDGK> AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS Management Console

Prerequisite

Debe contar con un proveedor de OIDC de IAM existente para el clúster. Para determinar si ya tiene uno o debe crearlo, consulte Crear un proveedor de OIDC de IAM para su clúster.

Para crear su rol de IAM del complemento CNI con la AWS Management Console

  1. En el panel de navegación, elija Roles, Create role (Crear rol).

  2. En la sección Select type of trusted entity (Seleccionar tipo de entidad de confianza), seleccione Web identity(Identidad web).

  3. En la sección Choose a web identity provider (Elegir proveedor de identidad web):

    1. En Identity provider (Proveedor de identidad), elija la URL de su clúster.

    2. En Audience (Audiencia), elija sts.amazonaws.com.

  4. Elija Next: Permissions.

  5. En la sección Attach Policy (Asociar política), seleccione la política AmazonEKS_CNI_Policy que desea utilizar para su cuenta de servicio.

  6. Elija Next: Tags (Siguiente: Etiquetas).

  7. En la pantalla Add tags (optional) [Agregar etiquetas (opcional)], puede agregar etiquetas para la cuenta. Elija Next: Review (Siguiente: Revisión).

  8. En Role name (Nombre de rol), ingrese un nombre para su rol, como AmazonEKSCNIRole y, a continuación, elija Create role (Crear rol).

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

  10. Elija la pestaña Trust relationships (Relaciones de confianza) y, a continuación, Edit trust relationship (Editar relación de confianza).

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

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    Cambie la línea para que tenga el siguiente aspecto. Reemplace <EXAMPLED539D4633E53DE1B716D3041E> (incluido <>) con el ID de proveedor de OIDC de su clúster y reemplace <region-code> por el código de región en el que se encuentra el clúster.

    "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:kube-system:aws-node"
  12. Seleccione Update Trust Policy (Actualizar política de confianza) para terminar.

Para anotar la cuenta de servicio de aws-node Kubernetes con el rol de IAM

  1. Si utiliza el complemento de Amazon EKS con un clúster de Amazon EKS 1.18 o posterior, consulte Actualizar el complemento CNI de Amazon VPC de Amazon EKS, en lugar de completar este procedimiento. Si no utiliza el complemento de Amazon EKS CNI de Amazon VPC, utilice el siguiente comando para anotar la cuenta de servicio aws-node con el ARN del rol de IAM que creó anteriormente. Asegúrese de sustituir sus propios valores por los <example values> para utilizarlos con sus pods.

    kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AmazonEKSCNIRole>
  2. Elimine y vuelva a crear todos los pods existentes asociados a la cuenta de servicio para aplicar las variables de entorno de credenciales. El enlace web que muta no se aplica a los pods que ya se están ejecutando. 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
  3. Confirme que todos los pods se reiniciaron.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  4. Describa uno de los pods y verifique que existen las variables de entorno AWS_WEB_IDENTITY_TOKEN_FILE y AWS_ROLE_ARN.

    kubectl exec -n kube-system aws-node-<9rgzw> env | grep AWS

    Salida:

Eliminar la política de CNI del rol de IAM del nodo

Si actualmente su Rol de IAM de nodo de Amazon EKS tiene asociada la política de IAM de AmazonEKS_CNI_Policy, y ha creado un rol de IAM independiente, le ha adjuntado la política y la ha asignado a la cuenta de servicio de aws-node Kubernetes, recomendamos que elimine la política de su rol de nodo.

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

  2. En el panel de navegación izquierdo, elija Roles, y, a continuación, busque el rol de instancia de nodo.

  3. Elija la pestaña Permissions (Permisos) del rol de instancia de nodo y, a continuación, elija la X que se encuentra a la derecha de la AmazonEKS_CNI_Policy.

  4. Elija Detach para terminar.