Node Selectors in Kubernetes gebruiken

We kunnen een Pod beperken om alleen op een bepaalde Node te kunnen draaien. Er kunnen zich situaties voordoen waarin we meer controle willen hebben over een knooppunt waar een pod landt.

nodeSelector is een van de vormen van een knooppuntselectie beperking. nodeSelector is een veld van PodSpec. Dit is een eenvoudige Pod planningsmogelijkheid waarmee een Pod op een knooppunt kan worden gepland waarvan de labels overeenkomen met de door de gebruiker opgegeven nodeSelector labels.

Om meer te weten te komen over Node Selects, klikhier om naar de officiƫle pagina van de Kubernetes te gaan.

In dit artikel zullen we geen taint op de master node hebben, zodat pods ook op de master node ingezet kunnen worden. Dan zullen we pods aanmaken om te zien dat ze zowel op de worker als op de master node ingezet worden. We zullen dan een label aan de master node hangen en pods erop wijzen dat ze alleen op de master node worden ingezet met de nodeSelector.

Pre-requisites

  1. Kubernetes Cluster met minstens 1 werkersknooppunt.
    Als je wilt leren hoe je een Kubernetes Cluster maakt, klik danhier. Deze gids helpt je een Kubernetes cluster te maken met 1 Master en 2 Nodes op AWS Ubuntu 18.04 EC2 Instances.

Wat we zullen doen

  1. Node-Selectors configureren

Node-Selectors configureren

Laten we eerst de details van de nodes in het cluster extraheren met het volgende commando.

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

Het bovenstaande laat zien dat de nodes geen taints hebben, dit betekent dat Pods op elk van de nodes geplaatst kunnen worden, hetzij op master of node01.

Laten we nu een deployment maken waar geen enkele node selector in zit.

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

inzet-zonder-knooppunt-selector

Nu zijn we klaar om een deployment te maken met het volgende commando.

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

create-deployment

Verander nu de replicatelling in de inzet door het bestand te bewerken en wijzigingen toe te passen.

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

verhoog-replica-telling-in-het-werk

In de bovenstaande schermafbeelding is te zien dat er nieuwe pods worden aangemaakt en dat ze ook op de master node worden gepland.

De reden hiervoor is dat beide nodes, de master en node01, geen taints hebben.

SO, om het plannen te beperken en te zorgen dat pods alleen op de master node een plaats krijgen, maken we een label op de master node.

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

In de bovenstaande schermafbeelding is te zien dat aan de master node een label is toegekend als “on-master=true”.

Laten we nu een nieuwe ontplooiing maken met nodeSelector:on-master=true erin om ervoor te zorgen dat de Pods alleen op de master node ontplooid worden.

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"

inzetten-met-knooppunt-selector

Een nieuwe inzet met nodeSelector kan nu gemaakt worden met het volgende commando.

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

create-deployment-met-node-selector

In de bovenstaande schermafbeelding is te zien dat de Pods alleen op de master node werden ingezet.

Laten we nu “replica=50” veranderen om te zien waar de pods ontplooid zullen worden.

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

verhoog-replica-telling-in-het-werk

Breng de laatste veranderingen aan met een hieronder vermeld commando.

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

verhoog-replica-telling-in-het-werk

Hier zie je dat alle pods alleen op de “master” node worden gemaakt en ingezet.

Conclusie

In dit artikel zagen we hoe pods beperkt kunnen worden om alleen op de specifieke node te worden ingezet met label en nodeSelector.

We zagen ook dat als de master node geen Taints heeft, er toch pods op kunnen worden ingezet.