Come posso risolvere i problemi che riscontro durante la configurazione di Cluster Autoscaler in un cluster Amazon EKS?
Desidero risolvere i problemi che riscontro quando avvio Cluster Autoscaler nel mio cluster Amazon Elastic Kubernetes Service (Amazon 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.
I comandi nella seguente risoluzione non utilizzano il flag --region perché utilizzano la Regione AWS predefinita. Per verificare la Regione predefinita, esegui questo comando AWS CLI configure:
aws configure
Per modificare la Regione, utilizza il flag --region.
Prerequisiti: installa o aggiorna eksctl alla versione più recente. Per istruzioni, consulta Installation (Installazione) sul sito web eksctl.
Esegui queste azioni di risoluzione dei problemi in base al problema riscontrato. Per risolvere i problemi relativi ai probe, consulta Come posso risolvere i problemi relativi ai probe di attività e idoneità nei miei cluster Amazon EKS?
Cluster Autoscaler Pod è in stato «CrashLoopBackOff»
Per risolvere lo stato «CrashLoopBackOff», completa i seguenti passaggi:
-
Per verificare lo stato del pod Cluster Autoscaler, esegui questo comando:
kubectl get pods -n kube-system | grep cluster-autoscalerEsempio di output:
NAME READY STATUS RESTARTS AGE cluster-autoscaler-abcd-abcd 0/1 CrashLoopBackOff 3 (20s ago) 99s -
Per ottenere dettagli sul motivo per cui il pod è bloccato nello stato, esegui questo comando:
kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-systemNota: sostituisci cluster-autoscaler-abcd-abcde con il nome del pod Cluster Autoscaler.
Nell'output, controlla il valore di Reason. Se riscontri un problema OOMKilled, utilizza il comando kubectl edit per aumentare i valori di limits e requests per le risorse di memoria nella distribuzione di Cluster Autoscaler. Per ulteriori informazioni su kubectl edit, consulta kubectl edit sul sito web Kubernetes. Per visualizzare i valori di memoria predefiniti per Cluster Autoscaler, consulta cluster-autoscaler-autodiscover.yaml sul sito web GitHub.
Esempio di output:Name: cluster-autoscaler-abcd-abcde Namespace: kube-system State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: OOMKilled Exit Code: 137 ... -
Per verificare la presenza di problemi nei log del pod Cluster Autoscaler, esegui questo comando:
kubectl logs -f -n kube-system -l app=cluster-autoscalerSe i log mostrano problemi con le autorizzazioni AWS Identity and Access Management (AWS IAM), vai alla sezione Il pod Cluster Autoscaler ha problemi di autorizzazioni IAM. Esempio di output:
Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: abc is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: abcdexyzSe i log mostrano problemi di rete come un timeout I/O, vai alla sezione Il pod Cluster Autoscaler ha problemi di rete. Esempio di output:
Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: dial tcp: i/o timeout
Il pod Cluster Autoscaler ha problemi di autorizzazioni IAM
Verifica se hai associato un provider OIDC al cluster
Assicurati di aver creato un provider OpenID Connect (OIDC) per il cluster.
Verifica se hai annotato l'account del servizio Cluster Autoscaler con il ruolo IAM
Per verificare le annotazioni dell'account di servizio AWS, esegui questo comando:
kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml
Verifica le annotazioni per assicurarti che nell'output sia indicato il ruolo dell'account di servizio Cluster Autoscaler. Esempio di output:
apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/cluster_auto_scaler_iam_role name: cluster-autoscaler namespace: kube-system
Per risolvere i problemi relativi al ruolo dell'account di servizio, consulta Come posso risolvere i problemi relativi a un provider OIDC e IRSA in Amazon EKS?
Controlla la policy IAM
Assicurati di aver collegato la policy IAM corretta al ruolo dell'account di servizio Cluster Autoscaler. Per un esempio di policy e un elenco delle autorizzazioni richieste, consulta IAM policy (Policy IAM) sul sito web GitHub.
Verifica di aver configurato correttamente la relazione di attendibilità
Assicurati di aver configurato correttamente la relazione di attendibilità. Esempio di relazione di attendibilità:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::example_awsaccountid:oidc-provider/oidc.eks.example_region.amazonaws.com/id/example_oidcid" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.example_region.amazonaws.com/id/example_oidcid:aud": "sts.amazonaws.com", "oidc.eks.example_region.amazonaws.com/id/example_oidcid:sub": "system:serviceaccount:kube-system:cluster-autoscaler" } } } ] }
Nota: sostituisci example_awsaccountid con l'ID del tuo account AWS, example_region con la tua Regione e example_oidcid con l'ID del tuo OIDC.
Ogni volta che modifichi il ruolo o la policy dell'account di servizio, esegui questo comando per riavviare il pod Cluster Autoscaler:
kubectl rollout restart deployment cluster-autoscaler -n kube-system
Il pod Cluster Autoscaler ha problemi di rete
Assicurati di aver configurato il cluster Amazon EKS con la configurazione di rete richiesta. Verifica che la sottorete del nodo worker abbia una tabella di routing in grado di indirizzare il traffico verso i seguenti endpoint:
- ec2.amazonaws.com per Amazon Elastic Compute Cloud (Amazon EC2)
- autoscaling.region.amazonaws.com per Amazon EC2 Auto Scaling
- sts.region.amazonaws.com per Servizio di token di sicurezza AWS (AWS STS)
Nota: sostituisci region con la tua Regione.
Se il cluster Amazon EKS è privato, devi creare un endpoint Amazon Virtual Private Cloud (Amazon VPC) per gli endpoint precedenti.
Nota: il gruppo di sicurezza di ogni endpoint VPC deve consentire il gruppo di sicurezza del nodo worker Amazon EKS. I gruppi di sicurezza devono inoltre consentire il traffico in entrata verso il blocco CIDR del VPC di Amazon EKS sulla porta 443.
Verifica che la lista di controllo degli accessi alla rete (ACL) della sottorete e i gruppi di sicurezza del nodo worker non blocchino il traffico che comunica con gli endpoint.
Cluster Autoscaler non riduce o aumenta orizzontalmente i nodi
Controlla le regole di pianificazione nei log del pod Cluster Autoscaler
Per verificare lo stato dei pod, esegui questo comando:
kubectl logs -f -n kube-system -l app=cluster-autoscaler
Per verificare se il pod nello stato Pending (In sospeso) contiene regole di pianificazione, come la regola di affinità, esegui questo comando:
kubectl describe pod example_podname -n example_namespace
Nota: sostituisci example_podname con il nome del pod e example_namespace con il tuo namespace.
Nell'output, controlla la sezione events per informazioni sul motivo per cui il pod è nello stato Pending. Esempio di output:
$ kubectl describe pod cluster-autoscaler-abcde-abcd -n kube-system Name: cluster-autoscaler-5b6b675456-npf8p ... Status: Pending ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 12s (x4 over 2m) default-scheduler 0/4 nodes are available: 1 node(s) didn't match node selector, 3 node(s) didn't match pod affinity rules.
Nota: Cluster Autoscaler rispetta nodeSelector e requiredDuringSchedulingIgnoredDuringExecution in nodeAffinity. Assicurati di etichettare i gruppi di nodi con questi valori. Per etichettare i gruppi di nodi, esegui questo comando:
kubectl get nodes --show-labels
Se Cluster Autoscaler non è in grado di pianificare un pod con nodeSelector o requiredDuringSchedulingIgnoredDuringExecution, Cluster Autoscaler utilizza solo gruppi di nodi che soddisfano i requisiti di espansione. Per pianificare un pod su un nodo, è necessario modificare le regole di pianificazione definite nei pod o nei nodi. Per ulteriori informazioni, consulta Affinity and anti-affinity (Affinità e anti-affinità) sul sito web Kubernetes.
Controlla la codifica del gruppo Amazon EC2 Auto Scaling per Cluster Autoscaler
Affinché Cluster Autoscaler rilevi un gruppo Auto Scaling, devi contrassegnare il gruppo Amazon EC2 Auto Scaling del gruppo di nodi con i seguenti tag.
Per il tag 1, configura i seguenti valori:
- In key, inserisci k8s.io/cluster-autoscaler/example-cluster.
- In value, inserisci owned.
Nota: sostituisci example-cluster con il nome del tuo cluster.
Per il tag 2, configura i seguenti valori:
- In key, inserisci k8s.io/cluster-autoscaler/enabled.
- In value, inserisci true.
Verifica la configurazione del manifesto di distribuzione
Per aprire il manifesto di distribuzione, esegui questo comando:
kubectl -n kube-system edit deployment.apps/cluster-autoscaler
Nell'output, per node-group-auto-discover, assicurati che il manifesto elenchi il nome corretto del cluster o del gruppo di nodi. Esempio di output:
containers:- command ./cluster-autoscaler --v=4 --stderrthreshold=info --cloud-provider=aws --skip-nodes-with-local-storage=false --expander=least-waste --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/example-cluster --balance-similar-node-groups --skip-nodes-with-system-pods=false
Assicurati di non superare il numero massimo di nodi
Per verificare il numero corrente di nodi, esegui questo comando describe-nodegroup:
aws eks describe-nodegroup --cluster-name example-cluster --nodegroup-name example-nodegroup
Nota: sostituisci example-cluster con il nome del tuo cluster e example-nodegroup con il nome del tuo gruppo di nodi.
Se hai raggiunto il numero minimo o massimo di nodi, esegui questo comando update-nodegroup-config per modificare i valori:
aws eks update-nodegroup-config \ --cluster-name cluster-name \ --nodegroup-name nodegroup-name \ --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \
Nota: sostituisci cluster-name con il nome del tuo cluster e nodegroup-name con il nome del tuo gruppo di nodi. Inoltre, sostituisci minvalue con il numero minimo di nodi, maxvalue con il numero massimo di nodi e desiredvalue con il valore di nodi desiderato.
Assicurati che i nodi possano unirsi al cluster
Verifica se le nuove istanze avviate dal gruppo Amazon EC2 Auto Scaling possono unirsi al cluster Amazon EKS. In caso contrario, consulta Come posso fare in modo che i miei nodi worker si uniscano al mio cluster Amazon EKS?
Assicurati di utilizzare il tipo di istanza del nodo corretto
Per verificare se Cluster Autoscaler è in grado di soddisfare la richiesta di risorse del pod con i tipi di istanza del nodo correnti, esegui questo comando:
kubectl -n example_namespace get pod example_podname -o yaml | grep resources -A6
Nota: sostituisci example-cluster con il nome del tuo cluster e example-podname con il nome del tuo pod.
Esempio di output:
containers: - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.1 name: cluster-autoscaler resources: limits: cpu: 100m memory: 600Mi requests: cpu: 100m memory: 600Mi
Nell'output, controlla i valori di limits e requests. Assicurati che i valori di cpu e memory siano sufficientemente alti da consentire al nodo di mantenere il pod. Per visualizzare i requisiti del pod, esegui questo comando:
kubectl describe pod podname -n namespace,
Nota: sostituisci podname con il nome del tuo pod e namespace con il tuo namespace.
Se i requisiti del pod sono superiori alle capacità del nodo, utilizza il comando kubectl edit per aumentare i valori di limits e requests per le risorse di memoria nella distribuzione di Cluster Autoscaler. Oppure crea un nuovo gruppo di nodi con un tipo di istanza diverso che soddisfi i requisiti di risorse del pod. Per ulteriori informazioni su kubectl edit, consulta kubectl edit sul sito web Kubernetes.
Verifica se sono configurate taint per il nodo nel gruppo di nodi
Per verificare se hai configurato taint per il nodo e se il pod è in grado di tollerarle, esegui questo comando:
kubectl describe node example_nodename | grep taint -A2
Nota: sostituisci example_nodename con il nome del tuo nodo.
Se hai configurato taint, rimuovile. Per ulteriori informazioni, consulta Il tuo pod è nello stato Pending in Come faccio a risolvere i problemi relativi allo stato dei pod in Amazon EKS? Se il pod non è in grado di tollerare taint, definisci la tolleranza del pod. Per ulteriori informazioni, consulta Taints and Tolerations (Taint e tolleranze) sul sito web Kubernetes.
Assicurati che il nodo non abbia la riduzione verticale disattivata
Per verificare lo stato dell'opzione scale-down-disable del nodo, esegui questo comando:
kubectl describe node example_nodename | grep scale-down-disable
Nota: sostituisci example_nodename con il nome del tuo nodo.
Esempio di output:
cluster-autoscaler.kubernetes.io/scale-down-disabled: true
Se l'opzione scale-down-disable è impostata su true, esegui questo comando per rimuovere l'annotazione per il nodo e consentirgli di ridursi verticalmente:
kubectl annotate node example_nodename cluster-autoscaler.kubernetes.io/scale-down-disabled-
Nota: sostituisci example_nodename con il nome del tuo nodo.
Per ulteriori procedure di risoluzione dei problemi di Cluster Autoscaler, consulta Frequently Asked Questions (Domande frequenti) sul sito web GitHub.
- Argomenti
- Containers
- Lingua
- Italiano
