mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->
 | 
						|
 | 
						|
<!-- BEGIN STRIP_FOR_RELEASE -->
 | 
						|
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
 | 
						|
<h2>PLEASE NOTE: This document applies to the HEAD of the source tree</h2>
 | 
						|
 | 
						|
If you are using a released version of Kubernetes, you should
 | 
						|
refer to the docs that go with that version.
 | 
						|
 | 
						|
<!-- TAG RELEASE_LINK, added by the munger automatically -->
 | 
						|
<strong>
 | 
						|
The latest release of this document can be found
 | 
						|
[here](http://releases.k8s.io/release-1.2/examples/nfs/README.md).
 | 
						|
 | 
						|
Documentation for other releases can be found at
 | 
						|
[releases.k8s.io](http://releases.k8s.io).
 | 
						|
</strong>
 | 
						|
--
 | 
						|
 | 
						|
<!-- END STRIP_FOR_RELEASE -->
 | 
						|
 | 
						|
<!-- END MUNGE: UNVERSIONED_WARNING -->
 | 
						|
 | 
						|
# 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
 | 
						|
 | 
						|
 | 
						|
## tl;dr Quickstart
 | 
						|
 | 
						|
```console
 | 
						|
$ kubectl create -f examples/nfs/provisioner/nfs-server-gce-pv.yaml
 | 
						|
$ kubectl create -f examples/nfs/nfs-server-rc.yaml
 | 
						|
$ kubectl create -f examples/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/nfs/nfs-pv.yaml
 | 
						|
$ kubectl create -f examples/nfs/nfs-pvc.yaml
 | 
						|
# run a fake backend
 | 
						|
$ kubectl create -f examples/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/nfs/provisioner/nfs-server-gce-pv.yaml
 | 
						|
```
 | 
						|
 | 
						|
```console
 | 
						|
$ kubectl create -f examples/nfs/nfs-server-rc.yaml
 | 
						|
$ kubectl create -f examples/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/nfs/nfs-pv.yaml
 | 
						|
$ kubectl create -f examples/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/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/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/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   <none>    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
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
<!-- BEGIN MUNGE: IS_VERSIONED -->
 | 
						|
<!-- TAG IS_VERSIONED -->
 | 
						|
<!-- END MUNGE: IS_VERSIONED -->
 | 
						|
 | 
						|
 | 
						|
<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
 | 
						|
[]()
 | 
						|
<!-- END MUNGE: GENERATED_ANALYTICS -->
 |