Per quale motivo non riesco a connettermi al cluster Amazon EKS?

6 minuti di lettura
0

Ho creato un cluster Amazon Elastic Kubernetes Service (Amazon EKS), ma non riesco a connettermi.

Breve descrizione

È possibile che tu non riesca a connetterti al tuo cluster EKS per uno dei seguenti motivi:

  • Non hai creato il file kubeconfig per il cluster.
  • Non puoi connetterti all'endpoint del server API Amazon EKS.

Risoluzione

Non hai creato il file kubeconfig

Dopo la creazione del cluster Amazon EKS, è necessario configurare il file kubeconfig con l'interfaccia della linea di comando AWS (AWS CLI). Questa configurazione permette di connettersi al cluster utilizzando la riga di comando kubectl. La risoluzione seguente mostra come creare un file kubeconfig per il cluster tramite il comando update-kubeconfig di AWS CLI. Per aggiornare manualmente il file kubeconfig senza utilizzare AWS CLI, consulta Creazione o aggiornamento di un file kubeconfig per un cluster Amazon EKS. Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzarne la versione più recente.

1.    Verifica che sul tuo sistema sia installata la versione 1.16.308 o successiva di AWS CLI:

$ aws --version

Importante: sul sistema è necessario avere installato la versione 2.7.9 o successiva di Python. In caso contrario, riceverai un messaggio di errore.

Suggerimento: per installare AWS CLI, utilizza i gestori di pacchetti come yum, apt-get o homebrew per macOS.

2.    Controlla l’identità attuale per verificare che tu stia utilizzando le credenziali corrette che dispongono delle autorizzazioni per il cluster Amazon EKS:

aws sts get-caller-identity

Nota: l’utente dell’entità AWS Identity and Access Management (IAM) o il ruolo che crea un cluster Amazon riceve automaticamente le autorizzazioni al momento della creazione del cluster. Queste autorizzazioni sono concesse nella configurazione RBAC del cluster nel piano di controllo. È possibile concedere l’accesso a un cluster Amazon EKS anche agli utenti IAM o ai ruoli suaws-auth ConfigMap. Per impostazione predefinita, AWS IAM Authenticator per Kubernetes utilizza AWS CLI o l'identità dell'SDK AWS configurata. Per ulteriori informazioni, consulta Attivazione dell'accesso di utenti e ruoli IAM al cluster.

3.    Crea o aggiorna il file kubeconfig per il tuo cluster:

aws eks --region example_region update-kubeconfig --name cluster_name

Nota: sostituisce example_region con il nome della tua Regione AWS. Sostituisci cluster_name con il nome del tuo cluster EKS.

Per impostazione predefinita, il file di configurazione per Linux viene creato nel percorso kubeconfig ($HOME/.kube/config) nella tua directory home. Il file potrebbe anche essere unito a un file kubeconfig esistente in quella posizione. Su Windows, il file si trova in %USERPROFILE%.kube\config.

È possibile specificare anche un altro percorso impostando la variabile dell'ambiente KUBECONFIG (dal sito Web Kubernetes) o tramite l'opzione --kubeconfig:

$ kubectl get pods --kubeconfig ./.kube/config

Nota: per l'autenticazione quando si eseguono i comandi kubectl, puoi specificare un nome della risorsa Amazon (ARN) del ruolo IAM tramite l'opzione --role-arn. In caso contrario, viene utilizzata l'entità IAM nella catena delle credenziali predefinita di AWS CLI o dell'SDK AWS. Per ulteriori informazioni, consulta update-kubeconfig oppure completa il passaggio 6 nella sezione Creazione manuale del file kubeconfig di Creazione o aggiornamento di un file kubeconfig per un cluster Amazon EKS.

4.    Testa la tua configurazione:

$ kubectl get svc

Output di esempio:

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

Nota: se ricevi altri messaggi di errore relativi all'autorizzazione o al tipo di risorsa, consulta Accesso non autorizzato o negato (kubectl).

Non puoi connetterti all'endpoint del server API Amazon EKS

1.    Verifica che puoi connetterti all'URL corretto del server API Amazon EKS. Per farlo, attiva kubectl verbosity, quindi emetti il seguente comando:

$ kubectl get svc --v=9

Dovresti visualizzare un output simile al seguente:

