Direkt zum Inhalt

Wie behebe ich Probleme, wenn ich Cluster Autoscaler auf einem Amazon EKS-Cluster einrichte?

Lesedauer: 9 Minute
0

Ich möchte Probleme beheben, wenn ich Cluster Autoscaler auf meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster starte.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Die Befehle in der folgenden Auflösung verwenden nicht das Flag --region, da sie die standardmäßige AWS-Region verwenden. Um deine Standardregion zu überprüfen, führe den folgenden AWS-CLI-Befehl configure aus:

aws configure

Um die Region zu ändern, verwende das Flag --region.

Voraussetzungen: Installiere oder aktualisiere eksctl auf die neueste Version. Anweisungen findest du unter Installation auf der eksctl-Website.

Ergreife je nach dem Problem, auf das du stößt, die folgenden Maßnahmen zur Problembehebung. Um Probleme mit Probes zu beheben, siehe Wie behebe ich Probleme mit Liveness- und Readiness-Probes in meinen Amazon EKS-Clustern?

Cluster Autoscaler Pod befindet sich in einem „CrashLoopBackOff“-Status

Gehe wie folgt vor, um den Status „CrashLoopBackOff“ zu beheben:

  1. Führe den folgenden Befehl aus, um den Cluster-Autoscaler-Pod-Status zu überprüfen:

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

    Beispielausgabe:

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. Um Details darüber zu erhalten, warum der Pod im Status „CrashLoopBackOff“ feststeckt, führe den folgenden Befehl aus:

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

    Hinweis: Ersetze cluster-autoscaler-abcd-abcde durch den Namen des Cluster Autoscaler Pods.
    Überprüfe in der Ausgabe den Wert für Reason. Wenn du ein OOMKilled-Problem feststellst, verwende den Befehl kubectl edit, um die Werte für limits und requests für Speicherressourcen in der Cluster-Autoscaler-Bereitstellung zu erhöhen. Weitere Informationen zu kubectl edit findest du unter kubectl edit auf der Kubernetes-Website. Die Standard-Speicherwerte für den Cluster Autoscaler findest du unter cluster-autoscaler-autodiscover.yaml auf der GitHub-Website.
    Beispielausgabe:

    Name:               cluster-autoscaler-abcd-abcde
    Namespace:          kube-system
    State:              Waiting
    Reason:             CrashLoopBackOff
    Last State:         Terminated
    Reason:             OOMKilled
    Exit Code:          137
    ...
  3. Führe den folgenden Befehl aus, um die Cluster-Autoscaler-Pod-Protokolle auf Probleme zu überprüfen:

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

    Wenn die Protokolle Probleme mit den AWS Identity and Access Management (IAM)-Berechtigungen anzeigen, fahre mit Cluster Autoscaler Pod hat Probleme mit IAM-Berechtigungen fort. Beispielausgabe:

    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

    Wenn die Protokolle Netzwerkprobleme wie I/O-Timeout anzeigen, fahre mit Cluster Autoscaler Pod hat Netzwerkprobleme fort. Beispielausgabe:

    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

Cluster Autoscaler Pod hat Probleme mit IAM-Berechtigungen

Prüfe, ob du dem Cluster einen OIDC-Anbieter zugeordnet hast

Stelle sicher, dass du einen OpenID Connect (OIDC)-Anbieter für deinen Cluster erstellt hast.

Prüfe, ob du das Cluster-Autoscaler-Servicekonto mit der IAM-Rolle annotiert hast

Führe den folgenden Befehl aus, um die Anmerkungen deines AWS-Servicekontos zu überprüfen:

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

Überprüfe die Anmerkungen, um sicherzustellen, dass die Ausgabe deine Cluster-Autoscaler-Servicekonto-Rolle auflistet. Beispielausgabe:

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

Um Probleme mit deiner Servicekonto-Rolle zu beheben, siehe Wie behebe ich Probleme bei einem OIDC-Anbieter und IRSA in Amazon EKS?

Überprüfe die IAM-Richtlinie

Stelle sicher, dass du die richtige IAM-Richtlinie an die Cluster-Autoscaler-Serivcekonto-Rolle angehängt hast. Eine Beispielrichtlinie und eine Liste der erforderlichen Berechtigungen findest du in der IAM-Richtlinie auf der GitHub-Website.

Prüfe, ob du die Vertrauensbeziehung richtig konfiguriert hast

Stelle sicher, dass du die Vertrauensbeziehung richtig konfiguriert hast. Beispiel für eine Vertrauensbeziehung:

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

Hinweis: Ersetze example_awsaccountid durch deine AWS-Konto-ID, example_region durch deine Region und example_oidcid durch deine OIDC-ID.

Jedes Mal, wenn du die Rolle oder Richtlinie des Servicekontos änderst, führe den folgenden Befehl aus, um den Cluster Autoscaler Pod neu zu starten:

kubectl rollout restart deployment cluster-autoscaler -n kube-system

Cluster Autoscaler Pod hat Netzwerkprobleme

Stelle sicher, dass du den Amazon EKS-Cluster mit der erforderlichen Netzwerkeinrichtung konfiguriert hast. Stelle sicher, dass das Worker-Knoten-Subnetz über eine Routing-Tabelle verfügt, die den Datenverkehr an die folgenden Endpunkte weiterleiten kann:

Wenn der Amazon EKS-Cluster privat ist, musst du einen Amazon Virtual Private Cloud (Amazon VPC)-Endpunkt für die oben genannten Endpunkte erstellen.

Hinweis: Die Sicherheitsgruppe jedes VPC-Endpunkts muss die Amazon EKS-Worker-Knoten-Sicherheitsgruppe zulassen. Die Sicherheitsgruppen müssen außerdem eingehenden Datenverkehr zum Amazon EKS VPC CIDR-Block auf Port 443 zulassen.

Stelle sicher, dass die Netzwerk-Zugriffssteuerungsliste (Netzwerk-ACL) des Subnetzes und die Sicherheitsgruppen der Worker-Knoten den Datenverkehr zu diesen Endpunkten nicht blockieren.

Cluster Autoscaler skaliert keine Knoten ab oder auf

Überprüfe die Cluster-Autoscaler-Pod-Protokolle auf die Planungsregeln

Führe den folgenden Befehl aus, um den Status deiner Pods zu überprüfen:

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

Führe den folgenden Befehl aus, um zu überprüfen, ob der Pod mit dem Status Ausstehend Planungsregeln wie die Affinitätsregel enthält:

kubectl describe pod example_podname -n example_namespace

Hinweis: Ersetze example_podname durch den Pod-Namen und example_namespace durch deinen Namespace.

In der Ausgabe findest du im Abschnitt Ereignisse Informationen darüber, warum der Pod den Status Ausstehend hat. Beispielausgabe:

$ 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.

Hinweis: Cluster Autoscaler berücksichtigt nodeSelector und requiredDuringSchedulingIgnoredDuringExecution in nodeAffinity. Stelle sicher, dass du deine Knotengruppen mit diesen Werten kennzeichnest. Führe den folgenden Befehl aus, um deine Knotengruppen zu kennzeichnen:

kubectl get nodes --show-labels

Wenn Cluster Autoscaler keinen Pod mit nodeSelector oder requiredDuringSchedulingIgnoredDuringExecution planen kann, verwendet der Cluster Autoscaler nur Knotengruppen, die die Erweiterungsanforderungen erfüllen. Um einen Pod auf einem Knoten zu planen, musst du die auf den Pods oder Knoten definierten Planungsregeln ändern. Weitere Informationen findest du unter Affinität und Anti-Affinität auf der Kubernetes-Website.

Überprüfe das Amazon EC2-Auto-Scaling-Gruppen-Tagging für den Cluster Autoscaler

Damit der Cluster Autoscaler eine Auto-Scaling-Gruppe erkennt, musst du die Amazon EC2-Auto-Scaling-Gruppe der Knotengruppe mit den folgenden Tags kennzeichnen.

Konfiguriere für Tag 1 die folgenden Werte:

  • Gib unter Schlüssel k8s.io/cluster-autoscaler/example-cluster ein.
  • Gib unter Wert owned ein.

Hinweis: Ersetze example-cluster durch deinen Cluster-Namen.

Konfiguriere für Tag 2 die folgenden Werte:

  • Gib unter Schlüssel k8s.io/cluster-autoscaler/enabled ein.
  • Gib unter Wert true ein.

Überprüfe die Konfiguration des Bereitstellungsmanifests

Führe den folgenden Befehl aus, um das Bereitstellungsmanifest zu öffnen:

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

Stelle in der Ausgabe für node-group-auto-discover sicher, dass das Manifest den richtigen Cluster- oder Knotengruppennamen auflistet. Beispielausgabe:

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

