
Ich habe eine verwaltete Instanzgruppe mit automatischer Skalierung.
Jede Instanz führt ein Programm aus, das eine Remote-Site abfragt: „Haben Sie Arbeit für mich?“ Wenn die Antwort „nein“ lautet, wird das Programm für einige Sekunden in den Ruhezustand versetzt und wiederholt dies. Wir betrachten dies alsLeerlaufInstanz. Andernfalls erhält es Anweisungen, was zu tun ist, markiert sich selbstbeschäftigt, tut, was es tun muss (das kann zwischen ein paar Minuten und ein paar Stunden dauern), gibt die Ergebnisse zurück und wird wiederLeerlauf.
Ich möchte, dass der Autoscaler sicherstellt, dass es immer mindestens einen gibtLeerlaufInstanz, damit es alle verfügbaren Aufgaben übernehmen kann. Es kann nicht CPU-basiert sein, da die Jobs viel Zeit damit verbringen können, nicht wirklich viel CPU zu verwenden, oder sie verfügen möglicherweise nicht über genügend Parallelität, um alle Kerne zu verwenden, und so weiter.
Wenn es dem Autoscaler möglich wäre, einen beliebigen Metrikserver nach einer bestimmten Metrik zu durchsuchen, wäre das Leben einfach: Jede Instanz führt bereits einen Prometheus-Knotenexporteur aus, sodass sie eine Metrik wieist beschäftigt, auf 0 oder 1 gesetzt, die Prometheus dann aggregieren, 1 zur Summe hinzufügen und als Metrik exportieren kann, die der Autoscaler verwenden könnte. Aber das ist nicht möglich.
In der Dokumentation von Google zur Verwendung von Prometheus-Metriken für den Autoscaler wird, obwohl sie auf der GCE MIG-Seite verlinkt ist, nur beschrieben, wie dies fürKubernetesAutoscaling, was ich hier natürlich nicht verwende.
Ich habe bereits darüber nachgedacht, Instanzen eine benutzerdefinierte Stackdriver-Metrik erstellen zu lassen, die sie aktualisieren, aber wenn die Instanz stirbt, bevor ihre Metrik auf 0 aktualisiert wurde, wird sie nie zurückgesetzt, sodass der Autoscaler nichts davon erfährt.
Das kann unmöglich sehr schwierig oder sehr ungewöhnlich sein (entweder das, oder mir fallen nicht die richtigen Suchbegriffe ein :( ). Irgendwelche Vorschläge?