Direkt zum Inhalt

Wie behebe ich Skalierungsprobleme mit meinem Amazon ECS-Kapazitätsanbieter?

Lesedauer: 6 Minute
0

Ich habe einen Kapazitätsanbieter für meinen Amazon Elastic Container Service (Amazon ECS)-Cluster mit dem Starttyp Amazon Elastic Compute Cloud (Amazon EC2) erstellt. Der Kapazitätsanbieter lässt sich jedoch nicht wie erwartet skalieren.

Kurzbeschreibung

Die folgenden Probleme führen dazu, dass der Amazon EC2-Kapazitätsanbieter nicht automatisch ab- oder aufskaliert:

  • Du hast den Amazon ECS-Service nicht mit dem Kapazitätsanbieter verknüpft.
  • Du hast die Skalierungsrichtlinien des Kapazitätsanbieters nicht mit der Amazon EC2 Auto-Scaling-Gruppe verknüpft.
  • Du hast den Prozentsatz der Zielkapazität nicht richtig konfiguriert.
  • Du verwendest die verwaltete Skalierung für den Kapazitätsanbieter, und die benutzerdefinierten Skalierungsrichtlinien sind der EC2 Auto-Scaling-Gruppe zugeordnet.
  • Die Amazon EC2 Auto-Scaling-Gruppe hat die Container-Instance gestartet, kann aber dem Cluster nicht beitreten.
  • Deine Container-Instances können nicht ab- oder aufskaliert werden.
  • Der Kapazitätsanbieter befindet sich im Status Fehlgeschlagen.
  • Die Auto-Scaling-Gruppe steckt in einer Skalierungsschleife fest.

Lösung

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 von AWS CLI verwendest.

Überprüfe, ob du den Amazon ECS-Service mit dem Kapazitätsanbieter verknüpft hast

Um zu überprüfen, ob du den Amazon ECS-Service mit dem Kapazitätsanbieter verknüpft hast, führe den folgenden AWS CLI-Befehl describe-services aus:

aws ecs describe-services --cluster example-cluster --services example-service --region example-region --query 'services[].capacityProviderStrategy'

Hinweis: Ersetze example-cluster durch deinen Clusternamen, example-service durch deinen Service-Namen und example-region durch deine AWS-Region.

Wenn du den Amazon ECS-Service mit dem Kapazitätsanbieter verknüpft hast, erhältst du eine Ausgabe, die dem folgenden Beispiel ähnlich ist:

[  
  [
    {
      "capacityProvider": "example-capacity-provider",
      "weight": 1,
      "base": 1
    }
  ]
]

Vergewissere dich, dass der Wert von capacityProviderStrategy nicht [] ist.

Führe den folgenden update-service-Befehl aus, um einen Kapazitätsanbieter zum Service hinzuzufügen:

aws ecs update-service --cluster example-cluster --service example-service --region example-region --capacity-provider-strategy capacityProvider=capacity-provide-name,weight=weight-value,base=base-value --force-new-deployment

Hinweis: Ersetze example-cluster durch deinen Clusternamen, example-service durch deinen Servicenamen, example-region durch deine Region und capacity-provider-name durch den Namen deines Kapazitätsanbieters. Ersetze außerdem weight-value durch die Gesamtzahl der Aufgaben, die den Kapazitätsanbieter nutzen, und base-value durch die Mindestanzahl der Aufgaben, die der Kapazitätsanbieter ausführen muss.

Du kannst auch die Amazon ECS-Konsole verwenden, um den Service zu aktualisieren.

Vergewissere dich, dass die Skalierungsrichtlinien des Kapazitätsanbieters mit der Auto-Scaling-Gruppe verknüpft sind

Wenn du einen Kapazitätsanbieter mit einer Auto-Scaling-Gruppe verknüpfst, erstellt Amazon ECS eine Skalierungsrichtlinie, die die Kapazität auf der Grundlage der Cluster-Last ändert.

