Usando AWS re:Post, accetti AWS re:Post Termini di utilizzo

Come posso risolvere i problemi relativi a un provider OIDC e IRSA in Amazon EKS?

7 minuti di lettura
0

I pod non possono utilizzare le autorizzazioni del ruolo AWS Identity and Access Management (IAM) con il token dell'account Amazon Elastic Kubernetes Service (Amazon EKS).

Soluzione

Verifica se disponi di un provider IAM OIDC esistente per il cluster

Se esiste già un provider, viene visualizzato un errore simile al seguente: "WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400";

Per verificare se disponi di un provider IAM OIDC esistente, completa i seguenti passaggi:

  1. Controlla l'URL del provider OIDC del cluster:

    $ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

    Output di esempio:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. Elenca i provider IAM OIDC nel tuo account. Sostituisci EXAMPLED539D4633E53DE1B716D3041E con il valore restituito dal comando precedente:

    aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

    Output di esempio:

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

Se il comando restituisce un output, significa che hai già un provider per il cluster. Se il comando non restituisce alcun output, è necessario creare un provider IAM OIDC.

Controlla se il ruolo IAM dispone delle autorizzazioni richieste e di una policy IAM allegata

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta la sezione Troubleshoot AWS CLI errors. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Per verificare che il tuo ruolo IAM disponga delle autorizzazioni richieste, completa i seguenti passaggi:

  1. Apri la console IAM.
  2. Nel riquadro di navigazione, scegli Ruoli.
  3. Seleziona il ruolo che desideri verificare.
  4. Nella scheda Autorizzazioni, verifica che la policy richiesta sia associata al ruolo.
  5. Verifica che le relazioni di attendibilità dei ruoli IAM siano impostate correttamente.

Per verificare che il ruolo IAM abbia una policy allegata, completa i seguenti passaggi:

  1. Apri la console IAM.

  2. Nel riquasdro di navigazione, scegli Ruoli.

  3. Seleziona il ruolo che desideri controllare.

  4. Scegli la scheda Relazioni di attendibilità. Verifica che il formato della policy corrisponda al formato della seguente policy JSON:

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME",
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }

    Per verificare le relazioni di attendibilità, esegui il comando get-role nell'interfaccia della linea di comando AWS (AWS CLI):

    $ aws iam get-role --role-name EKS-IRSA

    Nota: sostituisci EKS-IRSA con il nome del ruolo IAM.
    Nel JSON di output, cerca la sezione AssumeRolePolicyDocument.
    Output di esempio:

    {  "Role": {
        "Path": "/",
        "RoleName": "EKS-IRSA",
        "RoleId": "AROAQ55NEXAMPLELOEISVX",
        "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA",
        "CreateDate": "2021-04-22T06:39:21+00:00",
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com",
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
                }
              }
            }
          ]
        },
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
          "LastUsedDate": "2021-04-22T07:01:15+00:00",
          "Region": "AWS_REGION"
        }
      }
    }

    Nota: a seconda del caso d'uso, aggiorna la regione AWS, il nome dell'account del servizio Kubernetes e lo spazio dei nomi Kubernetes.

Controlla se hai creato un account di servizio

Esegui il comando seguente:

$ kubectl get sa -n YOUR_NAMESPACE

Nota: sostituisci YOUR_NAMESPACE con il tuo spazio del nome Kubernetes.

Output di esempio: 

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

Se non disponi di un account di servizio, consulta Configure service accounts for pods sul sito Web di Kubernetes.

Verifica che l'account di servizio abbia le annotazioni del ruolo IAM corrette

Per verificare che l’account di servizio abbia le annotazioni del ruolo IAM corrette, esegui il comando seguente:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Nota: sostituisci irsa con il nome dell’account di servizio Kubernetes e YOUR\ _NAMESPACE con lo spazio del nome Kubernetes.

Output di esempio:

Name:                irsaNamespace:           default
Labels:              none
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
Image pull secrets:  none
Mountable secrets:   irsa-token-v5rtc
Tokens:              irsa-token-v5rtc
Events:              none

Verifica di avere specificato correttamente serviceAccountName nel pod

Per verificare serviceAccountName, esegui il comando seguente:

$ kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

Nota: sostituisci POD\ _NAME e YOUR\ _NAMESPACE con il tuo pod e spazio del nome Kubernetes.

Output di esempio: 

serviceAccountName: irsa

Controlla le variabili di ambiente e le autorizzazioni

Cerca AWS_ROLE_ARN and AWS_WEB_IDENTITY_TOKEN_FILE nelle variabili di ambiente del pod:

$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

Output di esempio: 

AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_DEFAULT_REGION=ap-southeast-2

Verifica che l'applicazione utilizzi un SDK AWS supportato

La versione SDK deve essere maggiore o uguale ai seguenti valori:

Java (Version 2) — 2.10.11Java — 1.11.704
Go — 1.23.13
Python (Boto3) — 1.9.220
Python (botocore) — 1.12.200
AWS CLI — 1.16.232
Node — 3.15.0
Ruby — 2.11.345
C++ — 1.7.174
.NET — 3.3.659.1
PHP — 3.110.7

Per verificare la versione SDK supportata più recente, consulta Using a supported AWS SDK.

Ricrea i pod

Se hai creato i pod prima di applicare IRSA, esegui il seguente comando per ricrearli:

$ kubectl rollout restart deploy nginx

Output di esempio:

deployment.apps/nginx restarted

Per le implementazioni di daemonsets o statefulsets, esegui il seguente comando:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

Se hai creato un solo pod, devi eliminare il pod e ricrearlo:

  1. Per eliminare il pod, esegui il seguente comando:
    $ kubectl delete pod POD_NAME
    Nota: Sostituisci POD\ _NAME con il nome del pod.
  2. Esegui il comando seguente per ricreare il pod:
    $ kubectl apply -f SPEC_FILE
    Nota: sostituisci SPEC\ _FILE con il percorso e il nome del file manifesto Kubernetes.

Verifica che il pubblico sia corretto

Se hai creato il provider OIDC con un pubblico errato, riceverai il seguente errore: "Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience".

Controlla il provider di identità IAM per il cluster. ClientIDList è sts.amazonaws.com:

$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

Output di esempio:

{  "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E",
  "ClientIDList": [
    "sts.amazonaws.com"
  ],
  "ThumbprintList": [
    "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"
  ],
  "CreateDate": "2021-01-21T04:29:09.788000+00:00",
  "Tags": []
}

Verifica di avere configurato l'identificazione personale corretta

Se l'identificazione personale configurata in IAM OIDC non è corretta, viene visualizzato il seguente errore: "failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint".

Per configurare automaticamente l'identificazione personale corretta, usa eksctl o la console di gestione AWS per creare il provider di identità IAM. Per altri modi per ottenere un'identificazione personale, consulta Obtaining the thumbprint for an OpenID Connect identity provider.

Per la regione AWS China, controlla la variabile di ambiente AWS_DEFAULT_REGION

Per un pod o daemonset applicato da IRSA implementato in un cluster nella regione AWS China, imposta la variabile di ambiente AWS_DEFAULT_REGION nella specifica del pod. Se non imposti questa variabile, il pod o il daemonset potrebbe generare il seguente errore:  "An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid".

Per aggiungere la variabile di ambiente AWS\ _DEFAULT\ _REGION alla specifica del pod o del daemonset, esegui un comando simile all'esempio seguente:

apiVersion: apps/v1kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
        env:
        - name: AWS_DEFAULT_REGION
          value: "AWS_REGION"
...
AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa