Come posso risolvere l'errore "You must be logged in to the server (Unauthorized)" (Devi avere effettuato l'accesso al server [non autorizzato]) quando mi connetto al server API di Amazon EKS?

10 minuti di lettura
0

Sto usando i comandi kubectl per connettermi al server dell'interfaccia di programmazione dell’applicazione (API) di Amazon Elastic Kubernetes Service (Amazon EKS). Ho ricevuto il messaggio "error: You must be logged in to the server (Unauthorized)" (Errore: devi avere effettuato l'accesso al server [non autorizzato]).

Breve descrizione

Questo errore viene visualizzato quando l'entità AWS Identity and Access Management (IAM) configurata in kubectl non è autenticata da Amazon EKS.

L'autenticazione e l'autorizzazione ad accedere al tuo cluster Amazon EKS ti vengono concesse in base all'entità IAM (utente o ruolo) che utilizzi. Pertanto, verifica quanto segue:

  • Hai configurato lo strumento kubectl in modo che utilizzi il tuo utente o ruolo IAM.
  • La tua entità IAM è mappata nella ConfigMap aws-auth.

Per risolvere questo problema, devi completare una delle seguenti procedure in base al tuo caso d'uso:

  • Sei il creatore del cluster
  • Non sei il creatore del cluster

Risoluzione

Se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare una versione recente di AWS CLI.

Sei il creatore del cluster

Sei il creatore del cluster se la tua entità IAM è stata utilizzata per creare il cluster Amazon EKS.

1.    Esegui la seguente query in Amazon CloudWatch Log Insights per identificare l'ARN del creatore del cluster:

Innanzitutto, seleziona il gruppo di log per il tuo cluster Amazon EKS (esempio: /aws/eks/my-cluster/cluster). Dopodiché, esegui la seguente query:

fields @logstream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

Nota: assicurati di avere attivato i log dell'autenticatore di Amazon EKS.

Questa query restituisce l'entità IAM mappata come creatore del cluster:

@message
time="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin

2.    Assicurati di avere configurato AWS CLI con l'entità IAM che ha creato il cluster. Per vedere se l'entità IAM è configurata per AWS CLI nella tua shell (interprete di comandi), utilizza il seguente comando:

$ aws sts get-caller-identity

Puoi eseguire questo comando anche utilizzando un profilo specifico:

$ aws sts get-caller-identity --profile MY-PROFILE

L'output restituisce il nome della risorsa Amazon (ARN) dell'entità IAM configurata per AWS CLI.

Esempio:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Verifica che l'entità IAM restituita corrisponda all'entità IAM che ha creato il cluster. Se l'entità IAM restituita non è il creatore del cluster, aggiorna la configurazione di AWS CLI affinché utilizzi l'entità IAM che ha creato il cluster.

3.    Aggiorna o genera il file kubeconfig utilizzando uno dei seguenti comandi:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Nota:

  • Sostituisci eks-cluster-name con il nome del tuo cluster.
  • Sostituisci aws-region con il nome della tua Regione AWS.

Per specificare un profilo AWS CLI, utilizza il seguente comando:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Nota:

  • Sostituisci eks-cluster-name con il nome del tuo cluster.
  • Sostituisci aws-region con il nome della tua Regione.
  • Sostituisci my-profile con il nome del tuo profilo.

4.    Per confermare che il file kubeconfig è aggiornato esegui il comando seguente:

$ kubectl config view --minify

5.    Per confermare che la tua entità IAM è autenticata e che puoi accedere al tuo cluster EKS, esegui il seguente comando:

$ kubectl get svc

Output di esempio:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

Non sei il creatore del cluster

Non sei il creatore del cluster se la tua entità IAM non è stata utilizzata per creare il cluster. In questo caso, devi mappare la tua entità IAM nella ConfigMap aws-auth per consentire l'accesso al cluster.

