Come posso risolvere i problemi relativi a un provider OIDC e IRSA in Amazon EKS?
I miei Pod non riescono a utilizzare le autorizzazioni del ruolo AWS Identity and Access Management (AWS IAM) con il token dell'account AWS Amazon Elastic Kubernetes Service (Amazon EKS).
Risoluzione
Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
Verifica se hai un provider OIDC IAM esistente per il cluster
Se non esiste un provider OpenID Connect (OIDC), 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 hai un provider OIDC IAM esistente, completa i seguenti passaggi:
-
Per controllare l'URL del provider OIDC del cluster, esegui questo comando AWS CLI describe-cluster:
aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output textNota: sostituisci cluster_name con il nome del tuo cluster.
Esempio di output:https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E -
Per elencare i provider OIDC IAM nell'account, esegui questo comando list-open-id-connect-providers:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041ENota: sostituisci EXAMPLED539D4633E53DE1B716D3041E con l'URL del provider OIDC ricevuto dal comando precedente.
Se il comando restituisce un output, significa che hai già un provider per il cluster. Se il comando non restituisce alcun output, devi creare un provider OIDC IAM. Esempio di output:"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
Verifica se il ruolo IAM ha le autorizzazioni richieste e una policy IAM collegata
Completa i seguenti passaggi:
- Apri la console IAM.
- Nel pannello di navigazione, scegli Ruoli.
- Scegli il ruolo associato all'account di servizio Kubernetes.
- Scegli la scheda Autorizzazioni. Quindi controlla la policy collegata al ruolo per assicurarti che contenga le autorizzazioni richieste per la configurazione.
- Scegli la scheda Relazioni di attendibilità. Quindi verifica che il formato della policy IAM corrisponda al formato della seguente policy JSON:
Oppure esegui questo comando get-role per verificare la relazione di attendibilità:{ "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" } } } ] }
Nota: sostituisci EKS-IRSA con il nome del ruolo IAM per gli account di servizio (IRSA).aws iam get-role --role-name EKS-IRSA
Esempio di output:
Nel JSON di output, controlla la sezione AssumeRolePolicyDocument per verificare la policy della relazione di attendibilità.{ "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" } } } - (Facoltativo) Aggiorna la relazione di attendibilità per il ruolo impostando la Regione AWS, il nome dell'account di servizio Kubernetes o il namespace Kubernetes corretto.
Verifica se hai creato un account di servizio
Per verificare se esiste un account di servizio, esegui questo comando:
kubectl get sa -n YOUR_NAMESPACE
Nota: sostituisci YOUR_NAMESPACE con il tuo namespace Kubernetes.
Esempio di output:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
Assicurati che nell'output sia indicato l'account di servizio. Se non hai un account di servizio, consulta Configure service accounts for Pods (Configurazione di account di servizio per i Pod) sul sito web 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 il namespace Kubernetes.
Esempio di output:
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
Controlla Annotazioni per assicurarti che il ruolo IAM sia corretto. In caso contrario, esegui questo comando per modificare l'account di servizio:
kubectl edit sa -n NAMESPACE
Nota: sostituisci NAMESPACE con il tuo namespace.
Quindi aggiorna il valore per Annotazioni con il ruolo IAM corretto.
Verifica di avere specificato correttamente il valore serviceAccountName nel Pod
Per verificare serviceAccountName, esegui questo comando:
kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
Nota: sostituisci POD_NAME con il tuo Pod Kubernetes e YOUR_NAMESPACE con il tuo namespace.
Esempio di output:
serviceAccountName: irsa
Se il valore nell'output è il nome dell'account di servizio errato, modifica il manifesto di distribuzione con il nome corretto. Quindi ridistribuisci il manifesto di distribuzione.
Controlla le variabili di ambiente e le autorizzazioni
Per controllare le variabili di ambiente del Pod, esegui questo comando:
kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
Esempio di output:
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
Assicurati che nell'output sia indicato l'account di servizio. Se non hai un account di servizio, consulta Configure service accounts for pods (Configurazione di account di servizio per i Pod) sul sito web Kubernetes.
Verifica che l'applicazione utilizzi un AWS SDK supportato
La versione di AWS SDK deve essere maggiore o uguale alla versione richiesta per AWS SDK.
Ricrea i Pod
Se hai creato i Pod prima di applicare IRSA, esegui questo comando per ricrearli:
kubectl rollout restart deploy nginx
Esempio di output:
deployment.apps/nginx restarted
Per le distribuzioni di daemonset o statefulset, esegui questo comando:
kubectl rollout restart deploy DEPLOYMENT_NAME
Se hai creato un solo Pod, devi eliminarlo e ricrearlo. Completa i seguenti passaggi:
- Per eliminare il Pod, esegui questo comando:
Nota: sostituisci POD_NAME con il nome del tuo Pod.kubectl delete pod POD_NAME - Esegui questo comando per ricreare il Pod:
Nota: sostituisci SPEC\ _FILE con il percorso e il nome del file manifesto Kubernetes.kubectl apply -f SPEC_FILE
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"
Per verificare il provider di identità IAM per il cluster, esegui questo comando get-open-id-connect-provider:
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
Nota: sostituisci ACCOUNT_ID con l'ID del tuo account, AWS_REGION con la tua Regione e EXAMPLED539D4633E53DE1B716D3041E con l'URL del tuo provider OIDC.
Esempio di output:
{ "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": [] }
Nell'output, assicurati che ClientIDList sia sts.amazonaws.com. In caso contrario, aggiungi un provider di identità al ruolo e inserisci sts.amazonaws.com per Pubblico.
Verifica di avere configurato l'identificazione personale corretta
Se l'identificazione personale in OIDC IAM non è corretta, ricevi 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 Amazon EKS per creare il provider di identità IAM. Per altri modi per ottenere un'identificazione personale, consulta Ottenere l'impronta digitale per un provider di identità OpenID Connect.
(Solo Regione AWS Cina) Controlla la variabile di ambiente AWS_DEFAULT_REGION
Per distribuire un Pod o un daemonset applicato da IRSA in un cluster nella Regione AWS China, devi impostare AWS_DEFAULT_REGION nella specifica del Pod. Se non imposti la variabile di ambiente AWS_DEFAULT_REGION, potresti ricevere il seguente errore per il Pod o il daemonset:
"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, crea un manifesto di distribuzione 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" ...
Oppure esegui questo comando per impostare la variabile di ambiente:
kubectl set env deployment deployment_name AWS_DEFAULT_REGION=example_region -n NAMESPACE"
Nota: sostituisci deployment_name con il nome della tua distribuzione, example_region con la Regione AWS China e NAMESPACE con il tuo namespace.
- Argomenti
- Containers
- Lingua
- Italiano
Video correlati


Contenuto pertinente
AWS UFFICIALEAggiornata 2 anni fa