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 tuo cluster.
  • Non riesci a connetterti all'endpoint del server API Amazon EKS.

Risoluzione

Non hai creato il file kubeconfig

Dopo aver creato il cluster Amazon EKS, devi configurare il file kubeconfig utilizzando l'interfaccia della linea di comando AWS (AWS CLI). Questa configurazione consente di connettersi al cluster usando la linea di comando kubectl. La risoluzione seguente mostra come creare un file kubeconfig per il cluster con il comando update-kubeconfig di AWS CLI. Per aggiornare manualmente il file kubeconfig senza utilizzare AWS CLI, consulta Creating or updating a kubeconfig file for an Amazon EKS cluster.

Nota: se ricevi errori durante l'esecuzione dei comandi di AWS CLI,assicurati di utilizzare la versione più recente di AWS CLI.

1.    Verifica di avere installato sul tuo sistema AWS CLI versione 1.16.308 o successiva:

$ aws --version

Importante: devi avere Python versione 2.7.9 o successiva installato sul tuo sistema. Altrimenti, riceverai un messaggio di errore.

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

2.    Controlla l'identità attuale per assicurarti di utilizzare le credenziali corrette con le autorizzazioni per il cluster Amazon EKS:

aws sts get-caller-identity

Nota: all'utente o al ruolo dell'entità AWS Identity and Access Management (IAM) che crea un cluster Amazon vengono concesse automaticamente le autorizzazioni al momento della creazione del cluster. Queste autorizzazioni vengono concesse nella configurazione RBAC del cluster nel piano di controllo (control-plane). Agli utenti o ai ruoli IAM può essere concesso anche l'accesso a un cluster Amazon EKS in aws-auth ConfigMap. Per impostazione predefinita, AWS IAM Authenticator for Kubernetes utilizza l'identità AWS CLI o AWS SDK configurata. Per ulteriori informazioni, consulta Turning on IAM user and role access to your cluster.

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

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

Nota: sostituisci 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 home directory. Il file potrebbe anche essere unito a un kubeconfig esistente in quella posizione. Per Windows, il file si trova in %USERPROFILE%\.kube\config.

Puoi anche specificare un altro percorso impostando la variabile di ambiente KUBECONFIG (dal sito Web di Kubernetes) o con la seguente opzione --kubeconfig:

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

Nota: per l'autenticazione durante l'esecuzione dei comandi kubectl, puoi specificare un nome della risorsa Amazon (ARN) del ruolo IAM con l'opzione --role-arn. In caso contrario, viene utilizzata l'entità IAM nella catena di credenziali AWS CLI o AWS SDK predefinita. Per ulteriori informazioni, consulta update-kubeconfig. In alternativa, completa il passaggio 6 nella sezione Create kubeconfig file manually di Creating or updating a kubeconfig file for an Amazon EKS cluster.

4.    Testa la tua configurazione:

$ kubectl get svc

Esempio di output:

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

Nota: se ricevi altri errori per autorizzazioni o tipo di risorse, consulta Unauthorized or access denied (kubectl).

Non riesci a connetterti all'endpoint del server API Amazon EKS

1.    Verifica di utilizzare l'URL corretto del server API Amazon EKS. Per farlo, attiva kubectl verbosity ed esegui il seguente comando:

$ kubectl get svc --v=9

L'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 eseguendo il seguente comando:

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

L'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 garantire accesso a tutti gli indirizzi IP di origine nell'elenco PublicAccessCIDRS. A tale scopo, procedi come segue:

  1. Apri la console Amazon EKS.
  2. Scegli il cluster che vorresti aggiornare.
  3. Scegli la scheda Rete, quindi scegli Gestisci rete.
  4. Seleziona Pubblico.
  5. In Impostazioni avanzate, in Blocco CIDR, inserisci tutto l'intervallo CIDR pubblico che deve essere ammesso nell'elenco.
  6. Scegli Salva 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 del tuo 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'intervallo IP o CIDR di origine sia consentito. Ciò consente al client kubectl di connettersi all'endpoint del server API Amazon EKS.

Informazioni correlate

Amazon EKS troubleshooting

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 un anno fa