Label Selector Tester · Kubernetes
Sehen, welche Pods Ihr Selector trifft — und warum.
Fügen Sie die Pods und den Selector ein — einen kubectl -l-String oder einen matchLabels / matchExpressions-Block — und erhalten Sie pro Ressource ein Urteil samt der Klausel, die es entschieden hat. Inklusive der Regel, die fast alle verdreht beantworten: NotIn und != treffen auf eine Ressource zu, die überhaupt kein solches Label hat.
Läuft in Ihrem Browser — nichts, was Sie einfügen, verlässt diese Seite. Wie wir das belegen
Kubernetes Label Selector Tester Playground
Equality-based clauses (=, !=) and set-based ones (in, notin, a bare key, !key) can be mixed freely in one -l string — commas mean AND. A Deployment's spec.selector accepts both forms but is immutable after creation; a Service's spec.selector is a plain label map and supports equality only.
Results update as you type — press Enter to run now.
Paste one manifest, a --- stream, a kind: List or a YAML list. Press Esc to release keyboard focus from the editor; ⌘/Ctrl + Enter runs and leaves it. Nothing you paste is uploaded.
Paste the resources above — or tap an example — to see, per resource, whether the selector matches it and which clause decided.
Die Lücke
Ein Selector, der nichts trifft, ist nirgends in Kubernetes ein Fehler.
kubectl apply nimmt ihn an. Der API-Server nimmt ihn an. Kein Controller loggt eine Warnung, kein Event wird erzeugt, kein Feld wird als ungültig markiert. Das einzige Symptom eines Service, dessen Selector seine Pods um ein Zeichen verpasst, ist ein Endpoints-Objekt ohne Adressen — und wer darauf schaut, debuggt schon an der falschen Stelle. Dieselbe Stille deckt eine NetworkPolicy ab, deren podSelector nichts auswählt: sie fällt genau so offen aus, wie eine Sicherheitsmaßnahme es nicht sollte.
Die Regeln selbst sind die zweite Hälfte des Problems, weil zwei von ihnen sich umgekehrt lesen. env!=prod trifft auf einen Pod zu, der überhaupt kein env-Label hat — NotIn wird von einem fehlenden Key erfüllt, absichtlich, in einem Zweig von Requirement.Matches. Und ein leerer Selector trifft auf alles zu, ein nil-Selector auf nichts. Beides ist je eine Zeile Go, und beides wird regelmäßig andersherum erinnert.
Deshalb ist das hier ein Werkzeug und kein Blogartikel. Fragen Sie einen Assistenten „trifft env!=prod auf einen Pod ohne env-Label zu“, und Sie bekommen eine flüssige Antwort mit einer 50-zu-50-Chance, falsch zu sein — und generierte Manifeste stecken matchExpressions regelmäßig in spec.selector eines Service, ein Feld, das nur eine einfache Label-Map akzeptiert. Fügen Sie die Behauptung hier ein, und die Antwort kommt aus derselben Semantik, die apimachinery implementiert, mit Begründung, in einem Tab, der nichts irgendwohin sendet.
Sie wollen den Workload dimensionieren statt auswählen? Kubernetes Resource Calculator summiert Requests und Limits über Replicas, und Env Example Checker findet die Variablen, die ein Container erwartet, aber nie bekommt.
Die Pipeline
So funktioniert es.
Vier Schritte, alle in Ihrem Browser-Tab, bei jeder Eingabe neu ausgeführt.
-
Den Selector so parsen wie apimachinery.
Die `-l`-Grammatik läuft durch einen Port ihres eigenen Lexers und Parsers — kontextsensitiv, sodass `op in (in,notin)` erlaubt ist, und tolerant gegenüber Leerraum, sodass `env in ( prod , dev )` derselbe Selector ist. Strukturierte Selectors folgen stattdessen den Regeln von `LabelSelectorAsSelector`.
-
Lesen, was in der Zwischenablage steckt.
Ein Manifest, ein `---`-Strom, ein `kind: List` oder eine YAML-Liste. Die `spec.template.metadata.labels` eines Workloads werden zu einer eigenen Zeile, denn ein Service wählt Pod-Labels aus und nicht die des Deployments.
-
Klausel für Klausel auswerten.
`Requirement.Matches`, einmal pro Ressource und Klausel: `In` braucht den Key, `NotIn` wird von einem fehlenden Key erfüllt, `Exists` akzeptiert einen leeren Wert, `DoesNotExist` nicht.
-
Den Grund zeigen, nicht nur das Urteil.
Jede Klausel trägt den Satz, der sie entschieden hat, und nennt den tatsächlichen Label-Wert. Die Treffer über einen fehlenden Key bekommen eine bernsteinfarbene Anmerkung — das sind die, die Menschen und Sprachmodelle verdreht beantworten.
Referenz
Jeder Operator — und was ein fehlender Key bewirkt.
Sieben Schreibweisen für eine Klausel, vier Operatoren dahinter, und die Spalte, die fast nie neben der Syntax steht: was passiert, wenn die Ressource den Key gar nicht trägt. Drei der sieben treffen in diesem Fall zu.
| Geschrieben als | Operator | Strukturierte Form | Key fehlt |
|---|---|---|---|
| key=value | In | matchLabels: {key: value} Ein Wert. `=` und `==` sind derselbe Operator. | kein Treffer |
| key==value | In | matchLabels: {key: value} Identisch zu `=`; nur die Schreibweise bleibt erhalten. | kein Treffer |
| key!=value | NotIn | operator: NotIn, values: [value] Der, den man verdreht. Ein fehlender Key erfüllt ihn. | TRIFFT ZU |
| key in (a,b) | In | operator: In, values: [a, b] Mindestens ein Wert ist Pflicht; die Menge wird dedupliziert und sortiert. | kein Treffer |
| key notin (a,b) | NotIn | operator: NotIn, values: [a, b] Dieselbe Regel für fehlende Keys wie `!=`, denn es ist derselbe Operator. | TRIFFT ZU |
| key | Exists | operator: Exists Jeder Wert, auch die leere Zeichenkette. Values sind verboten. | kein Treffer |
| !key | DoesNotExist | operator: DoesNotExist Scheitert, wenn der Key mit leerem Wert vorhanden ist — vorhanden bleibt vorhanden. | TRIFFT ZU |
„Hat das Label, und es ist nicht prod“
Eine Klausel kann das nicht sagen. env!=prod nimmt auch jede Ressource ohne env-Label mit. Stellen Sie Exists daneben — Kommas bedeuten UND.
# nimmt auch Pods ohne Label mit
kubectl get pods -l 'env!=prod'
# hat ein env-Label, und es ist nicht prod
kubectl get pods -l 'env,env!=prod' Der leere Selector, dreimal
Leer heißt alles; nil heißt nichts; und ein Service lässt das Feld weg, wenn es leer ist — damit bleibt er ohne verwaltete Endpoints.
# jeder Pod im Namespace
podSelector: {}
# wieder jede Ressource
selector:
matchLabels: {}
# ein Service OHNE Selector: die Endpoints
# verwalten Sie selbst
spec:
ports: [{ port: 80 }] Der Zaun
Was es bewusst nicht tut.
Jeder dieser Punkte wurde geprüft und verworfen, weil die Alternative eine plausible Antwort gewesen wäre, die falsch sein kann. Ein Tester, den man nicht prüfen kann, ist ein Tester, dem man glauben muss.
Field-Selectors
Ein anderer Mechanismus mit einer Erlaubnisliste indexierter Felder pro Art und pro Version, meist ohne mengenbasierte Operatoren. Ihn offline zu simulieren würde bedeuten zu raten, welche Felder Ihr Cluster indexiert.
Gt und Lt aus der Node-Affinity
Sie gehören zu NodeSelectorRequirement, nicht zu LabelSelectorRequirement. Wer replicas>2 eintippt, bekommt einen Hinweis darauf — und keinen Vergleich, den ein Label-Selector nicht ausdrücken kann.
namespaceSelector-Semantik
Ein NetworkPolicy-Peer kombiniert einen namespaceSelector mit einem podSelector über Namespaces hinweg. Ohne die Namespace-Objekte ist die ehrliche Antwort der podSelector allein.
Alles, was den Cluster braucht
Es wird kein API-Server kontaktiert, also gibt es keine echte Pod-Liste, kein Admission-Ergebnis und kein Endpoints-Objekt. Alles hier stammt aus dem Text, den Sie eingefügt haben.
Grenzen, genannt statt versteckt: bis zu 500 Ressourcen-Dokumente aus einer Eingabe von höchstens 500.000 Zeichen, und höchstens 100 Klauseln in einem Selector. Ein Label-Key-Name wird bei 63 Zeichen geprüft, sein optionales DNS-Subdomain-Prefix bei 253 und ein Label-Wert bei 63 — dieselben Limits, die der API-Server durchsetzt.
Nächster Schritt
Die Spur in den Incident-Channel einfügen.
„Copy report“ gibt Ihnen den ganzen Lauf als Klartext: den kanonischen Selector, dann einen Block pro Ressource mit Urteil und jeder Klausel, die es entschieden hat. Und dann weiter — summieren, was der Workload wirklich reserviert, oder prüfen, welche Variablen seine Container erwarten.
Kubernetes Label Selector Tester — 3 of 5 resources match
selector: app=web,tier=frontend
NO MATCH — Pod/web-d
metadata.labels: app=web, tier=frontnd
[ok] app=web — label app="web" = "web"
[no] tier=frontend — label tier="frontnd" ≠ "frontend" FAQ
Fragen, beantwortet.
Tippen Sie auf eine Frage, um die Antwort aufzuklappen.
Warum trifft env!=prod auf einen Pod zu, der überhaupt kein env-Label hat?
Weil die Regel es so sagt, und weil das die überraschendste Zeile der gesamten Label-Selector-API ist. In k8s.io/apimachinery behandelt Requirement.Matches NotIn und != in einem einzigen Zweig: hat das Label-Set den Key nicht, ist das Ergebnis true. In und == nehmen den umgekehrten Zweig: fehlt der Key, ist das Ergebnis false. env!=prod bedeutet also „kein env-Label mit dem Wert prod“ — und das erfüllt ein Pod ohne env-Label perfekt. Wenn Sie „hat ein env-Label, und es ist nicht prod“ meinen, brauchen Sie zwei Klauseln: env,env!=prod — Exists UND NotIn. Dieser Tester markiert jede Klausel, die nur wegen eines fehlenden Keys zutrifft, sodass Sie sich nie merken müssen, in welche Richtung es geht.
Was ist der Unterschied zwischen matchLabels und matchExpressions?
matchLabels ist eine einfache Map, und jedes Paar darin wird zu einer Gleichheits-Anforderung: {app: web, tier: frontend} ist genau app=web,tier=frontend. matchExpressions ist eine Liste von {key, operator, values}-Einträgen und der einzige Weg, die mengenbasierten Operatoren In, NotIn, Exists und DoesNotExist zu schreiben. Enthält ein Selector beides, verknüpft apimachinery alles mit UND — LabelSelectorAsSelector fügt jedes matchLabels-Paar und jeden Ausdruck derselben Anforderungsliste hinzu. Ein ODER gibt es in einem Label-Selector auf keiner Ebene.
Kann ein Service-Selector matchExpressions verwenden?
Nein, und das ist der Fehler, den generierte Manifeste am häufigsten machen. spec.selector eines Service ist als map[string]string typisiert, nicht als LabelSelector: es nimmt eine einfache Label-Map und unterstützt nur Gleichheit. Schreiben Sie dort matchLabels oder matchExpressions, lehnt der API-Server das Feld direkt ab. Deployments, StatefulSets, DaemonSets, Jobs und der podSelector einer NetworkPolicy nehmen dagegen einen echten LabelSelector und akzeptieren beide Formen. Fügen Sie ein Service-Manifest mit matchExpressions in diesen Tester ein, warnt er Sie — und zeigt dann, was ein Deployment getroffen HÄTTE, sodass Sie Fehler und Absicht gleichzeitig sehen.
Trifft ein leerer Selector auf alles oder auf nichts zu?
Das hängt davon ab, ob das Feld leer oder abwesend ist — und beides ist nicht dasselbe. Ein leerer LabelSelector — {} oder matchLabels: {} — ist labels.Everything(): er trifft auf jedes Objekt zu, und genau deshalb gilt eine NetworkPolicy mit podSelector: {} für jeden Pod im Namespace. Ein nil-Selector trifft dagegen auf nichts zu: LabelSelectorAsSelector(nil) liefert labels.Nothing(). Und ein Service ist noch ein dritter Fall: sein selector-Feld wird weggelassen, wenn es leer ist, ein Service mit selector: {} ist also ein Service ohne Selector — der Endpoints-Controller verwaltet seine Endpoints dann gar nicht.
Verlässt irgendetwas, das ich einfüge, meinen Browser?
Nein. Beide Parser, die Validierung und der Matcher sind JavaScript, das in Ihrem Tab läuft — es gibt keinen Server, keinen API-Aufruf und kein Logging, also werden 0 Bytes hochgeladen. Das zählt hier, weil ein Pod-Dump kein neutraler Text ist: er enthält interne Image-Referenzen, Node-Namen, Annotationen und manchmal ein Token, das als Umgebungsvariable eingebunden ist. Das ist das Werkzeug, das Sie auf Produktions-Output anwenden können, ohne vorher über Datenschutz reden zu müssen.
Mein Service hat null Endpoints. Was prüfe ich zuerst?
Die Pod-Labels, nicht den Service. Fügen Sie das Service-Manifest als Selector und die tatsächlichen Pods als Ressourcen ein: der Tester liest spec.selector für Sie aus und zeigt zu jedem Pod eine Spur pro Klausel, sodass ein Tippfehler von einem Zeichen als label tier="frontnd" ≠ "frontend" erscheint und nicht als leere Endpoint-Liste. Zwei strukturelle Fallen sollten Sie ebenfalls ausschließen. Erstens wählt ein Service POD-Labels aus, nicht die metadata.labels des Deployments selbst — genau deshalb listet dieser Tester spec.template.metadata.labels eines Workloads als eigene Zeile „Pod template“. Zweitens ist ein Selector, der nichts trifft, nirgends in Kubernetes ein Fehler: kubectl akzeptiert ihn, der API-Server akzeptiert ihn, und das einzige Symptom ist ein leeres Endpoints-Objekt.
Unterstützt er Field-Selectors wie --field-selector status.phase=Running?
Nein, und das ist eine bewusste Grenze, kein fehlendes Feature. Field-Selectors sind ein anderer Mechanismus: sie filtern auf den eigenen Feldern eines Objekts, sie werden vom API-Server gegen eine kleine, pro Ressourcentyp unterschiedliche Erlaubnisliste ausgewertet, und fast keiner von ihnen unterstützt mengenbasierte Operatoren. Sie offline zu simulieren würde bedeuten, für jede Kubernetes-Version und jede Art zu kodieren, welche Felder indexiert sind — und das subtil falsch zu treffen. Dieses Tool deckt Label-Selectors ab, die über alle Ressourcentypen hinweg gleich funktionieren und vollständig durch das Objekt definiert sind, das Sie schon in der Zwischenablage haben.
Was ist mit den Operatoren Gt und Lt aus der Node-Affinity?
Die gibt es, aber nicht auf einem Label-Selector. Node-Affinity verwendet NodeSelectorRequirement, einen eigenen Typ, dessen Operator-Menge In, NotIn, Exists, DoesNotExist, Gt und Lt umfasst. Ein LabelSelectorRequirement — der in matchExpressions, spec.selector und podSelector — hat nur die ersten vier. Gt und Lt sind also in nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution gültig und überall dort ungültig, wo dieser Tester hinschaut. Tippen Sie replicas>2 in das Selector-Feld, sagt er genau das, anstatt einen Vergleich zu erfinden, den ein Label-Selector nicht hat.
Wie viel verkraftet er, und wo liegen die Grenzen?
Er wertet die ersten 500 Ressourcen-Dokumente aus einer Eingabe von bis zu 500.000 Zeichen aus, und einen Selector mit höchstens 100 Klauseln — jede Grenze nennt sich auf dem Bildschirm samt echter Zahl, ein abgeschnittener Lauf sieht also nie wie ein vollständiger aus. Keys und Werte werden gegen die echten Limits geprüft: ein Label-Key-Name hat höchstens 63 Zeichen, ein optionales DNS-Subdomain-Prefix vor dem / höchstens 253, und ein Label-Wert höchstens 63 (ein leerer Wert ist erlaubt). Ein ungültiger Key oder Wert im SELECTOR ist ein harter Fehler, weil der API-Server ihn ablehnen würde; ein ungültiges Label auf einer RESSOURCE ist nur ein Hinweis, weil Ihre Frage war, ob der Selector darauf zutrifft.
More free, private DevOps tools.
Der Label Selector Tester ist ein Tool in OpsCanopy — einem wachsenden Blätterdach browserbasierter Validatoren, Konverter und Tester, die keinen Server berühren.
39 free tools, every one offline-capable — opscanopy.com works with no signup and nothing uploaded.
Verwandt: Kubernetes Resource Calculator für das, was ein Workload reserviert, Env Example Checker für die Variablen, die ein Container erwartet, der Alertmanager Route Tester für den anderen Label-Matching-Baum, der still Dinge verschluckt, und der JSON ↔ YAML Konverter, wenn ein Manifest für kubectl patch umgeformt werden muss — oder stöbern Sie im vollständigen Tools-Verzeichnis.
Ohne Gewähr zur Bequemlichkeit bereitgestellt; prüfen Sie kritische Konfiguration immer gegen den Cluster, der sie später verarbeitet. OpsCanopy ist kostenlos und offen.