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.
Asignación de roles de IAM a cuentas de servicio de Kubernetes
En este tema, se explica cómo configurar una cuenta de servicio de Kubernetes para asumir un rol de AWS Identity and Access Management (IAM). Los pods que estén configurados para usar la cuenta de servicio pueden acceder a cualquier servicio de AWS al que el rol tenga permisos para acceder.
Requisitos previos
-
Un clúster existente. Si no tiene uno, puede crearlo mediante una de las siguientes guías de Introducción a Amazon EKS.
-
Cree un proveedor de OpenID Connect (OIDC) de IAM para su clúster. Para saber si ya tiene un proveedor o cómo crear uno, consulte Crear un proveedor de OIDC de IAM para su clúster.
-
La versión
2.12.3
o posterior, o bien, la versión1.27.160
o posterior de la AWS interfaz de la línea de comandos (AWS CLI) instalada y configurada en su dispositivo o AWS CloudShell. Para comprobar su versión actual, utiliceaws --version | cut -d / -f2 | cut -d ' ' -f1
. Los administradores de paquetes, comoyum
,apt-get
o Homebrew para macOS, suelen estar atrasados varias versiones respecto de la versión de la AWS CLI más reciente. Para instalar la versión más reciente, consulte Instalación y Configuración rápida con aws configure en la Guía del usuario de la interfaz de la línea de comandos de AWS. La versión de AWS CLI instalada en AWS CloudShell también puede estar atrasada varias versiones respecto de la versión más reciente. Para actualizarla, consulte Instalación de la CLI de AWS en su directorio principal en la Guía del usuario de AWS CloudShell. -
La herramienta de línea de comandos de
kubectl
está instalada en su dispositivo o AWS CloudShell. La versión puede ser la misma o hasta una versión secundaria anterior o posterior a la versión de Kubernetes de su clúster. Por ejemplo, si la versión del clúster es1.29
, puede usar la versión1.28
,1.29
o1.30
dekubectl
con él. Para instalar o actualizarkubectl
, consulte Configuración de kubectl y eksctl. -
Un archivo
config
dekubectl
existente que contenga la configuración del clúster. Para crear un archivoconfig
dekubectl
, consulte Conexión de kubectl a un clúster de EKS mediante la creación de un archivo kubeconfig.
Paso 1: creación de una política de IAM
Si desea asociar una política de IAM existente a su rol de IAM, vaya al siguiente paso.
-
Cree una política de IAM. Puede crear su propia política o copiar una política administrada de AWS que ya conceda algunos de los permisos que necesita y personalizarla según sus requisitos específicos. Para obtener más información, consulte Creación de políticas de IAM en la Guía del usuario de IAM.
-
Cree un archivo que incluya los permisos para los servicios de AWS a los que quiere que accedan sus pods. Para obtener una lista de todas las acciones para todos los servicios de AWS, consulte la Referencia de autorizaciones de servicio.
Puede ejecutar el siguiente comando para crear un archivo de política de ejemplo que permita el acceso de solo lectura a un bucket de Amazon S3. Opcionalmente, puede almacenar información de configuración o un script de arranque en este bucket, y los contenedores de su pod pueden leer el archivo desde el bucket y cargarlo en su aplicación. Si desea crear esta política de ejemplo, copie el siguiente contenido en su dispositivo. Sustituya
my-pod-secrets-bucket
por el nombre de su bucket y ejecute el comando.cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
-
Creación de la política de IAM.
aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
Paso 2: creación y asociación de un rol de IAM
Cree un rol de IAM y asócielo a una cuenta de servicio de Kubernetes. Puede utilizar eksctl
o la AWS CLI.
Crear y asociar un rol (eksctl)
La versión 0.204.0
o posterior de la herramienta de línea de comandos de eksctl
instalada en su dispositivo o AWS CloudShell. Para instalar o actualizar eksctl
, consulte la sección de Instalacióneksctl
.
Reemplace my-service-account
por el nombre de la cuenta de servicio de Kubernetes que desea que eksctl
cree y asóciela con un rol de IAM. Reemplace default
por el espacio de nombres en el que desea que eksctl
cree la cuenta de servicio. Reemplace my-cluster
por el nombre de su clúster. Reemplace my-role
por el nombre del rol al que desea asociar la cuenta de servicio. Si no existe, eksctl
lo creará en su lugar. Reemplace 111122223333
por el ID de su cuenta y my-policy
por el nombre de una política existente.
eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
importante
Si el rol o la cuenta de servicio ya existen, podría producirse un error al ejecutar el comando anterior. eksctl
tiene diferentes opciones que puede proporcionar en esas situaciones. Para obtener más información, ejecute eksctl create iamserviceaccount --help
.
Crear y asociar un rol (AWS CLI)
Si tiene una cuenta de servicio de Kubernetes existente que desea que asuma un rol de IAM, puede omitir este paso.
-
Cree una cuenta de servicio de Kubernetes. Copie los siguientes contenidos en su dispositivo. Reemplace
my-service-account
por el nombre que desee ydefault
por un espacio de nombres diferente, si es necesario. Si cambiadefault
, el espacio de nombres debe existir previamente.cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
-
Establezca su ID de cuenta de AWS en una variable de entorno con el siguiente comando.
account_id=$(aws sts get-caller-identity --query "Account" --output text)
-
Establezca el proveedor de identidades de OIDC en una variable de entorno con el siguiente comando. Reemplace
my-cluster
por el nombre de su clúster.oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
-
Establezca variables para el espacio de nombres y el nombre de la cuenta de servicio. Reemplace
my-service-account
por la cuenta de servicio de Kubernetes que desea que asuma el rol. Reemplacedefault
por el espacio de nombres de la cuenta de servicio.export namespace=default export service_account=my-service-account
-
Ejecute el siguiente comando para crear un archivo de política de confianza para el rol de IAM. Si quiere permitir que todas las cuentas de servicio de un espacio de nombres utilicen el rol, copie el siguiente contenido en su dispositivo. Reemplace
StringEquals
porStringLike
y reemplace$service_account
por*
. Puede agregar varias entradas en las condicionesStringEquals
yStringLike
para permitir que varias cuentas de servicio o espacios de nombres asuman el rol. Para permitir que los roles de una cuenta de AWS diferente a la de su clúster asuman el rol, consulte Autenticación en otra cuenta mediante IRSA para obtener más información.cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
-
Creación del rol. Reemplace
my-role
con un nombre para el rol de IAM, ymy-role-description
con una descripción de su rol.aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
-
Adjunte la política de IAM al rol. Reemplace
my-role
por el nombre de su rol de IAM ymy-policy
por el nombre de una política existente que haya creado.aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
-
Anote su cuenta de servicio con el nombre de recurso de Amazon (ARN) del rol de IAM que desea que asuma la cuenta de servicio. Reemplace
my-role
por el nombre de su rol de IAM existente. Supongamos que permitió que un rol de una cuenta de AWS diferente a la de su clúster asumiera el rol en un paso anterior. A continuación, asegúrese de especificar la cuenta de AWS y el rol de la otra cuenta. Para obtener más información, consulte Autenticación en otra cuenta mediante IRSA.kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
-
(Opcional) Configure el punto de conexión de AWS Security Token Service para una cuenta de servicio. AWS recomienda el uso de un punto de conexión regional de AWS STS en lugar del punto de conexión global. Esto reduce la latencia, proporciona redundancia integrada y aumenta la validez de los tokens de sesión.
Paso 3: confirmación de la configuración
-
Confirme que la política de confianza del rol de IAM se haya configurado correctamente.
aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
Un ejemplo de salida sería el siguiente.
{ "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:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
-
Confirme que la política que adjuntó a su rol en un paso anterior se encuentre adjunta al rol.
aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text
Un ejemplo de salida sería el siguiente.
arn:aws:iam::111122223333:policy/my-policy
-
Establezca una variable para almacenar el nombre de recurso de Amazon (ARN) de la política que quiera utilizar. Reemplace
my-policy
por el nombre de la política para la que desea confirmar los permisos.export policy_arn=arn:aws:iam::111122223333:policy/my-policy
-
Vea la versión predeterminada de la política.
aws iam get-policy --policy-arn $policy_arn
Un ejemplo de salida sería el siguiente.
{ "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
-
Vea el contenido de la política para asegurarse de que incluye todos los permisos que su pod necesita. Si es necesario, reemplace
1
en el siguiente comando por la versión devuelta en la salida anterior.aws iam get-policy-version --policy-arn $policy_arn --version-id v1
Un ejemplo de salida sería el siguiente.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }
Si creó la política de ejemplo en un paso anterior, el resultado es el mismo. Si creó una política diferente, el contenido de
example
es diferente. -
Confirme que la cuenta de servicio de Kubernetes se anota con el rol.
kubectl describe serviceaccount my-service-account -n default
Un ejemplo de salida sería el siguiente.
Name: my-service-account Namespace: default Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role Image pull secrets: <none> Mountable secrets: my-service-account-token-qqjfl Tokens: my-service-account-token-qqjfl [...]