Quando tento usar o AWS Load Balancer Controller no Amazon Elastic Kubernetes Service (Amazon EKS), recebo uma mensagem de erro "WebIdentityErr".
Breve descrição
Ao usar o AWS Load Balancer Controller no Amazon EKS, você pode ver o seguinte erro:
"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"
O erro ocorre pelos seguintes motivos:
- Configurações de conta de serviço incorretas
- Relacionamento de confiança incorreto da função do AWS Identity and Access Management (IAM) usada na conta de serviço
Quando você usa o AWS Load Balancer Controller, nós de processamento executam as tarefas. Você deve usar permissões do IAM para conceder a esses nós de processamento acesso aos recursos do Application Load Balancer ou do Network Load Balancer. Para configurar as permissões do IAM, use perfis do IAM para a conta de serviço. Ou anexe as permissões do IAM diretamente aos perfis do IAM do nó de processamento. Para obter mais informações, consulte AWS Load Balancer Controller installation, no site do Kubernetes.
Resolução
Configurações de conta de serviço incorretas
Para verificar se você configurou corretamente sua conta de serviço, execute as seguintes etapas:
-
Verifique o nome da conta de serviço definido na sua implantação:
kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
-
Descreva a conta de serviço:
kubectl describe sa aws-load-balancer-controller -n kube-system
-
Verifique a anotação da conta de serviço para o perfil do IAM:
Annotations: eks.amazonaws.com/role-arn:arn:aws:iam::xxxxxxxxxx:role/ AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
-
Se a anotação estiver ausente ou incorreta, atualize-a. Certifique-se de que você tenha associado corretamente o perfil do IAM a uma conta de serviço:
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 a implantação do AWS Load Balancer Controller para atualizar as credenciais dos pods.
kubectl rollout restart deployment/aws-load-balancer-controller -n kube-system
Relação de confiança incorreta entre o perfil do IAM usada e a conta de serviço
Ao estabelecer a relação de confiança entre seu perfil do IAM e sua conta de serviço, você pode encontrar problemas. Analise os exemplos a seguir de erros comuns que ocorrem ao estabelecer a relação de confiança.
O perfil ou a relação de confiança do IAM não está definido corretamente para a ação "sts:AssumeRoleWithWebIdentity"
Verifique se a relação de confiança está definida corretamente para a ação sts:AssumeRoleWithWebIdentity e não para a ação sts:AssumeRole.
O exemplo a seguir é uma relação de confiança que não está definida corretamente:
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "xxxxx.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
Para resolver esse problema, defina a relação de confiança para a ação 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"
}
}
}
]
}
Observação: substitua todas as variáveis pelos seus próprios valores.
Para usar o mesmo perfil do IAM para vários clusters em uma conta, defina a relação de confiança:
{
"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 do provedor OIDC incorreto ao criar um cluster do Amazon EKS
Criar e verificar um provedor OpenID Connect (OIDC) para seu cluster do Amazon EKS. Verifique se o ID do provedor OIDC e a região da AWS associada estão listados corretamente. Caso contrário, você receberá um erro WebIdentityErr.
O nome da conta de serviço ou seu namespace não foi inserido corretamente
Revise a implantação do AWS Load Balancer Controller. Ao atualizar sua implantação, certifique-se de inserir o nome correto da conta de serviço e seu namespace.
Etapas "sts.amazonaws.com" ausentes na relação de confiança
Se o perfil de serviço associado ao seu pod do EKS não puder executar a operação STS na ação AssumeRoleWithWebIdentity, atualize a relação de confiança. Para realizar uma operação do STS, a relação de confiança deve 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 obter mais informações sobre condições do IAM com diversas chaves ou valores, consulte Condições com múltiplas chaves ou valores de contexto.