Salta al contenuto

Come posso risolvere i problemi che riscontro durante la configurazione di Cluster Autoscaler in un cluster Amazon EKS?

10 minuti di lettura
0

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:

  1. Per verificare lo stato del pod Cluster Autoscaler, esegui questo comando:

    kubectl get pods -n kube-system | grep cluster-autoscaler

    Esempio di output:

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. Per ottenere dettagli sul motivo per cui il pod è bloccato nello stato, esegui questo comando:

    kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-system

    Nota: 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
    ...
  3. Per verificare la presenza di problemi nei log del pod Cluster Autoscaler, esegui questo comando:

    kubectl logs -f -n kube-system -l app=cluster-autoscaler

    Se 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: abcdexyz

    Se 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:

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.

AWS UFFICIALEAggiornata un anno fa