Wofür wird spec-selector-matchLabels beim Erstellen einer Bereitstellung verwendet?

18

Aus der Kubernetes-Dokumentation :

Das Auswahlfeld definiert, wie die Bereitstellung die zu verwaltenden Pods findet.

Beim Erstellen der Bereitstellung habe ich die Pod-Vorlage jedoch bereits als Teil der Bereitstellung angegeben. Warum brauche ich dann auch die Selektoren?

Soll es wie Services verwendet werden, bei denen Pods bereits separat gestartet werden, aber später unter dem Dach von Deployment zusammengefasst werden, um gemeinsam verwaltet zu werden?

Paddy
quelle

Antworten:

8

Antworten auf diese Frage finden Sie im Abschnitt Deployments von kubernetes.io

Warum brauche ich dann auch die Selektoren?

Zitate aus der Dokumentation für k8s v 1.14

.spec.selectorist ein erforderliches Feld, das eine Beschriftungsauswahl für die Pods angibt, auf die sich diese Bereitstellung bezieht.

.spec.selectormuss übereinstimmen .spec.template.metadata.labels, sonst wird es von der API abgelehnt.

In der API-Version von apps / v1 sind .spec.selector und .metadata.labels nicht standardmäßig .spec.template.metadata.labels, wenn sie nicht festgelegt sind. Sie müssen also explizit gesetzt werden . Beachten Sie auch, dass .spec.selector nach dem Erstellen der Bereitstellung in apps / v1 unveränderlich ist.

Eine Bereitstellung kann Pods beenden, deren Beschriftungen mit der Auswahl übereinstimmen, wenn sich ihre Vorlage von ".spec.template" unterscheidet oder wenn die Gesamtanzahl solcher Pods ".spec.replicas" überschreitet. Es werden neue Pods mit der Erweiterung .spec.template angezeigt, wenn die Anzahl der Pods unter der gewünschten Anzahl liegt.

Pods werden bereits separat gestartet, aber später unter dem Dach des Deployments zusammengeführt, um gemeinsam verwaltet zu werden?

Einfach gesagt, nein

Hinweis: Sie sollten keine anderen Pods erstellen, deren Beschriftungen direkt mit diesem Selektor übereinstimmen, indem Sie einen anderen Deploymentoder einen anderen Controller wie a ReplicaSetoder a erstellen ReplicationController. Wenn Sie dies tun, Deploymentdenkt der erste, dass diese anderen Pods erstellt wurden. Kuberneteshindert Sie nicht daran, dies zu tun. Wenn Sie mehrere Controller mit überlappenden Selektoren haben, kämpfen die Controller miteinander und verhalten sich nicht richtig.

alexander.polomodov
quelle
5
Wofür wird es verwendet? Es sieht so aus, als sollten Sie den Selektor immer an die Beschriftungen der Spezifikation anpassen ... Ist es in manchen Fällen sinnvoll, dies nicht zu tun?
Victor Noël
4
Beantwortet die Frage nicht wirklich Warum? - Warum gibt es matchLabels, die übereinstimmen müssen .spec.template.metadata.labels? Worauf kommt es an, wie specim Folgenden ohnehin definiert, Deploymentdamit klar ist, welche Pods für die Bereitstellung gestartet werden.
Ivan
2
Jeder, der auf diese Diskussion stößt, sollte die neueste Dokumentation lesen. Zum Beispiel ist .spec.selector derzeit kein optionales Feld. Es ist ein Pflichtfeld. kubernetes.io/docs/concepts/workloads/controllers/deployment
SoftwareTheory
Vielen Dank für Ihren Kommentar. Ich denke , dass in neuer Dokumentation Autoren korrigierte optional erforderlich, weil in alten docs dieses Feld als optional gesagt wurde , aber auf dem nächsten Zeile Autoren hinzugefügt , dass dieses Feld explizit festgelegt werden muss :) So effektiv dieses Feld auch erforderlich war
alexander.polomodov
@SoftwareTheory Ja, aber es wird immer noch nicht erklärt, warum dies erforderlich ist, da die Pod-Spezifikationsvorlage im Folgenden ohnehin definiert ist.
User168317