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
- 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
- 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
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
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
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
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
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"
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
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
Breng de laatste veranderingen aan met een hieronder vermeld commando.
kubectl apply -f my-deployment-with-node-selector.yaml #Apply changes to the deployment
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.