Simplest example for kubernetes Device Plugin. The example provides a plugin for imaginary devices. It shows basic plugin implementation and demonstrates how kubernetes uses plugins for scheduling pods.
Use multinode kind cluster for this demo:
make clusterBuild and deploy the driver:
make build
make startCheck that nodes advertise custom devices:
kubectl get node kind-worker -o yaml
...
status:
allocatable:
myplugin.io/mydevice-1: "1"
myplugin.io/mydevice-2: "0"
myplugin.io/mydevice-3: "0"
capacity:
myplugin.io/mydevice-1: "1"
myplugin.io/mydevice-2: "0"
myplugin.io/mydevice-3: "0"kubectl get node kind-worker2 -o yaml
...
status:
allocatable:
myplugin.io/mydevice-1: "0"
myplugin.io/mydevice-2: "1"
myplugin.io/mydevice-3: "3"
capacity:
myplugin.io/mydevice-1: "0"
myplugin.io/mydevice-2: "1"
myplugin.io/mydevice-3: "3"Deploy example pods and check how they scheduled to nodes:
kubectl apply -f pods.yamlPod dp1-1 is scheduled on the kind-worker node because that provides mydevice-1. Pod dp1-2 is scheduled on kind-worker2 because that provides mydevice-2:
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dp1-1 1/1 Running 0 3m4s 10.244.1.6 kind-worker <none> <none>
dp1-2 1/1 Running 0 82s 10.244.3.6 kind-worker2 <none> <none>
dp1-3 0/1 Pending 0 82s <none> <none> <none> <none>kubectl logs dp1-1
Device vars:
DEV_1_ID_0='/node1/dev1/1'kubectl logs dp1-2
Device vars:
DEV_2_ID_0='/node2/dev2/1'Pod dp1-3 is not scheduled because it requires two kind of devices and kind-worker2 provides them both but one of them is already allocated by dp1-2:
kubectl describe pod dp1-3
...
0/3 nodes are available: 1 Insufficient myplugin.io/mydevice-3, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 Insufficient myplugin.io/mydevice-2.So if we stop the pod dp1-2 to free the device, the pod dp1-3 get finally scheduled:
kubectl delete pod dp1-2kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dp1-1 1/1 Running 0 11m 10.244.1.6 kind-worker <none> <none>
dp1-3 1/1 Running 0 9m18s 10.244.3.7 kind-worker2 <none> <none>kubectl logs dp1-3
Device vars:
DEV_2_ID_0='/node2/dev2/1'
DEV_3_ID_0='/node2/dev3/2'
DEV_3_ID_1='/node2/dev3/3'