Come posso risolvere i problemi relativi a un provider OIDC e IRSA in Amazon EKS?
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:
-
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
-
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:
- Apri la console IAM.
- Nel riquadro di navigazione, scegli Ruoli.
- Seleziona il ruolo che desideri verificare.
- Nella scheda Autorizzazioni, verifica che la policy richiesta sia associata al ruolo.
- 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:
-
Apri la console IAM.
-
Nel riquasdro di navigazione, scegli Ruoli.
-
Seleziona il ruolo che desideri controllare.
-
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:
- Per eliminare il pod, esegui il seguente comando:
Nota: Sostituisci POD\ _NAME con il nome del pod.$ kubectl delete pod POD_NAME
- Esegui il comando seguente 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".
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" ...
Video correlati
Contenuto pertinente
- AWS UFFICIALEAggiornata 10 mesi fa
- AWS UFFICIALEAggiornata 10 mesi fa
- AWS UFFICIALEAggiornata 2 anni fa