Perché i nodi worker non si sono uniti al mio cluster Amazon EKS?
Ho provato a unire nodi worker al mio cluster Amazon Elastic Kubernetes Service (Amazon EKS). Ho ricevuto un messaggio di errore oppure i nodi non si sono uniti al cluster.
Breve descrizione
Quando provi a unire nodi worker a un cluster Amazon EKS, potresti riscontrare uno dei seguenti problemi:
- Quando crei un gruppo di nodi gestiti nel cluster EKS, il gruppo di nodi gestiti passa allo stato Creazione non riuscita. I nodi worker non si uniscono al cluster EKS e ricevi il messaggio di errore "Instances failed to join the kubernetes cluster".
- I nuovi nodi worker non riescono a unirsi al cluster EKS quando aggiorni il gruppo di nodi gestiti nel cluster EKS.
Risoluzione
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.
Utilizza il runbook di Automazione Systems Manager
Utilizza il runbook AWSSupport-TroubleshootEKSWorkerNode per determinare perché i nodi worker non si uniscono al cluster.
Importante: affinché l'automazione funzioni, i nodi worker devono avere l'autorizzazione per accedere ed eseguire AWS Systems Manager. Per concedere l'autorizzazione, collega la policy gestita da AWS AmazonSSMManagedInstanceCore al ruolo AWS Identity and Access Management (AWS IAM) per il profilo dell'istanza Amazon Elastic Compute Cloud (Amazon EC2). Utilizza la policy AmazonSSMManagedInstanceCore come configurazione predefinita per i gruppi di nodi gestiti da Amazon EKS creati tramite eksctl. Utilizza il formato [-a-zA-Z0-9]{1,100}$ per il nome del cluster.
Per eseguire l'automazione, completa i seguenti passaggi:
- Nella console Systems Manager, apri il runbook AWSSupport-TroubleshootEKSWorkerNode.
- Nota: consulta la sezione Dettagli del documento del runbook per ulteriori informazioni sul runbook.
- Verifica di aver impostato la Regione AWS sulla stessa Regione del cluster.
- Nella sezione Parametri di input, inserisci il nome del cluster nel campo ClusterName e l'ID dell'istanza Amazon EC2 nel campo WorkerID.
- (Facoltativo) Nel campo AutomationAssumeRole, inserisci il nome della risorsa Amazon (ARN) del ruolo IAM che consente all'automazione di eseguire azioni per te. Se non specifichi un ruolo IAM, l'automazione utilizza le autorizzazioni dell'utente che avvia il runbook.
- Scegli Esegui.
- Consulta la sezione Output per determinare la causa del problema e i passaggi da intraprendere per risolverlo.
Verifica il supporto DNS per Amazon VPC
Verifica di aver attivato i nomi host DNS e la risoluzione DNS in Amazon Virtual Private Cloud (Amazon VPC) per il cluster EKS.
Verifica che i nodi worker del profilo dell'istanza abbiano le autorizzazioni corrette
Collega le seguenti policy gestite da AWS al ruolo associato ai nodi worker del profilo dell'istanza:
Assicurati che il limite delle autorizzazioni o la policy di controllo dei servizi (SCP) a livello di organizzazione o account non limitino la possibilità del nodo worker di effettuare chiamate API.
Configura i dati utente per i nodi worker
Nota: se utilizzi AWS CloudFormation per avviare i nodi worker, non serve configurare i dati utente per i nodi worker. Utilizza invece la console CloudFormation per avviare nodi Amazon Linux self-managed.
Se avvii i nodi worker utilizzando gruppi di nodi gestiti, non serve configurare i dati utente con le Amazon Machine Image (AMI) Amazon Linux ottimizzate per Amazon EKS. Configura i dati utente solo quando utilizzi AMI personalizzate per avviare i nodi worker tramite gruppi di nodi gestiti.
Se utilizzi gruppi di nodi gestiti da Amazon EKS con modello di avvio personalizzato, specifica i dati utente corretti nel modello di avvio. Se il cluster Amazon EKS è un cluster completamente privato che utilizza endpoint VPC per connettersi, devi aggiornare i dati utente. Specifica l'autorità di certificazione (CA), l'endpoint del server API e l'indirizzo IP del cluster DNS nei dati utente.
Esempio di configurazione dei dati utente:
#!/bin/bash set -ex B64_CLUSTER_CA=CA-CERT API_SERVER_URL=ENDPOINT K8S_CLUSTER_DNS_IP=IP-ADDRESS /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments} —b64-cluster-ca $B64_CLUSTER_CA —apiserver-endpoint $API_SERVER_URL —dns-cluster-ip $K8S_CLUSTER_DNS_I
Nota: sostituisci CA-CERT, ENDPOINT e IP-ADDRESS con i valori della tua istanza. Inoltre, sostituisci ${ClusterName} con il nome del tuo cluster EKS e ${BootstrapArguments} con valori di bootstrap aggiuntivi, se necessario.
Se devi fornire dati utente per passare argomenti al file bootstrap.sh per l'AMI Linux/Bottlerocket ottimizzata per Amazon EKS, specifica l'ID di un'AMI per ImageField nel modello di avvio.
Per configurare i dati utente per i nodi worker, specifica i dati utente all'avvio delle istanze EC2.
Ad esempio, se utilizzi uno strumento di terze parti come Terraform, aggiorna il campo dei dati utente per avviare i nodi worker EKS.
Esempio di configurazione dei dati utente:
#!/bin/bash set -o xtrace /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}
Nota: sostituisci ${ClusterName} con il nome del tuo cluster EKS e ${BootstrapArguments} con valori di bootstrap aggiuntivi, se necessario.
Se utilizzi un'AMI Amazon Linux 2023, aggiungi i parametri minimi richiesti ai dati utente nel seguente formato:
MIME-Version: 1.0Content-Type: multipart/mixed; boundary="//" --// Content-Type: application/node.eks.aws --- apiVersion: node.eks.aws/v1alpha1 kind: NodeConfig spec: cluster: apiServerEndpoint: https://example.com certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk= cidr: 10.100.0.0/16 name: my-cluster --//--
Verifica che la configurazione della rete per le sottoreti Amazon VPC sia corretta e che i nodi worker si trovino nello stesso Amazon VPC del cluster EKS
Se utilizzi un gateway Internet, verifica di averlo collegato correttamente alla tabella di routing.
Se utilizzi un gateway NAT, assicurati che sia configurato correttamente in una sottorete pubblica. Inoltre, verifica di aver configurato correttamente la tabella di routing.
Se utilizzi endpoint privati VPC per un cluster completamente privato, verifica di disporre dei seguenti endpoint di interfaccia:
- com.amazonaws.region.ec2
- com.amazonaws.region.ecr.api
- com.amazonaws.region.ecr.dkr
- com.amazonaws.region.sts
Inoltre, assicurati di disporre dell'endpoint gateway com.amazonaws.region.s3.
Puoi limitare la policy dell'endpoint VPC gateway di Amazon Simple Storage Service (Amazon S3) per Amazon ECR. Per ulteriori informazioni, consulta Autorizzazioni minime del bucket Amazon S3 per Amazon ECR.
I pod configurati con ruoli IAM per gli account di servizio ottengono le credenziali da una chiamata API del Servizio di token di sicurezza AWS (AWS STS). Se non è disponibile un accesso a Internet in uscita, devi creare e utilizzare un endpoint VPC di AWS STS nel VPC.
Il gruppo di sicurezza per l'endpoint VPC deve disporre di una regola in entrata che consenta il traffico dalla porta 443. Per ulteriori informazioni, consulta Controlla il traffico verso le tue risorse AWS utilizzando i gruppi di sicurezza.
Assicurati che la policy associata all'endpoint VPC abbia le autorizzazioni necessarie per effettuare chiamate API al servizio specifico.
Nella sezione Rete del cluster EKS, identifica le sottoreti associate al cluster. Verifica che appartengano allo stesso VPC.
Devi creare endpoint separati per ogni servizio AWS utilizzato. Per un elenco degli endpoint per i servizi AWS più comuni, consulta la tabella in Requisiti del pod. Puoi anche creare un servizio endpoint in base al caso d'uso.
Inoltre, puoi configurare diverse sottoreti in cui avviare i nodi worker. Le sottoreti devono esistere nello stesso Amazon VPC ed avere i tag appropriati. Amazon EKS gestisce automaticamente i tag solo per le sottoreti configurate durante la creazione del cluster. Per ulteriori informazioni, consulta Considerazioni e requisiti relativi alle sottoreti.
Aggiorna la ConfigMap aws-auth con il ruolo NodeInstanceRole dei nodi worker
Verifica di aver configurato correttamente la ConfigMap aws-auth con il ruolo IAM del nodo worker e non con il profilo dell'istanza.
Esegui questo comando:
kubectl describe configmap -n kube-system aws-auth
Se non hai configurato correttamente la ConfigMap aws-auth, ricevi il seguente messaggio di errore:
"571 reflector.go:153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458 : Failed to list *v1.Node: Unauthorized"
Se utilizzi il metodo di autenticazione API di EKS, crea una voce di accesso per NodeInstanceRole. Per Tipo, seleziona EC2_linux.
Soddisfa i requisiti del gruppo di sicurezza dei nodi worker
Verifica di aver configurato il gruppo di sicurezza del piano di controllo (control-plane) e il gruppo di sicurezza del nodo worker con le impostazioni richieste per il traffico in entrata e in uscita. Inoltre, verifica di aver configurato le regole della lista di controllo degli accessi alla rete (ACL) per consentire il traffico da e verso 0.0.0.0/0 per le porte 80, 443 e 1025-65535.
Imposta i tag per i nodi worker
Per la proprietà Tag dei nodi worker, imposta la Chiave su kubernetes.io/cluster/clusterName e imposta il Valore su owned.
Per ulteriori informazioni, consulta Considerazioni e requisiti relativi al VPC.
Verifica che i nodi worker possano raggiungere l'endpoint del server API del cluster EKS
Avvia i nodi worker in una sottorete associata a una tabella di routing che indirizza all'endpoint API tramite un NAT o un gateway Internet. Se avvii i nodi worker in una rete privata con restrizioni, verifica che i nodi worker possano raggiungere l'endpoint del server API di EKS. Se avvii nodi worker con un Amazon VPC che utilizza un DNS personalizzato invece di AmazonProvidedDNS, i nodi worker potrebbero non risolvere l'endpoint.
Nota: l'endpoint non viene risolto quando disattivi l'accesso pubblico all'endpoint e attivi solo l'accesso privato. Per ulteriori informazioni, consulta Enabling DNS resolution for Amazon EKS cluster endpoints (Attivazione della risoluzione DNS per gli endpoint dei cluster Amazon EKS).
Verifica se il kubelet può raggiungere gli endpoint richiesti
Esegui questi comandi per verificare se il kubelet può raggiungere gli endpoint:
$ nc -vz ec2.region.amazonaws.com 443
$ nc -vz dkr.ecr.region.amazonaws.com 443
$ nc -vz api.ecr.region.amazonaws.com 443
$ nc -vz s3.region.amazonaws.com 443
Nota: sostituisci region con la tua Regione.
Verifica di aver configurato correttamente il ruolo del cluster
Devi collegare AmazonEKSClusterPolicy al ruolo IAM del cluster Amazon EKS. Inoltre, la relazione di attendibilità del cluster deve consentire il servizio eks.amazonaws.com per sts:AssumeRole.
Esempio di policy di attendibilità:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Verifica di aver attivato gli endpoint di STS Regionali
Se il cluster si trova in una Regione che supporta gli endpoint di STS, attiva l'endpoint di STS Regionale per autenticare il kubelet. Il kubelet può quindi creare l'oggetto nodo.
Assicurati che l'AMI sia stata configurata per funzionare con EKS e che includa i componenti richiesti
L'AMI Amazon Linux ottimizzata per Amazon EKS contiene i componenti necessari per funzionare con il cluster EKS. Se l'AMI dei nodi worker non è l'AMI Amazon Linux ottimizzata per Amazon EKS, verifica che i seguenti componenti Kubernetes siano nello stato Attivo:
- kubelet
- AWS IAM Authenticator
- Docker (Amazon EKS versione 1.23 e precedenti)
- containerd
Utilizza SSH per connetterti all'istanza del nodo worker EKS e controllare i log dell'agente kubelet
Verifica di aver configurato l'agente kubelet come servizio systemd nell'istanza del nodo worker EKS.
Per convalidare i log del kubelet, esegui questo comando:
journalctl -f -u kubelet
Per risolvere i problemi, consulta Risolvi i problemi con i cluster e i nodi Amazon EKS.
Utilizza lo script di raccolta di log di Amazon EKS per risolvere gli errori
Utilizza i file di log e i log del sistema operativo per risolvere i problemi del cluster Amazon EKS. I nodi worker del cluster Amazon EKS archiviano i log di inizializzazione cloud-init in /var/log/cloud-init-output.log e /var/log/cloud-init.log.
Per utilizzare lo script di raccolta di log di EKS per raccogliere i log, devi utilizzare SSH per connettersi al nodo worker che presenta il problema. Quindi esegui il seguente script:
curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh sudo bash eks-log-collector.sh
Verifica che le sottoreti Amazon VPC per il nodo worker abbiano indirizzi IP disponibili
Se Amazon VPC non ha indirizzi IP disponibili, puoi associare un CIDR secondario all'Amazon VPC esistente. Per ulteriori informazioni, consulta Visualizza i requisiti di rete di Amazon EKS per VPC e sottoreti. L'AMI ottimizzata per EKS contiene i componenti necessari per funzionare con il cluster EKS.
- Argomenti
- Containers
- Lingua
- Italiano
