Wie man Knotenselektoren (nodeSelector) in Kubernetes verwendet

Wir können einen Pod so einschränken, dass er nur auf einem bestimmten Knoten laufen kann. Es kann einige Situationen geben, in denen wir mehr Kontrolle über einen Knoten wünschen, auf dem ein Pod landet.

nodeSelector ist eine der Formen der Knotenauswahlbeschränkung. nodeSelector ist ein Feld von PodSpec. Hierbei handelt es sich um eine einfache Pod-Planungsfunktion, mit der ein Pod auf einen Knoten geplant werden kann, dessen Labels mit den vom Benutzer angegebenen nodeSelector-Labels übereinstimmen.

Um mehr über Node Selects zu erfahren, klicken Sie hier, um zur offiziellen Seite des Kubernetes zu gelangen.

In diesem Artikel geht es nicht um den Master-Knoten, so dass die Hülsen auch auf dem Master-Knoten eingesetzt werden können. Dann werden wir Pods erstellen, um zu sehen, wie sie sowohl auf dem Arbeiter- als auch auf dem Master-Knoten eingesetzt werden. Wir werden dann ein Etikett am Master-Knoten anbringen und die Pods so ausrichten, dass sie nur mit dem nodeSelector auf dem Master-Knoten eingesetzt werden.

Vorraussetzungen

  1. Kubernetes Cluster mit mindestens 1 Worker-Knoten.
    Wenn Sie lernen möchten, wie man einen Kubernetes-Cluster erstellt, klicken Sie hier. Dieses Handbuch hilft Ihnen, einen Kubernetes-Cluster mit 1 Master- und 2 Worker-Knoten auf AWS Ubuntu 18.04 EC2-Instanzen zu erstellen.

Was wir tun werden

  1. Konfigurieren von Knoten-Auswählern

Knoten-Selektoren konfigurieren

Extrahieren wir zunächst die Details der Knoten im Cluster mit dem folgenden Befehl.

kubectl get nodes #Get nodes available in the cluster
kubectl describe nodes node01 | grep Taint #Describe node1 node to extract details regarding Taints
kubectl describe nodes master | grep Taint #Describe master node to extract details regarding Taints

check-taints-on-nodes

Oben ist zu sehen, dass die Knoten keine Taints haben, d.h. die Pods können auf jedem der Knoten platziert werden, entweder auf dem Masterknoten oder auf node01.

Lassen Sie uns nun eine Bereitstellung erstellen, die keinen Knotenselektor enthält.

vim my-deployment-without-node-selector.yaml #Create a deployment definition
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: frontend
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: httpd:2.4-alpine
        name: frontend

Bereitstellung ohne Knoten-Selektor

Nun sind wir bereit, eine Bereitstellung mit dem folgenden Befehl zu erstellen.

kubectl get pods #Get pods available in the cluster
kubectl create -f my-deployment-without-node-selector.yaml #Create a deployment
kubectl get pods ##Get nodes available in the cluster

Erstellen-Bereitstellung

Ändern Sie nun die Anzahl der Replikate in der Bereitstellung, indem Sie die Datei bearbeiten und die Änderungen anwenden.

kubectl apply -f my-deployment-without-node-selector.yaml #Apply changes made in the deployment definition file
kubectl get pods -o wide # Get more details regarding pods using -o wide option

Erhöhen Sie die Anzahl der Replikate - Count-In-The-Deployment

Im obigen Screenshot ist zu sehen, dass neue Pods erstellt werden und diese auch auf dem Master-Knoten geplant werden.

Der Grund dafür ist, dass sowohl die Knoten, der Master- als auch der Knoten01, keine Taints haben.

SO, um die Zeitplanung einzuschränken und sicherzustellen, dass die Pods nur auf dem Master-Knoten platziert werden, lassen Sie uns ein Label auf dem Master-Knoten erstellen.

kubectl label nodes master on-master=true #Create a label on the master node
kubectl describe node master #Get more details regarding the master node

add-label-to-master-nodes

Auf dem obigen Screenshot ist zu sehen, dass der Master-Knoten mit „on-master=true“ gekennzeichnet ist

Nun erstellen wir eine neue Verteilung mit nodeSelector:on-master=true darin, um sicherzustellen, dass die Pods nur auf dem Master-Knoten verteilt werden.

vim my-deployment-with-node-selector.yaml #Create a deployment definition file
apiVersion: apps/v1
kind: Deployment
metadata:
  name: streamer-v4-deployment
  labels:
    app: streamer-v4
spec:
  replicas: 2
  selector:
    matchLabels:
      app: streamer-v4
  template:
    metadata:
      labels:
        app: streamer-v4
    spec:
      containers:
      - name: streamer-v4
        image: nginx
        ports:
        - containerPort: 8880
      nodeSelector:
        on-master: "true"

einsatz-mit-knoten-selektor

Ein neues Deployment mit nodeSelector kann jetzt mit dem folgenden Befehl erstellt werden.

kubectl create -f my-deployment-with-node-selector.yaml #Create a deployment
kubectl get pods -o wide | grep streamer-v4-deployment #Get more details of the pods

schaffe-Einsatz-mit-Knoten-Selektor

Auf dem obigen Screenshot ist zu sehen, dass die Pods nur auf dem Master-Knoten eingesetzt wurden.

Ändern wir nun „replica=50“, um zu sehen, wo die Pods eingesetzt werden.

vim my-deployment-with-node-selector.yaml #Change a deployment definition

Erhöhen Sie die Anzahl der Replikate - Count-In-The-Deployment

Wenden Sie die letzten Änderungen mit einem der unten genannten Befehle an.

kubectl apply -f my-deployment-with-node-selector.yaml #Apply changes to the deployment

Erhöhen Sie die Anzahl der Replikate - Count-In-The-Deployment

Hier können Sie sehen, dass alle Pods nur auf dem „Master“-Knoten erstellt und bereitgestellt werden.

Schlussfolgerung

In diesem Artikel haben wir gesehen, wie Pods so eingeschränkt werden können, dass sie nur mit Label und NodeSelector an einem bestimmten Knoten eingesetzt werden können.

Wir haben auch gesehen, dass, wenn der Master-Knoten keine Taints hat, dann können Hülsen auf ihm eingesetzt werden.

Das könnte Dich auch interessieren …