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

4 minuti di lettura
0

Ricevo il seguente messaggio di errore quando provo a utilizzare il controller AWS Load Balancer in Amazon Elastic Kubernetes Service (Amazon EKS): "impossibile trovare LoadBalancer esistente a causa di WebIdentityErr: impossibile recuperare le credenziali\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403"

Breve descrizione

Questo errore viene visualizzato quando si utilizza il controller AWS Load Balancer in Amazon EKS 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. Puoi configurare le autorizzazioni IAM utilizzando i ruoli IAM per l'account del servizio. In alternativa, puoi collegare le autorizzazioni IAM 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 dell'account di servizio per il ruolo IAM:

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

4.    Se questa annotazione è mancante o non è corretta, aggiornala. 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 IAM utilizzato e l'account del 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.

Per utilizzare lo stesso ruolo IAM per più cluster in un account, definisci una relazione di trust simile alla seguente:

{
 "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-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-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/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

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: il nome dell'account di servizio o il relativo spazio dei nomi non sono stati inseriti correttamente

Assicurati di inserire il nome dell’account di servizio e il relativo spazio dei nomi corretti, 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.


AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa