From 7865afe45928f1c528bbb8ddf50e4d6bacf1d50f Mon Sep 17 00:00:00 2001
From: Qiming Teng <tengqim@cn.ibm.com>
Date: Tue, 24 Oct 2017 11:29:58 +0800
Subject: [PATCH] Migrate dynamic provisioning documentation

---
 _data/concepts.yml                            |   3 +-
 docs/concepts/storage/dynamic-provisioning.md | 124 ++++++++++++++++++
 2 files changed, 125 insertions(+), 2 deletions(-)
 create mode 100644 docs/concepts/storage/dynamic-provisioning.md

diff --git a/_data/concepts.yml b/_data/concepts.yml
index 742f389f3a..0d3d7b6416 100644
--- a/_data/concepts.yml
+++ b/_data/concepts.yml
@@ -75,8 +75,7 @@ toc:
   section:
   - docs/concepts/storage/volumes.md
   - docs/concepts/storage/persistent-volumes.md
-  - title: Dynamic Provisioning
-    path: http://blog.kubernetes.io/2016/10/dynamic-provisioning-and-storage-in-kubernetes.html
+  - docs/concepts/storage/dynamic-provisioning.md
 
 - title: Cluster Administration
   section:
diff --git a/docs/concepts/storage/dynamic-provisioning.md b/docs/concepts/storage/dynamic-provisioning.md
new file mode 100644
index 0000000000..6b60989208
--- /dev/null
+++ b/docs/concepts/storage/dynamic-provisioning.md
@@ -0,0 +1,124 @@
+---
+approvers:
+- saad-ali
+title: Dynamic Volume Provisioning
+---
+
+{% capture overview %}
+
+Dynamic volume provisioning allows storage volumes to be created on-demand.
+Without dynamic provisioning, cluster administrators have to manually make
+calls to their cloud or storage provider to create new storage volumes, and
+then create [`PersistentVolume` objects](/docs/concepts/storage/persistent-volumes/)
+to represent them in Kubernetes. The dynamic provisioning feature eliminates
+the need for cluster administrators to pre-provision storage. Instead, it
+automatically provisions storage when it is requested by users.
+
+{% endcapture %}
+
+{:toc}
+
+{% capture body %}
+
+## Background
+
+The implementation of dynamic volume provisioning is based on the API object `StorageClass`
+from the API group `storage.k8s.io`. A cluster administrator can define as many
+`StorageClass` objects as needed, each specifying a *volume plugin* (aka
+*provisioner*) that provisions a volume and the set of parameters to pass to
+that provisioner when provisioning.
+A cluster administrator can define and expose multiple flavors of storage (from
+the same or different storage systems) within a cluster, each with a custom set
+of parameters. This design also ensures that end users don’t have to worry
+about the the complexity and nuances of how storage is provisioned, but still
+have the ability to select from multiple storage options.
+
+More information on storage classes can be found
+[here](/docs/concepts/storage/persistent-volumes/#storageclasses).
+
+## Enabling Dynamic Provisioning
+
+To enable dynamic provisioning, a cluster administrator needs to pre-create
+one or more StorageClass objects for users.
+StorageClass objects define which provisioner should be used and what parameters
+should be passed to that provisioner when dynamic provisioning is invoked.
+The following manifest creates a storage class "slow" which provisions standard
+disk-like persistent disks.
+
+```yaml
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: slow
+provisioner: kubernetes.io/gce-pd
+parameters:
+  type: pd-standard
+```
+
+The following manifest creates a storage class "fast" which provisions
+SSD-like persistent disks.
+
+```yaml
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: fast
+provisioner: kubernetes.io/gce-pd
+parameters:
+  type: pd-ssd
+```
+
+## Using Dynamic Provisioning
+
+Users request dynamically provisioned storage by including a storage class in
+their `PersistentVolumeClaim`. Before Kubernetes v1.6, this was done via the
+`volume.beta.kubernetes.io/storage-class` annotation. However, this annotation
+is deprecated since v1.6. Users now can and should instead use the
+`storageClassName` field of the `PersistentVolumeClaim` object. The value of
+this field must match the name of a `StorageClass` configured by the
+administrator (see [below](#enabling-dynamic-provisioning)).
+
+To select the “fast” storage class, for example, a user would create the
+following `PersistentVolumeClaim`:
+
+```yaml
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: claim1
+spec:
+  accessModes:
+    - ReadWriteOnce
+  storageClassName: fast
+  resources:
+    requests:
+      storage: 30Gi
+```
+
+This claim results in an SSD-like Persistent Disk being automatically
+provisioned. When the claim is deleted, the volume is destroyed.
+
+## Defaulting Behavior
+
+Dynamic provisioning can be enabled on a cluster such that all claims are
+dynamically provisioned if no storage class is specified. A cluster administrator
+can enable this behavior by:
+
+- Marking one `StorageClass` object as *default*;
+- Making sure that the [`DefaultStorageClass` admission controller](/docs/admin/admission-controllers/#defaultstorageclass)
+  is enabled on the API server.
+
+An administrator can mark a specific `StorageClass` as default by adding the
+`storageclass.kubernetes.io/is-default-class` annotation to it.
+When a default `StorageClass` exists in a cluster and a user creates a
+`PersistentVolumeClaim` with `storageClassName` unspecified, the
+`DefaultStorageClass` admission controller automatically adds the
+`storageClassName` field pointing to the default storage class.
+
+Note that there can be at most one *default* storage class on a cluster, or
+a `PersistentVolumeClaim` with `storageClassName` explicitly specified cannot
+be created.
+
+{% endcapture %}
+
+{% include templates/concept.md %}