Stelle sicher, dass du deine maximale Anzahl an Knoten nicht überschreitest

Führe den folgenden Befehl describe-nodegroup aus, um die aktuelle Anzahl von Knoten zu überprüfen:

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

Hinweis: Ersetze example-cluster durch deinen Cluster-Namen und example-nodegroup durch deinen Knotengruppennamen.

Wenn du die minimale oder maximale Anzahl von Knoten erreicht hast, führe den folgenden Befehl update-nodegroup-config aus, um die Werte zu ändern:

aws eks update-nodegroup-config \
    --cluster-name cluster-name \
    --nodegroup-name nodegroup-name \
    --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \

Hinweis: Ersetze cluster-name durch deinen Cluster-Namen und nodegroup-name durch deinen Knotengruppennamen. Ersetze außerdem minvalue durch die minimale Anzahl von Knoten, maxvalue durch die maximale Anzahl von Knoten und desiredvalue durch den gewünschten Wert von Knoten.

Stelle sicher, dass deine Knoten dem Cluster beitreten können

Prüfe, ob die neuen Instances, die die Amazon EC2-Auto-Scaling-Gruppe startet, dem Amazon EKS-Cluster beitreten können. Falls nicht, findest du weitere Informationen unter Wie bringe ich meine Worker-Knoten dazu, meinem Amazon EKS-Cluster beizutreten?

Stelle sicher, dass du den richtigen Knoten-Instance-Typ verwendest

Führe den folgenden Befehl aus, um zu überprüfen, ob Cluster Autoscaler die Pod-Ressourcenanforderung mit den aktuellen Knoten-Instance-Typen erfüllen kann:

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

**Hinweis:**Ersetze example-cluster durch deinen Cluster-Namen und example-podname durch deinen Pod-Namen.

Beispielausgabe:

 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

Überprüfe in der Ausgabe die Werte für limits und requests. Stelle sicher, dass die Werte für cpu und memory hoch genug sind, damit der Knoten den Pod behalten kann. Führe den folgenden Befehl aus, um die Anforderungen deines Pods anzuzeigen:

kubectl describe pod podname -n namespace,

Hinweis: Ersetze podname durch deinen Pod-Namen und namespace durch deinen Namespace.

Wenn die Pod-Anforderungen höher sind als die Fähigkeiten des Knotens, verwende den Befehl kubectl edit, um die Werte für limits und requests für Speicherressourcen in der Cluster-Autoscaler-Bereitstellung zu erhöhen. Oder erstelle eine neue Knotengruppe mit einem anderen Instance-Typ, der die Ressourcenanforderungen des Pods erfüllt. Weitere Informationen zu kubectl edit findest du unter kubectl edit auf der Kubernetes-Website.

Überprüfe die Taint-Konfiguration für den Knoten in der Knotengruppe

Führe den folgenden Befehl aus, um zu überprüfen, ob du Taints für den Knoten konfiguriert hast und der Pod die Taints tolerieren kann:

kubectl describe node example_nodename | grep taint -A2

Hinweis: Ersetze example_nodename durch deinen Knotennamen.

Wenn du Taints konfiguriert hast, entferne die auf dem Knoten definierten Taints. Schritte findest du unter Dein Pod befindet sich im Status Ausstehend unter Wie kann ich den Pod-Status in Amazon EKS beheben? Wenn der Pod keine Taints toleriert, definiere die Toleranz auf dem Pod. Weitere Informationen findest du unter Taints and Tolerations auf der Kubernetes-Website.

Stelle sicher, dass für den Knoten das Herunterskalieren nicht deaktiviert ist

Führe den folgenden Befehl aus, um den Status von scale-down-disable auf deinem Knoten zu überprüfen:

kubectl describe node example_nodename | grep scale-down-disable

Hinweis: Ersetze example_nodename durch deinen Knotennamen.

Beispielausgabe:

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

Wenn scale-down-disable auf true gesetzt ist, führe den folgenden Befehl aus, um die Anmerkung für den Knoten zu entfernen und ihn herunterskalieren zu lassen:

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

Hinweis: Ersetze example_nodename durch deinen Knotennamen.

Weitere Schritte zur Fehlerbehebung bei Cluster Autoscaler findest du unter Häufig gestellte Fragen auf der GitHub-Website.

AWS OFFICIALAktualisiert vor einem Jahr