1.    Assicurati di avere configurato AWS CLI con la tua entità IAM. Per vedere se l'entità IAM è configurata per AWS CLI nella tua shell (interprete di comandi), esegui il seguente comando:

$ aws sts get-caller-identity

Puoi eseguire questo comando anche utilizzando un profilo specifico:

$ aws sts get-caller-identity --profile my-profile

L'output restituisce l'ARN dell'entità IAM configurata per AWS CLI.

Esempio:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Verifica che l'entità IAM restituita sia la tua entità IAM. Se l'entità IAM restituita non è quella utilizzata per interagire con il cluster, aggiorna innanzitutto la configurazione di AWS CLI di modo che utilizzi l'entità IAM corretta. Quindi, riprova ad accedere al tuo cluster usando kubectl. Se il problema persiste, continua con il passaggio 2.

2.    Se l'entità IAM restituita non è il creatore del cluster, aggiungi la tua entità IAM alla ConfigMap aws-auth. Ciò consente all'entità IAM di accedere al cluster.

Solo l'amministratore del cluster può modificare la ConfigMap aws-auth. Pertanto, effettua una delle seguenti operazioni:

  • Utilizza le istruzioni riportate nella sezione Sei il creatore del cluster per accedere al cluster utilizzando l'entità IAM che ha creato il cluster.
  • Chiedi all'amministratore del cluster di eseguire questa operazione.

Verifica se la tua entità IAM si trova nella ConfigMap aws-auth eseguendo il seguente comando:

eksctl get iamidentitymapping --cluster cluster-name

-oppure-

kubectl describe configmap aws-auth -n kube-system

Se la tua entità IAM si trova nella ConfigMap aws-auth, puoi proseguire con il passaggio 3.

Mappa automaticamente la tua entità IAM eseguendo il comando seguente:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
    --group system:masters \
    --no-duplicate-arns \
    --username admin-user1

In alternativa, puoi mappare manualmente la tua entità IAM modificando la ConfigMap aws-auth:

$ kubectl edit configmap aws-auth --namespace kube-system

Per aggiungere un utente IAM, aggiungi l'ARN dell'utente IAM a mapUsers.

Esempio:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

Per aggiungere un ruolo IAM, aggiungi l'ARN del ruolo IAM a mapRoles.

Esempio:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

