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

8 minuti di lettura
0

Desidero risolvere i problemi relativi all'avvio di Cluster Autoscaler sul mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

Prima di iniziare, assicurati di verificare quanto segue:

  • Hai installato o aggiornato eksctl alla versione più recente.
  • Hai sostituito i valori segnaposto nei frammenti di codice con i tuoi valori.

Nota: la variabile --region non viene sempre utilizzata nei comandi perché viene utilizzato il valore predefinito per la tua Regione AWS. Controlla il valore predefinito eseguendo il comando di configurazione dell'interfaccia della linea di comando AWS (AWS CLI). Se devi cambiare la Regione AWS, usa il flag --region.

Nota: se ricevi errori durante l'esecuzione dei comandi di AWS CLI, conferma che stai eseguendo una versione recente di AWS CLI.

Risoluzione

Il pod Cluster Autoscaler è in stato CrashLoopBackOff

Controlla lo stato del pod Cluster Autoscaler eseguendo il seguente comando:

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

Di seguito è riportato un esempio di un pod Cluster Autoscaler con stato CrashLoopBackOff:

NAME                            READY   STATUS             RESTARTS      AGE
cluster-autoscaler-xxxx-xxxxx   0/1     CrashLoopBackOff   3 (20s ago)   99s

Visualizza i log del pod Cluster Autoscaler eseguendo il seguente comando:

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

Se i log indicano che ci sono problemi di autorizzazione di AWS Identity and Access Management (IAM), procedi come segue:

  • Verifica che un provider OIDC sia associato al cluster Amazon EKS.
  • Verifica che l'account del servizio Cluster Autoscaler sia annotato con il ruolo IAM.
  • Verifica che la policy IAM corretta sia collegata al ruolo IAM precedente.
  • Verifica che la relazione di fiducia sia configurata correttamente.

Nota: di seguito è riportato un esempio di log che indica i problemi relativi alle autorizzazioni IAM:

Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: xxx is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: xxxxxxxx

Importante: assicurati di controllare tutti i comandi AWS CLI forniti e di sostituire tutte le istanze di stringhe example con i tuoi valori. Ad esempio, sostituisci example-cluster con il tuo cluster.

Verifica che un provider OIDC sia associato al cluster EKS

1.    Verifica di disporre di un provider IAM OpenID Connect (OIDC) esistente per il tuo cluster eseguendo il seguente comando:

oidc_id=$(aws eks describe-cluster --name example-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

2.    Verifica che un provider IAM OIDC con l'ID del tuo cluster sia già nel tuo account eseguendo il seguente comando:

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

Nota: se viene restituito un output, allora possiedi già un provider IAM OIDC per il tuo cluster e puoi saltare il passaggio successivo. Se non viene restituito alcun output, è necessario creare un provider IAM OIDC per il cluster nel passaggio successivo.

3.    Crea un provider di identità IAM OIDC per il tuo cluster eseguendo il seguente comando:

eksctl utils associate-iam-oidc-provider --cluster example-cluster --approve

Verifica che l'account del servizio Cluster Autoscaler sia annotato con il ruolo IAM

Verifica che l'account del servizio sia annotato con il ruolo IAM eseguendo il seguente comando:

kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml

Il risultato previsto è il seguente:

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

Verifica che la policy IAM corretta sia allegata al ruolo IAM precedente

Per un esempio, vedi quanto segue:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingInstances",
        "autoscaling:SetDesiredCapacity",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeTags",
        "autoscaling:DescribeLaunchConfigurations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DescribeInstanceTypes",
        "autoscaling:TerminateInstanceInAutoScalingGroup"
      ],
      "Resource": "*"
    }
  ]
}

Verifica che la relazione di fiducia sia configurata correttamente

Per un esempio, vedi quanto segue:

{
  "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"
        }
      }
    }
  ]
}

Riavvia il pod Cluster Autoscaler quando viene apportata una modifica alla policy IAM o al ruolo dell'account di servizio.

Se i log indicano problemi di rete (ad esempio, timeout di I/O), procedi come segue:

Nota: di seguito è riportato un esempio di log che indica problemi di rete:

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

1.    Verifica che il cluster Amazon EKS sia configurato con la configurazione di rete richiesta. Verifica che la sottorete del nodo worker disponga di una tabella di instradamento in grado di indirizzare il traffico verso i seguenti endpoint, su endpoint globali o regionali:

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • Dimensionamento automatico AWS
  • Servizio di token di sicurezza AWS (AWS STS)

2.    Assicurati che la sottorete lista di controllo degli accessi alla rete o il gruppo di sicurezza del nodo worker non blocchino il traffico che comunica con questi endpoint.

3.    Se il cluster Amazon EKS è privato, controlla la configurazione degli endpoint cloud privato virtuale (VPC) pertinenti. Ad esempio, Amazon EC2, Dimensionamento automatico AWS e AWS STS.

Nota: il gruppo di sicurezza di ogni endpoint VPC è necessario per consentire il gruppo di sicurezza del nodo worker Amazon EKS. Inoltre, è necessario consentire il blocco CIDR VPC di Amazon EKS sulla porta 443 sul traffico in ingresso.

Cluster Autoscaler non sta scalando verticalmente o orizzontalmente i nodi

Se il tuo Cluster Autoscaler non sta scalando verticalmente o orizzontalmente i nodi, controlla quanto segue:

  • Controlla i log del pod Cluster Autoscaler.
  • Controlla i tag del gruppo con scalabilità automatica per Cluster Autoscaler.
  • Controlla la configurazione del manifesto di implementazione.
  • Controlla il numero attuale di nodi.
  • Controlla la richiesta di risorse del pod.
  • Controlla la configurazione di taint per il nodo nel gruppo di nodi.
  • Controlla se il nodo presenta un'annotazione scale-down-disable.

Controlla i log dei pod Cluster Autoscaler

Per visualizzare i log dei pod e identificare i motivi per cui Cluster Autoscaler non sta scalando verticalmente o orizzontalmente i nodi, esegui il seguente comando:

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

Verifica se il pod con stato Pending (in sospeso) contiene regole di pianificazione, come la regola di affinità, eseguendo il seguente comando di descrizione del pod:

kubectl describe pod <example_podname> -n <example_namespace>

Controlla la sezione events (eventi) dell'output. Questa sezione mostra informazioni sul motivo per cui un pod presenta uno stato "in sospeso".

Nota: Cluster Autoscaler rispetta nodeSelector e requiredDuringSchedulingIgnoredDuringExecution in nodeAffinity, supponendo che i gruppi di nodi siano stati etichettati di conseguenza. Se un pod non può essere pianificato con nodeSelector o requiredDuringSchedulingIgnoredDuringExecution, allora Cluster Autoscaler considera solo i gruppi di nodi che soddisfano tali requisiti per l'espansione. Modifica di conseguenza le regole di pianificazione definite sui pod o sui nodi in modo che un pod sia pianificato su un nodo.

Controlla i tag del gruppo con scalabilità automatica per Cluster Autoscaler

Affinché Cluster Autoscaler rilevi il gruppo con scalabilità automatica, il gruppo con scalabilità automatica corrispondente del gruppo di nodi deve presentare tag come segue:

Tag 1:

  • key: k8s.io/cluster-autoscaler/example-cluster
  • value: owned

Tag 2:

  • key: k8s.io/cluster-autoscaler/enabled
  • value: true

Controlla la configurazione del manifesto di implementazione

Per controllare la configurazione del manifesto di implementazione di Cluster Autoscaler, esegui il seguente comando:

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

Verifica che il manifesto sia configurato con l'argomento node-group-auto-discovery corretto come segue:

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

Controlla il numero attuale di nodi

Per controllare se il numero attuale di nodi ha raggiunto i valori minimi o massimi del gruppo di nodi gestito, esegui il comando seguente:

aws eks describe-nodegroup --cluster-name <example-cluster> --nodegroup-name <example-nodegroup>

Se vengono raggiunti i valori minimi o massimi, modificali con i nuovi requisiti del carico di lavoro.

Controlla la richiesta di risorse del pod

Per controllare se la richiesta di risorse del pod non può essere soddisfatta dai tipi di istanza del nodo attuali, esegui il seguente comando:

kubectl -n <example_namespace> get pod <example_podname> -o yaml | grep resources -A6

Per soddisfare la richiesta di risorse, modifica le richieste di risorse del pod o crea un nuovo gruppo di nodi. Quando crei un nuovo gruppo di nodi, assicurati che il tipo di istanza dei nodi sia in grado di soddisfare i requisiti di risorse per i pod.

Controlla la configurazione di taint per il nodo nel gruppo di nodi

Controlla se i taint sono configurati per il nodo e se il pod può tollerarli eseguendo il seguente comando:

kubectl describe node <example_nodename> | grep taint -A2

Se i taint sono configurati, rimuovi quelli definiti sul nodo. Se il pod non può tollerare i taint, definisci le tolleranze sul pod in modo che questo possa essere programmato sul nodo con i taint.

Controlla se il nodo presenta un'annotazione scale-down-disable

Per verificare che il nodo presenti un'annotazione scale-down-disable, esegui il seguente comando:

kubectl describe node <example_nodename> | grep scale-down-disable

Il risultato previsto è il seguente:

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

Se scale-down-disable è impostato su "true", rimuovi l'annotazione affinché il nodo possa ridursi eseguendo il seguente comando:

kubectl annotate node <example_nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled-

Per ulteriori informazioni sulla risoluzione dei problemi, consulta le domande frequenti su Cluster Autoscaler sul sito Web di GitHub.


AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa