Selectors in Kubernetes sind eine Methode, um Ressourcen wie Pods oder Nodes anhand ihrer Labels zu filtern und auszuwählen. Sie ermöglichen es Nutzern und Systemkomponenten, Ressourcen basierend auf Label-Schlüssel-Wert-Paaren zu identifizieren und zu gruppieren.
Selektoren können sowohl über die Kommandozeilenschnittstelle (CLI) als auch in den Manifest-Dateien von Kubernetes eingesetzt werden. Diese Dualität ermöglicht es Operatoren und Entwicklern, Ressourcen dynamisch während der Laufzeit zu verwalten oder feste Selektionskriterien innerhalb der Deklarationen von Ressourcen zu definieren.
In der CLI können Selektoren benutzt werden, um Ressourcen in
Echtzeit zu filtern und zu managen. Beispielsweise ermöglicht der Befehl
kubectl get pods -l app=frontend das Abrufen aller Pods,
die mit dem Label app=frontend versehen sind. Dies ist
besonders nützlich für Ad-hoc-Abfragen und für die
Skriptautomatisierung.
In den Manifesten definiert man Selektoren, um die Beziehungen
zwischen Ressourcen festzulegen. Ein Deployment-Spec könnte
beispielsweise einen Selektor matchLabels enthalten, der
definiert, welche Pods als Replikas für dieses Deployment betrachtet
werden sollen. Durch das Festlegen von Selektoren in Manifesten stellt
man sicher, dass die Beziehungen und Abhängigkeiten zwischen Ressourcen
erhalten bleiben, auch wenn sie dynamisch skaliert oder modifiziert
werden.
Die Verwendung von Selektoren in Manifesten fördert zudem die deklarative Konfiguration von Ressourcen, die es ermöglicht, den gewünschten Zustand des Systems zu beschreiben, während Kubernetes die Verantwortung für das Erreichen und Aufrechterhalten dieses Zustands übernimmt.
Es gibt zwei Haupttypen von Selectors in Kubernetes:
=: Der Label-Wert muss genau gleich sein.!=: Der Label-Wert darf nicht gleich sein.==: Äquivalent zu =, der Label-Wert muss
genau gleich sein.in: Der Label-Wert muss in der angegebenen Menge
sein.notin: Der Label-Wert darf nicht in der angegebenen
Menge sein.exists (nur durch Schlüssel angegeben): Irgendein Wert
für den Label-Schlüssel existiert.Nehmen wir an, Sie betreiben eine Reihe von Pods, die verschiedene
Komponenten Ihrer Anwendung in einer Entwicklungs- und
Produktionsumgebung repräsentieren. Jeder Pod könnte Labels haben, die
seine Rolle (role) und die Umgebung (env)
angeben, in der er läuft.
Hier ist ein Beispiel, wie Pods mit bestimmten Labels ausgewählt werden könnten:
Equality-based Selector:
Angenommen, Sie möchten alle Pods auswählen, die in der Produktionsumgebung laufen. Der entsprechende Befehl mit einem Equality-based Selector könnte sein:
kubectl get pods -l env=prodSet-based Selector:
Wenn Sie Pods auswählen möchten, die entweder als Frontend oder als Backend in der Entwicklungsumgebung gekennzeichnet sind, könnten Sie einen Set-based Selector verwenden:
kubectl get pods -l 'env in (dev),role in (frontend,backend)'In Kubernetes-Manifesten werden verschiedene Arten von Selektoren verwendet, um Ressourcen basierend auf Labels zu identifizieren und zu gruppieren. Hier sind die häufig verwendeten Selektoren in Kubernetes-Manifesten:
Ein Service verwendet einen selector, um die Pods zu
identifizieren, die den durch den Service definierten Satz von
Netzwerkregeln verwenden. Ein Service-Selector wählt alle Pods aus,
deren Labels mit den im Selector spezifizierten Labels
übereinstimmen.
kind: Service
apiVersion: v1
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 8080matchLabelsDeployments, StatefulSets und Jobs verwenden matchLabels
innerhalb der selector Spezifikation, um zu definieren,
welche Pods zu der Ressource gehören.
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend-container
image: backend-imagenodeSelectorPods können einen nodeSelector verwenden, um einen
bestimmten Knoten oder eine Gruppe von Knoten auszuwählen, auf denen der
Pod geplant werden soll. Dies basiert auf den Labels, die den Knoten
zugewiesen sind.
apiVersion: v1
kind: Pod
metadata:
name: database-pod
spec:
nodeSelector:
disktype: ssd
containers:
- name: db-container
image: mysqlIn jedem dieser Beispiele ordnen die Selektoren Ressourcen basierend auf Label-Schlüssel-Wert-Paaren zu, um sicherzustellen, dass die Ressourcen gemäß den definierten Anforderungen und Affinitäten korrekt organisiert und geplant werden.
Sie haben ein Deployment für ein Backend und ein Frontend, wobei jedes eine Version für die Entwicklungs- und die Produktionsumgebung hat.
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-dev
spec:
selector:
matchLabels:
role: backend
env: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-prod
spec:
selector:
matchLabels:
role: frontend
env: prodSie könnten alle Entwicklungspods mit dem Selector
env=dev auswählen oder spezifisch das Backend in der
Entwicklungsphase mit role=backend,env=dev.
Selectors ermöglichen eine mächtige und flexible Verwaltung der Ressourcen in einem Kubernetes-Cluster und sind essentiell für das tägliche Operieren, sei es für das Deployment, die Wartung oder die Skalierung von Anwendungen.