Cuando intento usar AWS Load Balancer Controller en Amazon Elastic Kubernetes Service (Amazon EKS), aparece el mensaje de error «WebIdentityErr».
Descripción breve
Cuando usa AWS Load Balancer Controller en Amazon EKS, es posible que aparezca el siguiente error:
«failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403»
El error surge por los siguientes motivos:
- Configuraciones de cuentas de servicio incorrectas
- Relación de confianza incorrecta del rol de AWS Identity and Access Management (IAM) que utiliza en la cuenta de servicio
Cuando utiliza el AWS Load Balancer Controller, los nodos de trabajo realizan las tareas. Debe utilizar los permisos de IAM para conceder a estos nodos de trabajo acceso a los recursos del equilibrador de carga de aplicación o del equilibrador de carga de red. Para configurar los permisos de IAM, utilice los roles de IAM para la cuenta de servicio o bien adjunte los permisos de IAM directamente a los roles de IAM del nodo de trabajo. Para obtener más información, consulte AWS Load Balancer Controller installation en el sitio web de Kubernetes.
Resolución
Configuraciones de cuentas de servicio incorrectas
Para comprobar si configuró correctamente su cuenta de servicio, complete los siguientes pasos:
-
Verifique el nombre de la cuenta de servicio que está definido en su despliegue:
kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
-
Describa la cuenta de servicio:
kubectl describe sa aws-load-balancer-controller -n kube-system
-
Verifique la anotación de la cuenta de servicio para el rol de IAM:
Annotations: eks.amazonaws.com/role-arn:arn:aws:iam::xxxxxxxxxx:role/ AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
-
Si falta la anotación o es incorrecta, actualícela. Asegúrese de haber asociado correctamente el rol de IAM a una cuenta de servicio:
kubectl annotate serviceaccount -n SERVICE_ACCOUNT_NAMESPACE SERVICE_ACCOUNT_NAME \ eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
-
Reinicie el despliegue de AWS Load Balancer Controller para actualizar las credenciales de los pods.
kubectl rollout restart deployment/aws-load-balancer-controller -n kube-system
Relación de confianza incorrecta entre el rol de IAM utilizada y la cuenta de servicio
Al establecer la relación de confianza entre su rol de IAM y su cuenta de servicio, es posible que surjan problemas. Revise los siguientes ejemplos de errores comunes que se producen al establecer la relación de confianza.
El rol o la relación de confianza de IAM no están correctamente definidos para la acción «sts:AssumeRoleWithWebIdentity»
Compruebe que la relación de confianza esté correctamente definida para la acción sts:AssumeRoleWithWebIdentity y no la acción sts:AssumeRole.
El siguiente ejemplo es una relación de confianza que no está definida correctamente:
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "xxxxx.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
Para resolver este problema, defina la relación de confianza para la acción sts:AssumeRoleWithWebIdentity:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC-PROVIDER_ID"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
}
}
}
]
}
**Nota:**Sustituya todas las variables por sus propios valores.
Para usar el mismo rol de IAM para varios clústeres en una cuenta, defina la relación de confianza:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::AWS-ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC-PROVIDER_ID"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
}
}
}
]
}
ID de proveedor de OIDC incorrecto al crear un clúster de Amazon EKS
Cree y verifique un proveedor de OpenID Connect (OIDC) para su clúster de Amazon EKS. Compruebe que el ID del proveedor de OIDC y la región de AWS asociada aparecen correctamente en la lista. De lo contrario, recibirá un error WebIdentityErr.
El nombre de la cuenta de servicio o su espacio de nombres no se han introducido correctamente
Revise el despliegue de AWS Load Balancer Controller. Cuando actualice el despliegue, asegúrese de introducir el nombre correcto de la cuenta de servicio y su espacio de nombres.
Faltan los pasos de «sts.amazonaws.com» de la relación de confianza
Si el rol de servicio asociado a su pod de EKS no puede realizar la operación STS en la acción AssumeRoleWithWebIdentity, actualice la relación de confianza. Para realizar una operación STS, la relación de confianza debe incluir sts.amazonaws.com:
"Condition": {
"StringEquals": {
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_ACCOUNT",
"oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
}
}
Para obtener más información sobre las condiciones de IAM con varias claves o valores, consulte Condiciones con varias claves de contexto o valores.