nfs-provisioner
quay.io/kubernetes_incubator/nfs-provisioner
nfs-provisioner is an out-of-tree dynamic provisioner for Kubernetes 1.4+. You can use it to quickly & easily deploy shared storage that works almost anywhere. Or it can help you write your own out-of-tree dynamic provisioner by serving as an example implementation of the requirements detailed in the proposal. Go here for a demo of how to use it and here for an example of how to write your own.
It works just like in-tree dynamic provisioners: a StorageClass
object can specify an instance of nfs-provisioner to be its provisioner
like it specifies in-tree provisioners such as GCE or AWS. Then, the instance of nfs-provisioner will watch for PersistentVolumeClaims
that ask for the StorageClass
and automatically create NFS-backed PersistentVolumes
for them. For more information on how dynamic provisioning works, see the docs or this blog post.
Quickstart
Choose some volume for your nfs-provisioner instance to store its state & data in and mount the volume at /export
in deploy/kubernetes/deployment.yaml
. It doesn't have to be a hostPath
volume, it can e.g. be a PVC. Note that the volume must have a supported file system on it: any local filesystem on Linux is supported & NFS is not supported.
...
volumeMounts:
- name: export-volume
mountPath: /export
volumes:
- name: export-volume
hostPath:
path: /tmp/nfs-provisioner
...
Choose a provisioner
name for a StorageClass
to specify and set it in deploy/kubernetes/deployment.yaml
...
args:
- "-provisioner=example.com/nfs"
...
Create the deployment.
$ kubectl create -f deploy/kubernetes/deployment.yaml
serviceaccount/nfs-provisioner created
service "nfs-provisioner" created
deployment "nfs-provisioner" created
Create ClusterRole
, ClusterRoleBinding
, Role
and RoleBinding
(this is necessary if you use RBAC authorization on your cluster, which is the default for newer kubernetes versions).
$ kubectl create -f deploy/kubernetes/rbac.yaml
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created
Create a StorageClass
named "example-nfs" with provisioner: example.com/nfs
.
$ kubectl create -f deploy/kubernetes/class.yaml
storageclass "example-nfs" created
Create a PersistentVolumeClaim
with annotation volume.beta.kubernetes.io/storage-class: "example-nfs"
$ kubectl create -f deploy/kubernetes/claim.yaml
persistentvolumeclaim "nfs" created
A PersistentVolume
is provisioned for the PersistentVolumeClaim
. Now the claim can be consumed by some pod(s) and the backing NFS storage read from or written to.
$ kubectl get pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
pvc-dce84888-7a9d-11e6-b1ee-5254001e0c1b 1Mi RWX Delete Bound default/nfs 23s
Deleting the PersistentVolumeClaim
will cause the provisioner to delete the PersistentVolume
and its data.
Deleting the provisioner deployment will cause any outstanding PersistentVolumes
to become unusable for as long as the provisioner is gone.
Running
To deploy nfs-provisioner on a Kubernetes cluster see Deployment.
To use nfs-provisioner once it is deployed see Usage.
Releases done here in external-storage will not have corresponding git tags (external-storage's git tags are reserved for versioning the library), so to keep track of releases check this README, the changelog, or Quay
Writing your own
Go here for an example of how to write your own out-of-tree dynamic provisioner.
Roadmap
This is still alpha/experimental and will change to reflect the out-of-tree dynamic provisioner proposal
Community, discussion, contribution, and support
Learn how to engage with the Kubernetes community on the community page.
You can reach the maintainers of this project at:
Kubernetes Incubator
This is a Kubernetes Incubator project. The project was established 2016-11-15. The incubator team for the project is:
- Sponsor: Clayton (@smarterclayton)
- Champion: Brad (@childsb)
- SIG: sig-storage
Code of conduct
Participation in the Kubernetes community is governed by the Kubernetes Code of Conduct.