Importante:

  • Il ruolo IAM deve essere mappato senza il percorso. Per ulteriori informazioni sui requisiti del percorso rolearn, espandi la sezione aws-auth ConfigMap does not grant access to the cluster (ConfigMap aws-auth non concede l'accesso al cluster) in Troubleshooting IAM (Risoluzione dei problemi di IAM).
  • Per specificare il percorso rolearn per un ruolo IAM del Centro identità AWS IAM (successore di AWS Single Sign-On), rimuovi il percorso "/aws-reserved/sso.amazonaws.com/REGION" dall'ARN del ruolo. In caso contrario, la voce nella ConfigMap non può autorizzare l'utente come valido.
  • Il gruppo system:masters consente all'utente con privilegi avanzati l'accesso per eseguire qualsiasi operazione su qualsiasi risorsa. Per ulteriori informazioni, consulta Ruoli predefiniti e vincoli del ruolo. Per limitare l'accesso per questo utente, puoi creare un ruolo Amazon EKS e una risorsa di vincolo del ruolo. Per un esempio di accesso limitato per gli utenti che visualizzano le risorse nella console Amazon EKS, segui i passaggi 2 e 3 nella sezione Required permissions (Autorizzazioni richieste).

3.    Aggiorna o genera il file kubeconfig utilizzando il comando seguente. Assicurati che AWS CLI sia configurata con l'entità IAM restituita nel passaggio 1.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Nota:

  • Sostituisci eks-cluster-name con il nome del tuo cluster.
  • Sostituisci aws-region con il nome della tua Regione AWS.

Puoi eseguire questo comando anche utilizzando un profilo specifico:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Nota:

  • Sostituisci eks-cluster-name con il nome del tuo cluster.
  • Sostituisci aws-region con il nome della tua Regione AWS.
  • Sostituisci my-profile con il nome del tuo profilo.

4.    Per confermare che il file kubeconfig è aggiornato esegui il comando seguente:

$ kubectl config view --minify

5.    Per confermare che l'utente o il ruolo IAM sia autenticato, prova ad accedere nuovamente al cluster. Ad esempio, puoi utilizzare il seguente comando per confermare che l'errore è stato risolto:

$ kubectl get svc

Output di esempio:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

Suggerimenti aggiuntivi per la risoluzione del problema

Se l'errore persiste, utilizza i seguenti suggerimenti per la risoluzione dei problemi per identificare il problema.

Quando esegui un comando kubectl, viene inviata una richiesta al server API del cluster Amazon EKS. Dopodiché, l'autenticatore Amazon EKS tenta di autenticare questa richiesta. Pertanto, controlla i log dell'autenticatore EKS in CloudWatch per identificare il problema.

1.    Assicurati di avere attivato la registrazione per il tuo cluster Amazon EKS.

2.    Apri CloudWatch Log Insights.

3.    Seleziona il gruppo di log per il tuo cluster. Esempio: "/aws/eks/example-cluster/cluster".

4.    Esegui la seguente query:

fields @timestamp, @message
| filter @logStream like /authenticator/
| sort @timestamp desc
| limit 1000

Identifica le righe di log per lo stesso intervallo di tempo in cui hai ricevuto l'errore eseguendo i comandi kubectl. Puoi trovare ulteriori informazioni sulla causa dell'errore nei log dell'autenticatore di Amazon EKS.

  • Se il problema è causato dall'utilizzo dell'entità IAM errata per kubectl, verifica la configurazione kubeconfig di kubectl e di AWS CLI. Assicurati di utilizzare l'entità IAM corretta. Ad esempio, supponiamo che i log abbiano un aspetto simile ai seguenti. Questo risultato indica che l'entità IAM utilizzata da kubectl non può essere convalidata. Assicurati che l'entità IAM utilizzata da kubectl esista in IAM e che l'accesso programmatico dell'entità sia attivato.
time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
  • Se il problema è dovuto al fatto che la tua entità IAM non è mappata nella ConfigMap aws-auth o è mappata in modo errato, esamina la ConfigMap aws-auth. Assicurati che l'entità IAM sia mappata correttamente e soddisfi i requisiti elencati nella sezione Non sei il creatore del cluster. In questo caso, i log dell'autenticatore EKS hanno un aspetto simile al seguente:
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
  • Se la ConfigMap aws-auth è stata aggiornata e hai perso l'accesso al cluster, puoi accedere al cluster utilizzando l'entità IAM del creatore del cluster. Questo perché non è necessario che il creatore del cluster sia mappato nella ConfigMap aws-auth.
  • Se l'entità IAM che ha creato il cluster è stata eliminata, per prima cosa crea nuovamente lo stesso utente o ruolo IAM. Quindi, accedi al cluster utilizzando questa entità IAM seguendo i passaggi riportati nella sezione Sei il creatore del cluster.
  • Se il creatore del cluster è un ruolo IAM creato per un utente SSO che è stato rimosso, non puoi creare nuovamente questo ruolo IAM. In questo caso, contatta il Supporto AWS per ricevere assistenza.

Informazioni correlate

Turning on IAM user and role access to your cluster (Attivazione dell'accesso di utenti e ruoli IAM al cluster)

How do I provide access to other IAM users and roles after cluster creation in Amazon EKS? (Come posso consentire l'accesso ad altri utenti e ruoli IAM dopo la creazione del cluster in Amazon EKS?)

Amazon EKS troubleshooting (Risoluzione dei problemi Amazon EKS)

Documentazione di Kubernetes per l'utilizzo dell'autorizzazione RBAC

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa