Wie behebe ich Probleme beim Einrichten von Cluster-Autoscaler auf einem Amazon-EKS-Cluster?

Lesedauer: 8 Minute
0

Ich möchte Probleme beim Starten von Cluster-Autoscaler auf meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster beheben.

Kurzbeschreibung

Stellen Sie sicher, dass Sie Folgendes überprüfen, bevor Sie beginnen:

  • Sie haben eksctl installiert oder auf die neueste Version aktualisiert.
  • Sie haben die Platzhalterwerte in Codeausschnitten durch Ihre eigenen Werte ersetzt.

Hinweis: Die --region-Variable wird in den Befehlen nicht immer verwendet, da der Standardwert für Ihre AWS-Region verwendet wird. Überprüfen Sie den Standardwert, indem Sie den Befehl AWS Command Line Interface (AWS CLI) konfigurieren ausführen. Wenn Sie die AWS-Region ändern müssen, verwenden Sie das --region-Flag.

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, vergewissern Sie sich, dass Sie eine aktuelle Version der AWS-CLI ausführen.

Lösung

Der Cluster-Autoscaler-Pod befindet sich in einem CrashLoopBackOff-Status

Überprüfen Sie den Status des Cluster-Autoscaler-Pods, indem Sie den folgenden Befehl ausführen:

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

Das folgende Beispiel zeigt einen Cluster-Autoscaler-Pod, der sich im CrashLoopBackOff-Status befindet:

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

Zeigen Sie die Cluster-Autoscaler-Pod-Protokolle an, indem Sie den folgenden Befehl ausführen:

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

Wenn die Protokolle auf Probleme mit AWS Identity and Access Management (IAM)-Berechtigungen hinweisen, gehen Sie wie folgt vor:

  • Stellen Sie sicher, dass ein OIDC-Anbieter mit dem Amazon-EKS-Cluster verknüpft ist.
  • Stellen Sie sicher, dass das Cluster-Autoscaler-Service-Konto mit der IAM-Rolle annotiert ist.
  • Stellen Sie sicher, dass die richtige IAM-Richtlinie an die vorhergehende IAM-Rolle angefügt ist.
  • Stellen Sie sicher, dass das Vertrauensverhältnis korrekt konfiguriert ist.

Hinweis: Im Folgenden finden Sie ein Beispiel für ein Protokoll, das auf Probleme mit IAM-Berechtigungen hinweist:

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

Wichtig: Stellen Sie sicher, dass Sie alle angegebenen AWS CLI-Befehle überprüfen und alle Instances der Beispiel-Zeichenfolgen durch Ihre Werte ersetzen. Ersetzen Sie beispielsweise example-cluster durch Ihren Cluster.

Sicherstellen, dass ein OIDC**-Anbieter dem EKS-Cluster zugeordnet ist**

1.    Stellen Sie sicher, dass Sie über einen vorhandenen OpenID Connect (OIDC)-Anbieter von IAM für Ihren Cluster verfügen, indem Sie den folgenden Befehl ausführen:

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

2.    Stellen Sie sicher, dass ein IAM-OIDC-Anbieter mit der ID Ihres Clusters bereits in Ihrem Konto vorhanden ist, indem Sie den folgenden Befehl ausführen:

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

Hinweis: Wenn die Ausgabe zurückgegeben wird, verfügen Sie bereits über einen IAM-OIDC-Anbieter für Ihren Cluster und können den nächsten Schritt überspringen. Wenn keine Ausgabe zurückgegeben wird, müssen Sie im nächsten Schritt einen IAM-OIDC-Anbieter für Ihren Cluster erstellen.

3.    Erstellen Sie einen IAM-OIDC-Identitätsanbieter für Ihren Cluster, indem Sie den folgenden Befehl ausführen:

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

Sicherstellen, dass das Cluster-Autoscaler-Service-Konto mit der IAM-Rolle annotiert ist

Stellen Sie sicher, dass das Service-Konto mit der IAM-Rolle annotiert ist, indem Sie den folgenden Befehl ausführen:

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

Folgendes Ergebnis wird erwartet:

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

Sicherstellen, dass die richtige IAM-Richtlinie an die vorhergehende IAM-Rolle angefügt ist

Ein Beispiel finden Sie im Folgenden:

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

Sicherstellen, dass das Vertrauensverhältnis korrekt konfiguriert ist

Ein Beispiel finden Sie im Folgenden:

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

Starten Sie den Cluster-Autoscaler-Pod neu, wenn Änderungen an der Service-Konto-Rolle oder der IAM-Richtlinie vorgenommen werden.

Wenn die Protokolle auf Netzwerkprobleme hinweisen (z. B. E/A-Timeout), gehen Sie wie folgt vor:

Hinweis: Im Folgenden finden Sie ein Beispiel für ein Protokoll, das auf Netzwerkprobleme hinweist:

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.    Stellen Sie sicher, dass der Amazon-EKS-Cluster mit der erforderlichen Netzwerkkonfiguration konfiguriert ist. Stellen Sie sicher, dass das Subnetz des Worker-Knotens über eine Routing-Tabelle verfügt, die Datenverkehr an die folgenden Endpunkte weiterleiten kann, entweder auf globalen oder auf regionalen Endpunkten:

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • AWS Auto Scaling
  • AWS Security Token Service (AWS STS)

2.    Stellen Sie sicher, dass die Netzwerkzugriffssteuerungsliste (Netzwerk-ACL) des Subnetzes oder die Sicherheitsgruppe des Worker-Knotens den Datenverkehr, der mit diesen Endpunkten kommuniziert, nicht blockiert.

