k8s-hostpath-device-plugin
This is a very thin device plugin which just exposed a host path to a container.
This can be seen as non limited resources, things like "capabilitites" of a host. However, due to kubernetes/kubernetes#59380, current device plugin(v1beta1) doesn't support unlimited extended resources. Currently a hack would be to set the number of resources advertised by the device plugin to a very high mumber.
Why not using hostPath
volume?? The question is natural. But, hostPath
volume assumes all the nodes in the cluster have the hostPath
. What happened if only part of the nodes serve the host path? Assume user pod's spec declares a host path volume like below:
kind: Pod
spec:
...
volumes:
- name: vol
hostPath:
path: /mnt/volume
Then, how to make sure that the pod is scheduled to a node which has host path /mnt/volume
??
This device plugin solve this by serving the exising hostpath as extended resource like this:
kind: Pod
...
resources:
limits:
# the resource mounts hostPath=/sample to contianerPath=/sample
hostpath-device.k8s.io/sample: 1
Thus, it can guarantee that the pod will be scheduled to a node which has the host path.
Build
docker build . -t k8s-hostpath-device-plugin
Deploy
First you edit example/config.yaml
. Then, you can deploy the device plugin:
kustomize build example/ | kubectl apply -f -
Try with Kind
# create a kind cluster
# - create kind cluster
# - prepare hostpath=/sample
# - install cert-manager
$ make dev-cluster
# deploy
# - k8s-hostpath-device-plugin
# - its webhook
$ make dev-deploy
# create pod requesting 'hostpath-device.k8s.io/sample=1'
$ cat << EOT | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: test-hostpath-sample
spec:
restartPolicy: Never
containers:
- name: ctr
image: busybox
command:
- sh
- -c
- |
set -ex
ls -al /sample
cat /sample/hello
resources:
limits:
# the resource mounts hostPath=/sample to contianerPath=/sample
hostpath-device.k8s.io/sample: 1
EOT
# you can see pod can access to /sample from a container
$ kubectl logs test-hostpath-sample
+ ls -al /sample
total 12
drwxr-xr-x 2 root root 4096 Aug 27 16:43 .
drwxr-xr-x 1 root root 4096 Aug 27 17:00 ..
-rw-r--r-- 1 root root 6 Aug 27 16:43 hello
+ cat /sample/hello
hello
+ exit 0
# cleanup
$ make dev-clean
How to make a release
The release process is fully automated by tagpr. To release, just merge the latest release PR.
License
MIT License. See LICENSE file.