I0110 16:43:36.920095   48173 loader.go:373] Config loaded from file:  /Users/abs/.kube/config
I0110 16:43:36.936844   48173 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500'
I0110 16:43:37.362185   48173 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/ resolved to [{18.119.155.77 } {3.136.153.3 }]
I0110 16:43:37.402538   48173 round_trippers.go:510] HTTP Trace: Dial to tcp:18.119.155.77:443 succeed
I0110 16:43:37.500276   48173 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500 200 OK in 563 milliseconds
I0110 16:43:37.500302   48173 round_trippers.go:570] HTTP Statistics: DNSLookup 1 ms Dial 40 ms TLSHandshake 44 ms ServerProcessing 52 ms Duration 563 ms
I0110 16:43:37.500308   48173 round_trippers.go:577] Response Headers:
I0110 16:43:37.500316   48173 round_trippers.go:580] Audit-Id: 37c17136-7fa7-40e9-8fe6-b24426e81564
I0110 16:43:37.500323   48173 round_trippers.go:580] Cache-Control: no-cache, private
I0110 16:43:37.500329   48173 round_trippers.go:580] Content-Type: application/json
I0110 16:43:37.500334   48173 round_trippers.go:580] X-Kubernetes-Pf-Flowschema-Uid: 508eb99e-d99b-44db-8ade-838c99fe8e9f
I0110 16:43:37.500340   48173 round_trippers.go:580] X-Kubernetes-Pf-Prioritylevel-Uid: d324d3db-05ce-441b-a0ff-c31cbe8f696c
I0110 16:43:37.500345   48173 round_trippers.go:580] Date: Tue, 10 Jan 2023 21:43:37 GMT

2.    Verifica che il server API Amazon EKS sia accessibile pubblicamente emettendo il seguente comando:

$ aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig

Dovresti visualizzare un output simile al seguente:

{
    "subnetIds": [
        "subnet-abc1",
        "subnet-abc2",
        "subnet-abc3",
        "subnet-abc4",
        "subnet-abc5",
        "subnet-abc6"
    ],
    "securityGroupIds": [
       "sg-abc7"
    ],
    "clusterSecurityGroupId": "sg-abc7",
    "vpcId": "vpc-abc9",
    "endpointPublicAccess": true,
    "endpointPrivateAccess": false,
    "publicAccessCidrs": [
        "0.0.0.0/0"
    ]
}

3.    Nell'output precedente, se endpointPublicAccess è true, assicurati di consentire tutti gli indirizzi IP di origine nell'elenco publicAccessCidrs. A tale scopo, procedi nel seguente modo:

  1. Apri la console di Amazon EKS.
  2. Scegli il cluster che desideri aggiornare.
  3. Scegli la scheda Networking (Rete), quindi scegli Manage Networking (Gestisci rete).
  4. Seleziona Public (Pubblico).
  5. In Advanced settings (Impostazioni avanzate), per il blocco CIDR, inserisci tutto l'intervallo CIDR pubblico che deve essere inserito nell'elenco consentito.
  6. Seleziona Save changes (Salva le modifiche).

Nell'output precedente, se endpointPrivateAccess è true, assicurati che la richiesta kubectl provenga dalla rete del cluster. Se la tua richiesta kubectl proviene dall'esterno di Amazon Virtual Private Cloud (Amazon VPC), viene visualizzato il seguente errore di timeout:

$ kubectl get svc --v=9
I0110 17:15:58.889798   50514 loader.go:373] Config loaded from file:  /Users/example-user/.kube/config
I0110 17:15:58.896715   50514 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500'
I0110 17:15:59.374499   50514 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com resolved to [{192.168.126.17 } {192.168.144.26 }]
I0110 17:16:14.285027   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.126.17:443 failed: dial tcp 192.168.126.17:443: i/o timeout
I0110 17:16:29.191768   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.144.26:443 failed: dial tcp 192.168.144.26:443: i/o timeout
I0110 17:16:29.196959   50514 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500  in 30300 milliseconds
I0110 17:16:29.197724   50514 round_trippers.go:570] HTTP Statistics: DNSLookup 183 ms Dial 14906 ms TLSHandshake 0 ms Duration 30300 ms
I0110 17:16:29.197768   50514 round_trippers.go:577] Response Headers:
I0110 17:16:29.199254   50514 helpers.go:264] Connection error: Get https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500: dial tcp 192.168.126.17:443: i/o timeout
Unable to connect to the server: dial tcp 192.168.126.17:443: i/o timeout

Inoltre, aggiorna il gruppo di sicurezza del cluster per assicurarti che l'indirizzo IP o l'intervallo CIDR di origine sia nell'elenco di elementi consentiti. Ciò consente al client kubectl di connettersi all'endpoint del server API Amazon EKS.


Informazioni correlate

Risoluzione dei problemi di Amazon EKS

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?

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa