Salta al contenuto

Perché non posso utilizzare kubectl per connettermi al mio cluster EKS?

7 minuti di lettura
0

Quando utilizzo lo strumento a riga di comando kubectl per provare a connettermi al mio cluster Amazon Elastic Kubernetes Service (Amazon EKS), ricevo un messaggio di errore.

Risoluzione

Se non riesci a connetterti a un cluster Amazon EKS quando utilizzi kubectl, potresti aver configurato un servizio, un'autorizzazione o un'impostazione in modo errato. Un errore può verificarsi anche quando l'ambiente locale non è in grado di comunicare con il server API del cluster EKS. Risolvi il problema in base al messaggio di errore ricevuto.

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.

Prerequisiti:

  • Esegui questo comando per verificare se il sistema è in grado di stabilire una connessione con il cluster corretto:

    kubectl config current-context
  • Esegui questo comando AWS CLI get-caller-identity per verificare che l'utente o il ruolo AWS Identity and Access Management (AWS IAM) attualmente autenticato sia corretto:

    aws sts get-caller-identity

    Nota: consenti al principale IAM di accedere agli oggetti Kubernetes sul cluster in base alla modalità di autenticazione del cluster.

Messaggio di errore "exec plugin invalid"

Quando la versione dell'API di autenticazione nel file kubeconfig non è compatibile con la versione del piano di controllo (control-plane) dell'API Kubernetes, ricevi il seguente messaggio di errore:

"exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha""

Esegui questo comando update-kubeconfig per aggiornare il file kubeconfig per il cluster:

aws eks update-kubeconfig --region region-code --name my-cluster

Nota: sostituisci region-code con la Regione AWS in cui si trova il cluster e my-cluster con il nome del tuo cluster.

La versione di kubectl deve essere una sola versione secondaria precedente o successiva rispetto al piano di controllo (control-plane) del cluster Amazon EKS. Ad esempio, un client kubectl versione 1.29 funziona con i cluster Kubernetes 1.28, 1.29 e 1.30.

Messaggio di errore "couldn't get current server API group list"

Quando il file kubeconfig non esiste o non contiene l'autorità di certificazione (CA), ricevi il seguente messaggio di errore:

"couldn't get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx..eks.amazonaws.com/api?timeout=32s": tls: failed to verify certificate: x509: certificate signed by unknown authority"

  1. Esegui questo comando per verificare se il file kubeconfig esiste nella posizione predefinita (.kube) nella home directory:

    cat ~/.kube/config
  2. Se il file esiste, verifica che la CA del cluster con codifica base64 sia presente nel file kubeconfig. Inoltre, controlla se il file certificate-authority-data esiste e se lo hai configurato correttamente.

  3. Se il file kubeconfig non esiste, esegui questo comando per ricrearlo:

    kubectl get svc --insecure-skip-tls-verify
  4. Verifica se utilizzi un proxy o una VPN che potrebbe bloccare TLS.

Messaggio di errore di timeout "could not get current server API group list"

Se l'host di origine non riesce a comunicare con il server API sulla porta 443, la richiesta scade e ricevi il seguente messaggio di errore:

"could not get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx.gr7.<region-code>.eks.amazonaws.com/api?timeout=32s": dial tcp xx.yy.zz.vvv:443: i/o timeout"

Esegui questo comando per verificare la connettività dell'endpoint del server API dal tuo dispositivo utilizzando telnet sulla porta 443:

$ echo exit | telnet

Esempio di output:

xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com 443Trying 18.224.160.210...
Connected to xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.

Se il comando telnet non risolve il problema, esegui queste azioni:

  • Se hai attivato l'accesso pubblico sull'endpoint del server API, controlla se hai limitato l'accesso all'endpoint del server API a un determinato intervallo CIDR. Assicurati che l'indirizzo IP del dispositivo appartenga al blocco CIDR. Inoltre, controlla il comportamento di accesso all'endpoint del server API.
  • Se hai attivato solo l'accesso privato sull'endpoint del server API, tutto il traffico del server API del cluster deve provenire dal cloud privato virtuale (VPC) o da una rete connessa. Inoltre, i comandi kubectl devono provenire dall'interno del VPC o da una rete connessa. Per ulteriori informazioni, consulta Accesso a un server API solo privato.
  • Verifica se i gruppi di sicurezza o le liste di controllo degli accessi alla rete (ACL) bloccano le richieste al server API Kubernetes. Assicurati che il gruppo di sicurezza del cluster consenta il traffico sulla porta 443 dal CIDR di origine.