Um Probleme mit der Skalierungsrichtlinie zu beheben, überprüfe die AWS CloudTrail-Ereignisse für die API-Aufrufe PutScalingPolicy, UpdateAutoScalingGroup, CreateCapacityProvider und UpdateCapacityProvider. Vergewissere dich, dass die Richtlinie mit der Auto-Scaling-Gruppe verknüpft werden kann und dass der Kapazitätsanbieter wie erwartet funktioniert.

Um zu überprüfen, ob es sich bei der Auto-Scaling-Gruppe um einen Cluster-Anhang handelt, führe den folgenden Befehl describe-cluster aus:

aws ecs describe-clusters --clusters example-cluster --include ATTACHMENTS --region example-region --query 'clusters[].attachments[]'

Hinweis: Ersetze example-cluster durch deinen Clusternamen und example-region durch deine Region.

Beispielausgabe:

[  
  {
    "id": "100a23456-5f0b-4abc-b998-d6789d111a",
    "type": "as_policy",
    "status": "CREATED",
    "details": [
      {
        "name": "capacityProviderName",
        "value": "example-capacityProvider"
      },
      {
        "name": "scalingPlanName",
        "value": "ECSManagedAutoScalingPlan-bb60c8fa-3ed7-4808-b39c-abcdef2345"
      }
    ]
  }
]

Wenn du eine verwaltete Skalierungsrichtlinie verwendest, führe die folgenden Schritte aus, um zu überprüfen, ob du die Richtlinie der Auto-Scaling-Gruppe angehängt hast:

  1. Öffne die Amazon-ECS-Konsole.
  2. Wähle im Navigationsbereich die Option Cluster aus.
  3. Wähle deinen Cluster aus.
  4. Wähle die Registerkarte Infrastruktur aus.
  5. Wähle die Registerkarte Kapazitätsanbieter aus.
  6. Wähle deine Auto-Scaling-Gruppe aus.
    Hinweis: Diese Aktion leitet dich zur Seite Auto-Scaling-Gruppen in der Amazon EC2-Konsole weiter.
  7. Wähle die Registerkarte Auto Scaling aus.
  8. Wähle Aktionen, und dann Dynamische Skalierungsrichtlinie bearbeiten aus.
  9. Prüfe im Feld Benutzerdefinierte Metrik JSON, ob die Richtlinie die Metrik CapacityProviderReservation enthält.

Die Konfiguration deiner Zielkapazität in Prozent prüfen

Überprüfe die Amazon CloudWatch-Metrik CapacityProviderReservation für deinen Kapazitätsanbieter, um die Nutzung seiner Container-Instances zu verfolgen. Die mit der Auto-Scaling-Gruppe verbundene Zielverfolgungs-Skalierungsrichtlinie passt die Anzahl der ausgeführten Instances an, um zu vergewissern, dass CapacityProviderReservation dem Kapazitätszielwert entspricht. Wenn du zum Beispiel die Zielkapazität auf 100 % setzt, verwendet Amazon ECS alle Instances und skaliert die Instances ab, die keine Aufgaben ausführen.

Um zusätzliche Kapazität einzurichten, aktualisiere die Zielkapazität auf einen Wert, der kleiner als 100 ist.

Vergewissere dich, dass die Instance, die von der Auto-Scaling-Gruppe gestartet wurde, dem Cluster beitreten kann

Wenn deine Instance dem Cluster nicht beitreten kann, siehe Warum kann meine Amazon EC2-Instance dem Amazon ECS-Cluster nicht beitreten?

Vergewissere dich, dass deine Container-Instances nicht vor Abskalierungs- oder Herunterskalierungs-Aktionen geschützt sind

Bei Kapazitätsanbietern, die einen verwalteten Beendigungsschutz verwenden, blockiert Amazon ECS das Beenden von Amazon EC2-Instances mit Aufgaben während einer Abskalierungsaktion.

Um alle ausgeführten Aufgaben zu stoppen und der Auto-Scaling-Gruppe zu erlauben, die EC2-Instance zu beenden, verwende die Amazon ECS-Konsole, um die Instance zu entleeren. Alternativ kannst du den folgenden update-container-instances-state-Befehl ausführen:

aws ecs update-container-instances-state --cluster example-cluster --container-instances example-container --status DRAINING --region example-region

Hinweis: Ersetze example-cluster durch deinen Clusternamen, example-container durch deine Container-Instance, und example-region durch deine Region.

Wenn die Aufgaben nach dem Entleeren immer noch auf der Container-Instance ausgeführt werden, siehe Wie behebe ich Amazon ECS-Aufgaben, deren Beendigung lange dauert, wenn die Container-Instance auf DRAINING gesetzt ist?

Weitere Informationen zur Fehlerbehebung bei Problemen mit dem verwalteten Kündigungsschutz findest du unter Wie kann ich die Einstellung für den verwalteten Beendigungsschutz für den Kapazitätsanbieterfehler in Amazon ECS beheben?

Wenn Skalierungsschutzmaßnahmen die Herunterskalierungs-Aktionen in deiner Instance blockieren, erhältst du die folgende Fehlermeldung im Auto-Scaling-Aktivitätsverlauf:

„Could not scale to desired capacity because all remaining instances are protected from scale-in.“

Überprüfe dein Tooling oder Tools von Drittanbietern wie Terraform oder GitLab, um dieses Problem zu lösen. Vergewissere dich, dass sie das AmazonECSManaged-Tag nicht aus der Auto-Scaling-Gruppe entfernen. Amazon ECS benötigt dieses Tag zur Verwaltung der Skalierung. Um zu prüfen, ob das AmazonECSManaged-Tag fehlt, überprüfe deinen CloudTrail-Ereignisverlauf auf das Ereignis SetInstanceProtection. Wenn du SetInstanceProtection siehst, musst du das Tag wieder hinzufügen zu deiner Auto-Scaling-Gruppe.

Überprüfe den Status deines Kapazitätsanbieters

Wenn du einen Kapazitätsanbieter verwendest, empfiehlt es sich, eine neue Auto-Scaling-Gruppe zu erstellen und eine vorhandene Gruppe nicht wiederzuverwenden. Instances im Status Wird ausgeführt, die der vorhandenen Gruppe zugeordnet und in einem Amazon ECS-Cluster registriert sind, werden möglicherweise nicht korrekt registriert.

Um den Status des Kapazitätsanbieters anzuzeigen, führe den Befehl describe-capacity-providers aus:

aws ecs describe-capacity-providers \
--capacity-providers MyCapacityProvider

Wenn der Status des Kapazitätsanbieters INACTIVE ist, wurde der Kapazitätsanbieter gelöscht.

Überprüfe auch die CloudTrail-Ereignisse auf Fehler, die mit der CreateCapacityProvider-API zusammenhängen.

Vergewissere dich, dass die Auto-Scaling-Gruppe nicht in einer Skalierungsschleife stecken bleibt

Wenn die Zielkapazität, die du in deiner Amazon ECS-Service-Skalierungsrichtlinie angegeben hast, übersteigt, skaliert die Auto-Scaling-Gruppe auf und startet Instances. Sinkt der Metrikwert jedoch nach dem plötzlichen Anstieg, skaliert die Auto-Scaling-Gruppe in den Instances ab. Wenn die Zielkapazität innerhalb eines kurzen Zeitraums häufig schwankt, bleibt die Auto-Scaling-Gruppe in einer Skalierungsschleife stecken. Um dieses Problem zu vermeiden, konfiguriere den Zielkapazitätswert so, dass er deiner Workload entspricht.

Ähnliche Informationen

Eingehende Analyse der automatischen Skalierung von Amazon ECS-Clustern

Wie behebe ich Fehler, wenn ich einen Kapazitätsanbieter in Amazon ECS lösche?

Amazon ECS-Cluster für den AWS Fargate-Starttyp

AWS OFFICIALAktualisiert vor einem Jahr