¿Cómo puedo solucionar los problemas de un proveedor de OIDC e IRSA en Amazon EKS?
Mis pods no pueden usar los permisos del rol de AWS Identity and Access Management (IAM) con el token de cuenta de Amazon Elastic Kubernetes Service (Amazon EKS).
Resolución
Cómo comprobar si ya tiene un proveedor OIDC de IAM para su clúster
Si ya existe un proveedor, se mostrará un error similar al siguiente: «WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400».
Para comprobar si ya tiene un proveedor de OIDC de IAM, siga estos pasos:
-
Compruebe la URL del proveedor de OIDC de su clúster:
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
Resultado del ejemplo:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
-
Enumere los proveedores de OIDC de IAM de su cuenta. Sustituya EXAMPLED539D4633E53DE1B716D3041E por el valor que haya obtenido del comando anterior:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
Resultado del ejemplo:
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
Si el comando devuelve un resultado, significa que ya tiene un proveedor para su clúster. Si el comando no devuelve ningún resultado, debe crear un proveedor de OIDC de IAM.
Cómo comprobar si su rol de IAM tiene los permisos necesarios y una política de IAM adjunta
Nota: Si se muestran errores al ejecutar comandos de la interfaz de la línea de comandos de AWS (AWS CLI), consulte Troubleshoot AWS CLI errors. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.
Para comprobar que su rol de IAM tenga los permisos necesarios, siga estos pasos:
- Abra la consola de IAM.
- En el panel de navegación, elija Roles.
- Seleccione el rol que desee verificar.
- En la pestaña Permisos, compruebe que la política necesaria esté asociada al rol.
- Verifique que las relaciones de confianza de los roles de IAM estén configuradas correctamente.
Para comprobar que su rol de IAM tenga una política adjunta, siga estos pasos:
-
Abra la consola de IAM.
-
En el panel de navegación, elija Roles.
-
Seleccione el rol que desee comprobar.
-
Seleccione la pestaña Relaciones de confianza. Verifique que el formato de su política coincida con el formato de la siguiente política JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
Para verificar las relaciones de confianza, ejecute el comando get-role en la interfaz de la línea de comandos de AWS (AWS CLI):
$ aws iam get-role --role-name EKS-IRSA
Nota: Sustituya EKS-IRSA por el nombre de su rol de IAM.
En el JSON de salida, busque la sección AssumeRolePolicyDocument.
Resultado del ejemplo:{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } }
Nota: En función de su caso de uso, actualice la región de AWS, el nombre de la cuenta de servicio de Kubernetes y el espacio de nombres de Kubernetes.
Cómo comprobar si ha creado una cuenta de servicio
Ejecute el siguiente comando:
$ kubectl get sa -n YOUR_NAMESPACE
Nota: Sustituya YOUR_NAMESPACE por su espacio de nombres de Kubernetes.
Resultado del ejemplo:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
Si no tiene una cuenta de servicio, consulte Configure Service Accounts for Pods en el sitio web de Kubernetes.
Cómo verificar si la cuenta de servicio tiene las anotaciones de rol de IAM correctas
Para comprobar que su cuenta de servicio tenga las anotaciones de rol de IAM correctas, ejecute el siguiente comando:
$ kubectl describe sa irsa -n YOUR_NAMESPACE
Nota: Sustituya irsa por el nombre de su cuenta de servicio de Kubernetes y YOUR_NAMESPACE por su espacio de nombres de Kubernetes.
Resultado del ejemplo:
Name: irsaNamespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
Cómo verificar si ha especificado correctamente serviceAccountName en su pod
Para verificar el serviceAccountName, ejecute el siguiente comando:
$ kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
Nota: Sustituya POD_NAME y YOUR_NAMESPACE por su pod y espacio de nombres de Kubernetes.
Resultado del ejemplo:
serviceAccountName: irsa
Comprobación de las variables de entorno y los permisos
Busque AWS_ROLE_ARN y AWS_WEB_IDENTITY_TOKEN_FILE en las variables de entorno del pod:
$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
Resultado del ejemplo:
AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
Cómo verificar si la aplicación utiliza un SDK de AWS compatible
La versión del SDK debe ser superior o igual a los siguientes valores:
Java (Version 2) — 2.10.11Java — 1.11.704 Go — 1.23.13 Python (Boto3) — 1.9.220 Python (botocore) — 1.12.200 AWS CLI — 1.16.232 Node — 3.15.0 Ruby — 2.11.345 C++ — 1.7.174 .NET — 3.3.659.1 PHP — 3.110.7
Para comprobar la última versión del SDK compatible, consulte Uso de un SDK de AWS compatible.
Cómo volver a crear pods
Si creó pods antes de aplicar IRSA, ejecute el siguiente comando para volver a crear los pods:
$ kubectl rollout restart deploy nginx
Resultado del ejemplo:
deployment.apps/nginx restarted
Para los despliegues de daemonsets o satefulsets, ejecute el siguiente comando:
$ kubectl rollout restart deploy DEPLOYMENT_NAME
Si solo ha creado un pod, debe eliminarlo y volver a crearlo:
- Para eliminar el pod, ejecute el siguiente comando:
Nota: Sustituya POD_NAME por el nombre de su pod.$ kubectl delete pod POD_NAME
- Ejecute el siguiente comando para volver a crear el pod:
Nota: Sustituya SPEC_FILE por la ruta y el nombre del archivo de manifiesto de Kubernetes.$ kubectl apply -f SPEC_FILE
Cómo verificar si la audiencia es correcta
Si ha creado el proveedor de OIDC con la audiencia incorrecta, se mostrará el siguiente error: «Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience».
Compruebe el proveedor de identidad de IAM de su clúster. Su ClientIDList es sts.amazonaws.com:
$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
Resultado del ejemplo:
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
Cómo verificar si ha configurado la huella digital correcta
Si la huella digital configurada en el OIDC de IAM no es correcta, se mostrará el siguiente error: «failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint».
Para configurar automáticamente la huella digital correcta, utilice eksctl o la Consola de administración de AWS para crear el proveedor de identidad de IAM. Para ver otras formas de obtener una huella digital, consulte Obtención de la huella digital de un proveedor de identidades OpenID Connect.
Región de AWS de China: comprobación de la variable de entorno AWS_DEFAULT_REGION
En el caso de un pod o daemonset aplicado por IRSA que esté desplegado en un clúster de la región de AWS de China, defina la variable de entorno AWS_DEFAULT_REGION en la especificación del pod. Si no configura esta variable, es posible que el pod o el daemonset muestren el siguiente error:«An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid».
Para agregar la variable de entorno AWS_DEFAULT_REGION a la especificación del pod o daemonset, ejecute un comando similar al del siguiente ejemplo:
apiVersion: apps/v1kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
Vídeos relacionados
Contenido relevante
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 10 meses
- OFICIAL DE AWSActualizada hace 9 meses
- OFICIAL DE AWSActualizada hace 2 años