2 min read | by Jordi Prats
In a kubernetes cluster not all nodes must be identical, for example, some might have access to a disk that others don't, or belong to a different network segment that do have a public IP thus we might want to assign pods to specific nodes
Let's assume we have the following nodes available:
$ kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
canterbury.pet2cattle.com 254m 9% 1729Mi 5%
scopuli.pet2cattle.com 1047m 1% 1203Mi 15%
anubis.pet2cattle.com 154m 26% 2729Mi 9%
If we want, for whatever reason, to force the scheduling of a pod to a node, for example: scopuli.pet2cattle.com we just need to set nodeName to the node we want to use, for example:
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
nodeName: scopuli.pet2cattle.com
containers:
- name: demo
image: busybox
command: ["sleep"]
args: ["1h"]
If we apply this yaml:
$ kubectl apply -f demo.yaml
pod/demo created
We will see that this pod is going to be scheduled to the pod we told kubernetes to do it. If we add -o wide to kubectl get we will be able to see the node:
$ kubectl get pod demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 2d5h 10.42.0.63 scopuli.lolcathost.systemadmin.es <none> <none>
We must take into account that resource requests/limits still apply, as a rule of thumb, if a given pod wouldn't be scheduled to a given node for some reason, nodeName won't force it's scheduling: It just adds another restriction to the resource request
Posted on 04/02/2021