Perché ricevo il messaggio di errore "webidentityerr" quando utilizzo AWS Load Balancer Controller in Amazon EKS?

Ultimo aggiornamento: 08/12/2021

Quando provo a utilizzare AWS Load Balancer Controller in Amazon Elastic Kubernetes Service (Amazon EKS) ricevo il seguente messaggio di errore:

"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"

Come posso risolvere questo errore?

Breve descrizione

Quando utilizzo AWS Load Balancer Controller in Amazon EKS, l'errore WebIdentityErr:failed to retrieve credentials caused by: AccessDenied può verificarsi per i seguenti motivi:

  • Configurazioni errate dell'account di servizio
  • Relazione di trust errata del ruolo AWS Identity and Access Management (IAM) utilizzato nell'account di servizio

Con AWS Load Balancer Controller, i nodi worker eseguono le attività. A questi nodi worker deve essere garantito l'accesso alle risorse AWS Application Load Balancer o AWS Network Load Balancer utilizzando le autorizzazioni IAM. Le autorizzazioni IAM possono essere configurate utilizzando i ruoli IAM per l'account di servizio oppure possono essere collegate direttamente ai ruoli IAM del nodo worker. Per ulteriori informazioni, consulta Installazione di Load Balancer Controller sul sito Web Kubernetes.

Risoluzione

Configurazioni errate dell'account di servizio

Per verificare se le configurazioni dell'account di servizio sono impostate correttamente, procedi come segue:

1.    Verifica il nome dell'account di servizio (SA) definito nell'implementazione:

kubectl describe deploy <aws-load-balancer-controller> -n kube-system | grep -i "Service Account"

2.    Descrivi l'account di servizio:

kubectl describe sa <aws-load-balancer-controller> -n kube-system

3.    Verifica l'annotazione SA per il ruolo IAM:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/<AmazonEKSLoadBalancerControllerRole>

4.    Se questa annotazione è mancante o non è corretta, aggiorna quindi l'annotazione. Assicurati di aver associato correttamente il ruolo IAM a un account di servizio in questo modo:

kubectl annotate serviceaccount -n <SERVICE_ACCOUNT_NAMESPACE> <SERVICE_ACCOUNT_NAME> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

5.    Elimina e ricrea qualsiasi pod Amazon EKS esistente associato all'account di servizio. Assicurati di applicare le variabili di ambiente delle credenziali:

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

Relazione di trust errata tra il ruolo AWS Identity Access Management (IAM) utilizzato e l'account di servizio

Gli esempi seguenti mostrano alcuni errori comuni che possono verificarsi quando si stabilisce la relazione di trust tra il ruolo IAM e l'account di servizio.

Esempio 1: il ruolo IAM o la relazione di trust non sono definiti correttamente per l'operazione "sts:AssumeRoleWithWebIdentity"

Verifica che la relazione di trust sia definita correttamente per l'operazione "sts:AssumeRoleWithWebIdentity" (e non per l'operazione "sts:AssumeRole").

Ecco un esempio di relazione di trust che non è definita correttamente:

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "xxxxx.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

Per correggere la relazione di trust, assicurati di definirla per l'operazione "sts:AssumeRoleWithWebIdentity":

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"        
        }
      }
    }
  ]
}

Nota: assicurati di sostituire tutte le variabili con i tuoi valori.

Esempio 2: ID fornitore OIDC errato durante la creazione di un cluster Amazon EKS

Assicurati di creare e verificare correttamente un fornitore OIDC per il tuo cluster Amazon EKS. Verifica che l'ID del fornitore OIDC e la regione AWS associata siano elencati correttamente. In caso contrario, si riceve un errore WebIdentityErr.

Esempio 3: nome dell'account di servizio (SA) e relativo spazio dei nomi errato durante la configurazione dell'implementazione di AWS Load Balancer Controller

Assicurati di inserire il nome SA e il relativo spazio dei nomi corretto quando aggiorni l'implementazione di AWS Load Balancer Controller.

Esempio 4: passaggi "sts.amazonaws.com" mancanti dalla relazione di trust

Se il ruolo di servizio associato al pod EKS non è in grado di eseguire l'operazione STS sull'azione "AssumeRoleWithWebIdentity", aggiorna la relazione di trust. La relazione di trust deve includere "sts.amazonaws.com" per eseguire un'operazione STS.

Ad esempio:

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

Per ulteriori informazioni sulle condizioni IAM con più chiavi o valori, consulta Creazione di una condizione con più chiavi o valori.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?