3.    Wenn der Amazon EKS-Cluster privat ist, überprüfen Sie die Einrichtung der relevanten Amazon Virtual Private Cloud (VPC)-Endpunkte. Zum Beispiel Amazon EC2, AWS Auto Scaling und AWS STS.

Hinweis: Die Sicherheitsgruppe jedes VPC-Endpunkts ist erforderlich, um die Sicherheitsgruppe des Amazon-EKS-Worker-Knotens zuzulassen. Es ist auch erforderlich, den CIDR-Block der Amazon-EKS-VPC auf Port 443 für den eingehenden Datenverkehr zuzulassen.

Cluster-Autoscaler skaliert keine Knoten ab oder auf

Wenn Ihr Cluster-Autoscaler die Knoten nicht ab- oder aufskaliert, überprüfen Sie Folgendes:

  • Überprüfen Sie die Cluster-Autoscaler-Pod-Protokolle.
  • Überprüfen Sie das Tagging der Auto-Scaling-Gruppen für den Cluster-Autoscaler.
  • Überprüfen Sie die Konfiguration des Bereitstellungsmanifests.
  • Überprüfen Sie die aktuelle Anzahl der Knoten.
  • Überprüfen Sie die Pod-Ressourcenanfrage.
  • Überprüfen Sie die Taint-Konfiguration für den Knoten in der Knotengruppe.
  • Überprüfen Sie, ob der Knoten mit der Knoten mit scale-down-disable annotiert ist.

Überprüfen der Cluster-Autoscaler-Pod-Protokolle

Führen Sie den folgenden Befehl aus, um die Pod-Protokolle anzuzeigen und die Gründe zu identifizieren, warum Ihr Cluster-Autoscaler keine Knoten ab- oder aufskaliert:

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

Überprüfen Sie, ob der Pod mit dem Status Ausstehend Planungsregeln enthält, wie z. B. die Affinitäts-Regel, indem Sie den folgenden Befehl zum Beschreiben des Pods ausführen:

kubectl describe pod <example_podname> -n <example_namespace>

Überprüfen Sie den Abschnitt Ereignisse in der Ausgabe. Dieser Abschnitt enthält Informationen darüber, warum sich ein Pod im Status „Ausstehend“ befindet.

Hinweis: Cluster Autoscaler berücksichtigt nodeSelector und requiredDuringSchedulingIgnoredDuringExecution in nodeAffinity, vorausgesetzt, Sie haben Ihre Knotengruppen entsprechend bezeichnet. Wenn ein Pod nicht mit nodeSelector oder requiredDuringSchedulingIgnoredDuringExecution geplant werden kann, berücksichtigt Cluster-Autoscaler nur Knotengruppen, die diese Anforderungen für die Erweiterung erfüllen. Ändern Sie die auf Pods oder Knoten definierten Zeitplanungsregeln entsprechend, damit ein Pod für einen Knoten geplant wird.

Überprüfen der Auto-Scaling-Gruppenkennzeichnung für den Cluster-Autoscaler

Die relevante Auto-Scaling-Gruppe der Knotengruppe muss wie folgt gekennzeichnet werden, damit der Cluster-Autoscaler die Auto-Scaling-Gruppe erkennen kann:

Tag 1:

  • Schlüssel: k8s.io/cluster-autoscaler/example-cluster
  • Wert: im Besitz

Tag 2:

  • Schlüssel: k8s.io/cluster-autoscaler/enabled
  • Wert: wahr

Überprüfen der Konfiguration des Bereitstellungsmanifests

Führen Sie den folgenden Befehl aus, um die Konfiguration des Cluster-Autoscaler-Bereitstellungsmanifests zu überprüfen:

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

Überprüfen Sie wie folgt, ob das Manifest mit dem richtigen node-group-auto-discovery-Argument konfiguriert ist:

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

Überprüfen der aktuellen Anzahl von Knoten

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die aktuelle Anzahl der Knoten die Mindest- oder Höchstwerte der verwalteten Knotengruppe erreicht hat:

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

Wenn die Mindest- oder Höchstwerte erreicht sind, ändern Sie die Werte entsprechend den neuen Workload-Anforderungen.

Überprüfen der Pod-Ressourcenanfrage

Um zu überprüfen, ob die Pod-Ressourcenanfrage nicht von den aktuellen Knoten-Instance-Typen erfüllt werden kann, führen Sie den folgenden Befehl aus:

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

Um die Ressourcenanfrage zu erfüllen, müssen Sie entweder die Pod-Ressourcenanfragen ändern oder eine neue Knotengruppe erstellen. Stellen Sie beim Erstellen einer neuen Knotengruppe sicher, dass der Instance-Typ des Knotens die Ressourcenanforderungen für Pods erfüllen kann.

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

Überprüfen Sie, ob Taints für den Knoten konfiguriert sind und ob der Pod die Taints zulassen kann, indem Sie den folgenden Befehl ausführen:

kubectl describe node <example_nodename> | grep taint -A2

Wenn die Taints konfiguriert sind, entfernen Sie die auf dem Knoten definierten Taints. Wenn der Pod keine Taints zulässt, definieren Sie Toleranzen für den Pod, damit der Pod auf dem Knoten mit den Taints geplant werden kann.

Überprüfen, ob der Knoten mit scale-down-disable annotiert ist

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der Knoten mit scale-down-disable annotiert ist:

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

Folgendes Ergebnis wird erwartet:

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

Wenn scale-down-disable auf „wahr“ festgelegt ist, entfernen Sie die Annotation für den Knoten, damit er herunterskaliert werden kann, indem Sie den folgenden Befehl ausführen:

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

Weitere Informationen zur Fehlerbehebung finden Sie unter Häufig gestellte Fragen zu Cluster-Autoscaler auf der GitHub-Website.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr