# Outline This example describes how to create Web frontend server, an auto-provisioned persistent volume on GCE, and an NFS-backed persistent claim. Demonstrated Kubernetes Concepts: * [Persistent Volumes](http://kubernetes.io/docs/user-guide/persistent-volumes/) to define persistent disks (disk lifecycle not tied to the Pods). * [Services](http://kubernetes.io/docs/user-guide/services/) to enable Pods to locate one another. ![alt text][nfs pv example] As illustrated above, two persistent volumes are used in this example: - Web frontend Pod uses a persistent volume based on NFS server, and - NFS server uses an auto provisioned [persistent volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) from GCE PD or AWS EBS. Note, this example uses an NFS container that doesn't support NFSv4. [nfs pv example]: nfs-pv.png ## Quickstart ```console $ kubectl create -f examples/volumes/nfs/provisioner/nfs-server-gce-pv.yaml $ kubectl create -f examples/volumes/nfs/nfs-server-rc.yaml $ kubectl create -f examples/volumes/nfs/nfs-server-service.yaml # get the cluster IP of the server using the following command $ kubectl describe services nfs-server # use the NFS server IP to update nfs-pv.yaml and execute the following $ kubectl create -f examples/volumes/nfs/nfs-pv.yaml $ kubectl create -f examples/volumes/nfs/nfs-pvc.yaml # run a fake backend $ kubectl create -f examples/volumes/nfs/nfs-busybox-rc.yaml # get pod name from this command $ kubectl get pod -l name=nfs-busybox # use the pod name to check the test file $ kubectl exec nfs-busybox-jdhf3 -- cat /mnt/index.html ``` ## Example of NFS based persistent volume See [NFS Service and Replication Controller](nfs-web-rc.yaml) for a quick example of how to use an NFS volume claim in a replication controller. It relies on the [NFS persistent volume](nfs-pv.yaml) and [NFS persistent volume claim](nfs-pvc.yaml) in this example as well. ## Complete setup The example below shows how to export a NFS share from a single pod replication controller and import it into two replication controllers. ### NFS server part Define [the NFS Service and Replication Controller](nfs-server-rc.yaml) and [NFS service](nfs-server-service.yaml): The NFS server exports an an auto-provisioned persistent volume backed by GCE PD: ```console $ kubectl create -f examples/volumes/nfs/provisioner/nfs-server-gce-pv.yaml ``` ```console $ kubectl create -f examples/volumes/nfs/nfs-server-rc.yaml $ kubectl create -f examples/volumes/nfs/nfs-server-service.yaml ``` The directory contains dummy `index.html`. Wait until the pod is running by checking `kubectl get pods -l role=nfs-server`. ### Create the NFS based persistent volume claim The [NFS busybox controller](nfs-busybox-rc.yaml) uses a simple script to generate data written to the NFS server we just started. First, you'll need to find the cluster IP of the server: ```console $ kubectl describe services nfs-server ``` Replace the invalid IP in the [nfs PV](nfs-pv.yaml). (In the future, we'll be able to tie these together using the service names, but for now, you have to hardcode the IP.) Create the the [persistent volume](../../../docs/user-guide/persistent-volumes.md) and the persistent volume claim for your NFS server. The persistent volume and claim gives us an indirection that allow multiple pods to refer to the NFS server using a symbolic name rather than the hardcoded server address. ```console $ kubectl create -f examples/volumes/nfs/nfs-pv.yaml $ kubectl create -f examples/volumes/nfs/nfs-pvc.yaml ``` ## Setup the fake backend The [NFS busybox controller](nfs-busybox-rc.yaml) updates `index.html` on the NFS server every 10 seconds. Let's start that now: ```console $ kubectl create -f examples/volumes/nfs/nfs-busybox-rc.yaml ``` Conveniently, it's also a `busybox` pod, so we can get an early check that our mounts are working now. Find a busybox pod and exec: ```console $ kubectl get pod -l name=nfs-busybox NAME READY STATUS RESTARTS AGE nfs-busybox-jdhf3 1/1 Running 0 25m nfs-busybox-w3s4t 1/1 Running 0 25m $ kubectl exec nfs-busybox-jdhf3 -- cat /mnt/index.html Thu Oct 22 19:20:18 UTC 2015 nfs-busybox-w3s4t ``` You should see output similar to the above if everything is working well. If it's not, make sure you changed the invalid IP in the [NFS PV](nfs-pv.yaml) file and make sure the `describe services` command above had endpoints listed (indicating the service was associated with a running pod). ### Setup the web server The [web server controller](nfs-web-rc.yaml) is an another simple replication controller demonstrates reading from the NFS share exported above as a NFS volume and runs a simple web server on it. Define the pod: ```console $ kubectl create -f examples/volumes/nfs/nfs-web-rc.yaml ``` This creates two pods, each of which serve the `index.html` from above. We can then use a simple service to front it: ```console kubectl create -f examples/volumes/nfs/nfs-web-service.yaml ``` We can then use the busybox container we launched before to check that `nginx` is serving the data appropriately: ```console $ kubectl get pod -l name=nfs-busybox NAME READY STATUS RESTARTS AGE nfs-busybox-jdhf3 1/1 Running 0 1h nfs-busybox-w3s4t 1/1 Running 0 1h $ kubectl get services nfs-web NAME LABELS SELECTOR IP(S) PORT(S) nfs-web role=web-frontend 10.0.68.37 80/TCP $ kubectl exec nfs-busybox-jdhf3 -- wget -qO- http://10.0.68.37 Thu Oct 22 19:28:55 UTC 2015 nfs-busybox-w3s4t ``` [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/volumes/nfs/README.md?pixel)]()