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

4 minuti di lettura
0

Quando provo a utilizzare AWS Load Balancer Controller in Amazon Elastic Kubernetes Service (Amazon EKS), ricevo il messaggio di errore "WebIdentityErr".

Breve descrizione

Quando usi AWS Load Balancer Controller in Amazon EKS, potresti visualizzare il seguente 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"

Questo errore si verifica 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

Quando usi AWS Load Balancer Controller, i nodi worker eseguono le attività. È necessario utilizzare le autorizzazioni IAM per concedere a questi nodi worker accesso alle risorse di Application Load Balancer o Network Load Balancer. Per configurare le autorizzazioni IAM, usa i ruoli IAM per l'account di servizio. In alternativa, collega le autorizzazioni IAM direttamente ai ruoli IAM del nodo worker. Per ulteriori informazioni, consulta la sezione AWS Load Balancer Controller installation sul sito Web di Kubernetes.

Risoluzione

Configurazioni errate dell'account di servizio

Per verificare se hai configurato correttamente l’account di servizio, completa i seguenti passaggi:

  1. Verifica il nome dell'account di servizio definito nella tua implementazione:

    kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
  2. Descrivi l'account del 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/ AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
  4. Se l'annotazione manca o è errata, aggiorna l'annotazione. Assicurati di avere associato correttamente il ruolo IAM a un account di servizio:

    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. Riavvia l’implementazione di AWS Load Balancer Controller per aggiornare le credenziali dei pod.

    kubectl rollout restart deployment/aws-load-balancer-controller -n kube-system

Relazione di trust errata tra il ruolo IAM utilizzato e l'account di servizio

Quando definisci la relazione di trust tra il ruolo IAM e l'account di servizio, potresti riscontrare problemi. Rivedi i seguenti esempi di errori comuni che si verificano quando stabilisci la relazione di trust.

Il ruolo IAM o la relazione di trust non sono definiti correttamente per l'azione "sts:AssumeRoleWithWebIdentity"

Verifica che la relazione di trust sia definita correttamente per l'azione sts:AssumeRoleWithWebIdentity e non per l'azione sts:AssumeRole.

L'esempio seguente mostra una relazione di trust non definita correttamente:

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

Per risolvere questo problema, definisci la relazione di trust per l'azione 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: sostituisci tutte le variabili con i tuoi valori.

Per utilizzare lo stesso ruolo IAM per più cluster in un account, definisci la relazione di trust:

{
  "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 provider OIDC errato durante la creazione di un cluster Amazon EKS

Crea e verifica un provider OpenID Connect (OIDC) per il cluster Amazon EKS. Verifica che l'ID del provider OIDC e la regione AWS associata siano elencati correttamente. In caso contrario, viene visualizzato un errore WebIdentityErr.

Il nome dell'account di servizio o il relativo namespace non sono stati inseriti correttamente

Esamina l’implementazione di AWS Load Balancer Controller. Quando aggiorni l’implementazione, assicurati di inserire il nome dell'account di servizio corretto e il relativo namespace.

Fasi "sts.amazonaws.com" mancanti nella 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. Per eseguire un'operazione STS, la relazione di trust deve includere 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"
        }
}

Per ulteriori informazioni sulle condizioni IAM con più chiavi o valori, consulta Conditions with multiple context keys or values.

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa