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

Ultimo aggiornamento: 15/11/2021

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

Breve descrizione

Per risolvere i problemi relativi al provider OpenID Connect (OIDC) e ai ruoli IAM per gli account di servizio (IRSA) in Amazon EKS, completa i passaggi in una delle seguenti sezioni:

  • Controlla se disponi di un provider IAM OIDC esistente per il tuo cluster
  • Controlla se il tuo ruolo IAM ha una policy IAM necessaria allegata alle autorizzazioni richieste
  • Verifica che le relazioni di trust del ruolo IAM siano impostate correttamente
  • Controlla se hai creato un account di servizio
  • Verifica che l'account di servizio disponga delle annotazioni del ruolo IAM corrette
  • Verifica di aver specificato correttamente serviceAccountName nel tuo pod
  • Controlla le variabili d'ambiente e le autorizzazioni
  • Verifica che l'applicazione utilizzi un SDK AWS supportato
  • Controlla l'utente e il gruppo del pod
  • Ricrea i pod
  • Verifica che il destinatario sia corretto
  • Verifica di aver configurato l'impronta digitale corretta
  • Per la Regione AWS Cina, controlla la variabile d'ambiente AWS_DEFAULT_REGION

Risoluzione

Controlla se disponi di un provider IAM OIDC esistente per il tuo cluster

Se esiste già un provider, viene visualizzato un errore.

Ad esempio:

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

1.    Controlla l'URL del provider OIDC del tuo 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 (includi < >) 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 precedente restituisce un output, allora hai già un provider per il tuo cluster. Se il comando non restituisce un output, devi creare un provider IAM OIDC. Consulta Crea un provider OIDC in IAM per il tuo cluster.

Controlla se il tuo ruolo IAM ha una policy IAM necessaria allegata alle autorizzazioni richieste

1.    Apri la console IAM.

2.    Nel pannello di navigazione, scegli Ruoli.

3.    Scegli il ruolo che vuoi verificare.

4.    Nella scheda Autorizzazioni, verifica se a questo ruolo è allegata la policy necessaria.

Verifica che le relazioni di trust del ruolo IAM siano impostate correttamente

Tramite la Console di gestione AWS:

1.    Apri la console IAM.

2.    Nel pannello di navigazione, scegli Ruoli.

3.    Scegli il ruolo che vuoi controllare.

4.    Scegli la scheda Relazioni di trust per verificare 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"
        }
      }
    }
  ]
}

Con AWS CLI:

Per verificare le relazioni di trust, esegui il seguente comando con il nome del ruolo:

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

Nota: sostituisci EKS-IRSA con il nome del tuo ruolo IAM.

Nell'output JSON, 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: controlla di aver specificato la Regione AWS, il nome dell'account di servizio Kubernetes e lo spazio dei nomi Kubernetes corretti.

Controlla se hai creato un account di servizio

Usa il seguente comando:

$ kubectl get sa -n YOUR_NAMESPACE

Nota: sostituisci YOUR_NAMESPACE con il tuo spazio dei nomi Kubernetes.

Output di esempio:

NAME      SECRETS   AGE
default   1         28d
irsa      1         66m

Se non disponi di un account di servizio, consulta Configura gli account di servizio per i pod .

Verifica che l'account di servizio disponga delle annotazioni del ruolo IAM corrette

Usa il seguente comando:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Nota: sostituisci irsa con il nome dell'account di servizio Kubernetes. Sostituisci YOUR_NAMESPACE con il tuo spazio dei nomi Kubernetes.

Output di esempio:

Name:                irsa
Namespace:           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 aver specificato correttamente serviceAccountName nel tuo pod

Usa il seguente comando:

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

Nota: sostituisci POD_NAME e YOUR_NAMESPACE con il pod e lo spazio dei nomi Kubernetes.

Output di esempio:

serviceAccountName: irsa

Controlla le variabili d'ambiente e le autorizzazioni

Cerca AWS_IAM_ROLE_ARN e AWS_WEB_IDENTITY_TOKEN_FILE nelle variabili d'ambiente del pod:

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

Output di esempio:

AWS_REGION=ap-southeast-2
AWS_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.11
Java — 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 controllare la versione più recente dell'SDK supportata, consulta Utilizzo di un SDK AWS supportato.

Controlla l'utente e il gruppo del pod

Usa il seguente comando:

$ kubectl exec -it POD_NAME -- id
uid=0(root) gid=0(root) groups=0(root)

Nota: di default, solo i container che vengono eseguiti come root dispongono delle autorizzazioni del file system appropriate per leggere il file del token di identità Web.

Se i tuoi container non sono in esecuzione come root, puoi ricevere i seguenti errori:

Error: PermissionError: [Errno 13] Permission denied: ‘/var/run/secrets/eks.amazonaws.com/serviceaccount/token

Oppure:

WebIdentityErr: failed fetching WebIdentity token: \ncaused by: WebIdentityErr: unable to read file at /var/run/secrets/eks.amazonaws.com/serviceaccount/token\ncaused by: open /var/run/secrets/eks.amazonaws.com/serviceaccount/token: permission denied

Per fornire le autorizzazioni appropriate per il file system, assicurati che i tuoi container vengano eseguiti come root. Per i cluster 1.18 o inferiori, fornisci il seguente contesto di sicurezza per i container nel manifesto:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: my-app
spec:
 template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
      securityContext:
        fsGroup: 1337
...

Nota: l'ID fsGroup è arbitrario. Puoi scegliere qualsiasi ID di gruppo valido. L'impostazione precedente del contesto di sicurezza non è obbligatoria per i cluster 1.19 o versioni successive.

Ricrea i pod

Se hai creato i pod prima di applicare IRSA, ricrea i pod.

Comando di esempio:

$ kubectl rollout restart deploy nginx

Output di esempio:

deployment.apps/nginx restarted

Per le implementazioni daemonsets o statefulsets, puoi utilizzare il seguente comando:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

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

Esempio di comando per eliminare:

$ kubectl delete pod POD_NAME

Esempio di comando per ricreare:

$ kubectl apply -f SPEC_FILE

Nota: sostituisci SPEC_FILE con il percorso e il nome del file manifesto di Kubernetes.

Verifica che il destinatario sia corretto

Se hai creato il provider OIDC con un destinatario errato, ricevi il seguente errore:

Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience

Controlla il provider di identità IAM per il tuo cluster. Il tuo 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 aver configurato l'impronta digitale corretta

Se l'identificazione personale configurata in IAM OIDC non è corretta, puoi ricevere 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, utilizza eksctl o la Console di gestione AWS per creare il provider di identità IAM. Per altri modi di ottenimento dell'identificazione personale, consulta Ottenimento dell'identificazione personale per un provider di identità OpenID Connect.

Per la Regione AWS Cina, controlla la variabile d'ambiente AWS_DEFAULT_REGION

Se usi IRSA per un pod o un daemonset implementato in un cluster nella Regione AWS Cina, imposta la variabile di ambiente AWS_DEFAULT_REGION nella specifica del pod. In caso contrario, il pod o il daemonset possono ricevere il seguente errore:

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid

Utilizza l'esempio seguente per aggiungere la variabile d'ambiente AWS_DEFAULT_REGION alla specifica pod o daemonset:

apiVersion: apps/v1
kind: 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"
...

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?