Messaggio di errore "couldn't get current API server group list"

Quando tenti di eseguire un'azione senza autorizzazione per accedere all'API Kubernetes sul cluster Amazon EKS, ricevi il seguente messaggio di errore:

"couldn't get current server API group list: the server has asked for the client to provide credentials"

Per risolvere il problema, completa i seguenti passaggi:

  1. Esegui il comando get-caller-identity per verificare chi ha effettuato la richiesta di accesso al cluster EKS:

    aws sts get-caller-identity

    Esempio di output:

    {
     "UserId": "user-ID",
     "Account": "account-ID",
     "Arn": "arn:aws:iam::account-ID:user/kube-user"
    }

    Nota: l'esempio di output precedente contiene l'ID dell'utente, l'account AWS e l'ARN dell'entità IAM che ha effettuato la richiesta.

  2. Cambia la modalità di autenticazione in API_AND_CONFIG_MAP o API, quindi utilizza le voci di accesso a EKS per concedere agli utenti IAM l'accesso a Kubernetes.

  3. Per concedere le autorizzazioni appropriate, utilizza la modalità di autenticazione API o API_AND_CONFIG_MAP per aggiungere la voce dell'entità IAM.
    Modalità di autenticazione API
    Esegui questo comando create-access-entry per creare una voce di accesso che consenta al responsabile IAM di autenticarsi nel cluster Amazon EKS:

    aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:user/my-user --type STANDARD --username my-user

    Nota: nel comando precedente, sostituisci l'ARN del principale con l'ARN della tua entità IAM.
    Esegui questo comando associate-access-policy per associare la voce di accesso a una policy di accesso:

    aws eks associate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
        --access-scope type=cluster --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy

    Modalità di autenticazione API_AND_CONFIG_MAP
    Per la modalità di autenticazione API_AND_CONFIG_MAP, puoi utilizzare la modalità di autenticazione API precedente oppure modificare configmap.
    Per modificare aws-auth configmap, esegui questo comando:

    kubectl edit configmap aws-auth -n kube-system

    Aggiungi l'utente o il ruolo IAM alla sezione mapRoles o mapUsers.
    Quello che segue è un esempio di sezione  mapRoles con una voce per un ruolo IAM:

    mapRoles: |
        - groups:
          - system:masters
          rolearn: arn:aws:iam::111122223333:role/MyEKSrole
          username: eks-user

    Nota: sostituisci l'esempio di ARN con l'ARN del tuo ruolo IAM. Se utilizzi un utente IAM, sostituisci mapRoles con mapUsers e l'ARN con l'ARN dell'utente IAM.

L'esempio precedente associa il principale IAM al gruppo system:masters che concede l'accesso amministrativo completo al cluster. Per un accesso più restrittivo, associa il principale IAM a un utente o gruppo Kubernetes personalizzato e utilizza oggetti di controllo degli accessi basato sul ruolo (RBAC) di Kubernetes per definire le autorizzazioni necessarie. Per ulteriori informazioni, consulta Using RBAC authorization (Utilizzo dell'autorizzazione RBAC) sul sito web Kubernetes.

"Did you specify the right host or port?" error message

Se non hai configurato correttamente il file kubeconfig, kubectl può connettersi al cluster EKS e ricevi il seguente messaggio di errore:

"The connection to the server localhost:8080 was refused - did you specify the right host or port?"

Per risolvere il problema, intraprendi le seguenti azioni:

  • Esegui questo comando per aggiornare il file kubeconfig:

    aws eks update-kubeconfig --region region-code --name my-cluster
  • Esegui questo comando per controllare il contesto corrente nel file kubeconfig:

    kubectl config current-context
  • Se l'output del comando current-context non punta verso iil cluster EKS previsto, esegui questo comando:

    kubectl config use-context ;

Informazioni correlate

Connessione di kubectl a un cluster EKS creando un file kubeconfig

AWS UFFICIALEAggiornata 5 mesi fa