docs(README.md): add NFS verify instructions and move CR files to example
diff --git a/README.md b/README.md
index 7564378..13936d3 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,29 @@
 
 The first step is to prepare a storage class to create PV and PVC where the RocketMQ data will be stored. Here we use NFS as the storage class.
 
-1. Deploy NFS server and clients on your Kubernetes cluster. Please make sure they are functional before you go to the next step.
+1. Deploy NFS server and clients on your Kubernetes cluster. Please make sure they are functional before you go to the next step. Here is a instruction on how to verify NFS service.
+
+    1) On your NFS client node, check if NFS shared dir exists.
+    ```
+   $ showmount -e 192.168.130.32
+   Export list for 192.168.130.32:
+   /data/k8s * 
+    ```
+    2) On your NFS client node, create a test dir and mount it to the NFS shared dir (you may need sudo permission).
+    ```
+   $ mkdir -p   ~/test-nfc
+   $ mount -t nfs 192.168.130.32:/data/k8s ~/test-nfc
+    ```
+    3) On your NFS client node, create a test file on the mounted test dir.
+    ```
+   $ touch ~/test-nfc/test.txt
+    ```
+   4) On your NFS server node, check the shared dir. If there exists the test file we created on the client node, it proves the NFS service is functional.
+   ```
+   $ ls -ls /data/k8s/
+   total 4
+   4 -rw-r--r--. 1 root root 4 Jul 10 21:50 test.txt
+   ```
 
 2. Modify the following configurations of the ```deploy/storage/nfs-client.yaml``` file:
 ``` 
@@ -47,7 +69,7 @@
 
 RocketMQ Operator provides several CRDs to allow users define their RocketMQ service component cluster, which includes the Namesrv cluster and the Broker cluster.
 
-1. Check the file ```rocketmq_v1alpha1_nameservice_cr.yaml``` in the ```deploy/crds``` directory, for example:
+1. Check the file ```rocketmq_v1alpha1_nameservice_cr.yaml``` in the ```example``` directory, for example:
 ```
 apiVersion: rocketmq.apache.org/v1alpha1
 kind: NameService
@@ -75,7 +97,7 @@
 
 which defines the RocketMQ name service (namesrv) cluster scale.
 
-2. Check the file ```cache_v1alpha1_broker_cr.yaml``` in the ```deploy/crds``` directory, for example:
+2. Check the file ```rocketmq_v1alpha1_broker_cr.yaml``` in the ```example``` directory, for example:
 ```
 apiVersion: rocketmq.apache.org/v1alpha1
 kind: Broker
@@ -131,7 +153,7 @@
 2. Deploy the RocketMQ name service cluster by running:
 
 ``` 
-$ kubectl apply -f deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml 
+$ kubectl apply -f example/rocketmq_v1alpha1_nameservice_cr.yaml 
 nameservice.rocketmq.apache.org/name-service created
 ```
 
@@ -145,12 +167,12 @@
 rocketmq-operator-564b5d75d-jllzk         1/1     Running   0          5m53s   10.244.2.116     k2data-14   <none>           <none>
 ```
 
-We can see that there are 1 name service Pods running on 1 nodes and their IP addresses. Modify the ```nameServers``` field in the ```cache_v1alpha1_broker_cr.yaml``` file using the IP addresses.
+We can see that there are 1 name service Pods running on 1 nodes and their IP addresses. Modify the ```nameServers``` field in the ```rocketmq_v1alpha1_broker_cr.yaml``` file using the IP addresses.
 
 3. Deploy the RocketMQ broker clusters by running:
 ```
-$ kubectl apply -f deploy/crds/cache_v1alpha1_broker_cr.yaml 
-broker.cache.example.com/broker created 
+$ kubectl apply -f example/rocketmq_v1alpha1_broker_cr.yaml
+broker.rocketmq.apache.org/broker created 
 ```
 
 After a while after the Containers are created, the Kubernetes clusters status should be like:
@@ -159,9 +181,9 @@
 $ kubectl get pods -owide
 NAME                                      READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
 broker-0-master-0                         1/1     Running   0          38s     10.244.4.18      k2data-11   <none>           <none>
-broker-0-replica-1-0                        1/1     Running   0          38s     10.244.1.128     k2data-13   <none>           <none>
+broker-0-replica-1-0                      1/1     Running   0          38s     10.244.1.128     k2data-13   <none>           <none>
 broker-1-master-0                         1/1     Running   0          38s     10.244.2.117     k2data-14   <none>           <none>
-broker-1-replica-1-0                        1/1     Running   0          38s     10.244.3.17      k2data-15   <none>           <none>
+broker-1-replica-1-0                      1/1     Running   0          38s     10.244.3.17      k2data-15   <none>           <none>
 name-service-0                            1/1     Running   0          6m7s    192.168.130.33   k2data-13   <none>           <none>
 nfs-client-provisioner-7cf858f754-7vxmm   1/1     Running   0          153m    10.244.2.114     k2data-14   <none>           <none>
 rocketmq-operator-564b5d75d-jllzk         1/1     Running   0          8m42s   10.244.2.116     k2data-14   <none>           <none>
@@ -170,17 +192,18 @@
 Check the PV and PVC status:
 ```
 $ kubectl get pvc
-NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
-broker-storage-broker-0-master-0    Bound    pvc-7a74871b-c005-441a-bb15-8106566c9d19   8Gi        RWO            rocketmq-storage   78s
-broker-storage-broker-0-replica-1-0   Bound    pvc-521e7e9a-3795-487a-9f76-22da74db74dd   8Gi        RWO            rocketmq-storage   78s
-broker-storage-broker-1-master-0    Bound    pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c   8Gi        RWO            rocketmq-storage   78s
-broker-storage-broker-1-replica-1-0   Bound    pvc-af266db9-83a9-4929-a2fe-e40fb5fdbfa4   8Gi        RWO            rocketmq-storage   78s
-namesrv-storage-name-service-0      Bound    pvc-c708cb49-aa52-4992-8cac-f46a48e2cc2e   1Gi        RWO            rocketmq-storage   79s
+NAME                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
+broker-storage-broker-0-master-0        Bound    pvc-7a74871b-c005-441a-bb15-8106566c9d19   8Gi        RWO            rocketmq-storage   78s
+broker-storage-broker-0-replica-1-0     Bound    pvc-521e7e9a-3795-487a-9f76-22da74db74dd   8Gi        RWO            rocketmq-storage   78s
+broker-storage-broker-1-master-0        Bound    pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c   8Gi        RWO            rocketmq-storage   78s
+broker-storage-broker-1-replica-1-0     Bound    pvc-af266db9-83a9-4929-a2fe-e40fb5fdbfa4   8Gi        RWO            rocketmq-storage   78s
+namesrv-storage-name-service-0          Bound    pvc-c708cb49-aa52-4992-8cac-f46a48e2cc2e   1Gi        RWO            rocketmq-storage   79s
+
 $ kubectl get pv
 NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                       STORAGECLASS       REASON   AGE
-pvc-521e7e9a-3795-487a-9f76-22da74db74dd   8Gi        RWO            Delete           Bound    default/broker-storage-broker-0-replica-1-0   rocketmq-storage            79s
+pvc-521e7e9a-3795-487a-9f76-22da74db74dd   8Gi        RWO            Delete           Bound    default/broker-storage-broker-0-replica-1-0 rocketmq-storage            79s
 pvc-7a74871b-c005-441a-bb15-8106566c9d19   8Gi        RWO            Delete           Bound    default/broker-storage-broker-0-master-0    rocketmq-storage            79s
-pvc-af266db9-83a9-4929-a2fe-e40fb5fdbfa4   8Gi        RWO            Delete           Bound    default/broker-storage-broker-1-replica-1-0   rocketmq-storage            78s
+pvc-af266db9-83a9-4929-a2fe-e40fb5fdbfa4   8Gi        RWO            Delete           Bound    default/broker-storage-broker-1-replica-1-0 rocketmq-storage            78s
 pvc-c708cb49-aa52-4992-8cac-f46a48e2cc2e   1Gi        RWO            Delete           Bound    default/namesrv-storage-name-service-0      rocketmq-storage            79s
 pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c   8Gi        RWO            Delete           Bound    default/broker-storage-broker-1-master-0    rocketmq-storage            78s
 ```
@@ -193,12 +216,15 @@
 
 ```
 $ cd /data/k8s/
+
 $ ls
 default-broker-storage-broker-0-master-0-pvc-7a74871b-c005-441a-bb15-8106566c9d19   default-broker-storage-broker-1-replica-1-0-pvc-af266db9-83a9-4929-a2fe-e40fb5fdbfa4
 default-broker-storage-broker-0-replica-1-0-pvc-521e7e9a-3795-487a-9f76-22da74db74dd  default-namesrv-storage-name-service-0-pvc-c708cb49-aa52-4992-8cac-f46a48e2cc2e
 default-broker-storage-broker-1-master-0-pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c
+
 $ ls default-broker-storage-broker-1-master-0-pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c/logs/rocketmqlogs/
 broker_default.log  broker.log  commercial.log  filter.log  lock.log  protection.log  remoting.log  stats.log  storeerror.log  store.log  transaction.log  watermark.log
+
 $ cat default-broker-storage-broker-1-master-0-pvc-d7b76efe-384c-4f8d-9e8a-ebe209ba826c/logs/rocketmqlogs/broker.log 
 ...
 2019-09-10 14:12:22 INFO main - The broker[broker-1-master-0, 10.244.2.117:10911] boot success. serializeType=JSON and name server is 192.168.130.33:9876
@@ -212,13 +238,13 @@
 If you want to tear down the RocketMQ cluster, to remove the broker clusters run
 
 ```
-$ kubectl delete -f deploy/crds/cache_v1alpha1_broker_cr.yaml 
+$ kubectl delete -f example/rocketmq_v1alpha1_broker_cr.yaml
 ```
 
 to remove the name service clusters:
 
 ```
-$ kubectl delete -f deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml
+$ kubectl delete -f example/rocketmq_v1alpha1_nameservice_cr.yaml
 ```
 
 to remove the RocketMQ Operator:
diff --git a/deploy/crds/rocketmq_v1alpha1_broker_cr.yaml b/example/rocketmq_v1alpha1_broker_cr.yaml
similarity index 100%
rename from deploy/crds/rocketmq_v1alpha1_broker_cr.yaml
rename to example/rocketmq_v1alpha1_broker_cr.yaml
diff --git a/deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml b/example/rocketmq_v1alpha1_nameservice_cr.yaml
similarity index 100%
rename from deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml
rename to example/rocketmq_v1alpha1_nameservice_cr.yaml
diff --git a/install-operator.sh b/install-operator.sh
index c93b6d5..2fc7b00 100755
--- a/install-operator.sh
+++ b/install-operator.sh
@@ -24,5 +24,5 @@
 
 echo "Wait for operator being ready..."
 sleep 2
-#kubectl create -f deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml
-#kubectl create -f deploy/crds/rocketmq_v1alpha1_broker_cr.yaml
+#kubectl create -f example/rocketmq_v1alpha1_nameservice_cr.yaml
+#kubectl create -f example/rocketmq_v1alpha1_broker_cr.yaml
diff --git a/pkg/apis/rocketmq/v1alpha1/broker_types.go b/pkg/apis/rocketmq/v1alpha1/broker_types.go
index e94c7a2..9414788 100644
--- a/pkg/apis/rocketmq/v1alpha1/broker_types.go
+++ b/pkg/apis/rocketmq/v1alpha1/broker_types.go
@@ -44,6 +44,10 @@
 	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"`
 	// AllowRestart defines whether allow pod restart
 	AllowRestart bool `json:"allowRestart"`
+	// StorageMode can be EmptyDir, HostPath, NFS
+	StorageMode string `json:"storageMode"`
+	// HostPath is the local path to store data
+	HostPath string `json:"hostPath"`
 	// VolumeClaimTemplates defines the StorageClass
 	VolumeClaimTemplates []corev1.PersistentVolumeClaim `json:"volumeClaimTemplates"`
 }
diff --git a/pkg/apis/rocketmq/v1alpha1/nameservice_types.go b/pkg/apis/rocketmq/v1alpha1/nameservice_types.go
index b932dc5..7cb1a46 100644
--- a/pkg/apis/rocketmq/v1alpha1/nameservice_types.go
+++ b/pkg/apis/rocketmq/v1alpha1/nameservice_types.go
@@ -37,6 +37,10 @@
 	NameServiceImage string `json:"nameServiceImage"`
 	// ImagePullPolicy defines how the image is pulled.
 	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"`
+	// StorageMode can be EmptyDir, HostPath, NFS
+	StorageMode string `json:"storageMode"`
+	// HostPath is the local path to store data
+	HostPath string `json:"hostPath"`
 	// VolumeClaimTemplates defines the StorageClass
 	VolumeClaimTemplates []corev1.PersistentVolumeClaim `json:"volumeClaimTemplates"`
 }
diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go
index aaf7e35..ab829a6 100644
--- a/pkg/constants/constants.go
+++ b/pkg/constants/constants.go
@@ -20,7 +20,7 @@
 const BrokerClusterPrefix = "broker-cluster-"
 const MasterBrokerContainerNamePrefix = "broker-master"
 const ReplicaBrokerContainerNamePrefix = "broker-replica"
-const MqAdminDir  = "/home/rocketmq/rocketmq-4.5.0/bin/mqadmin"
+const AdminToolDir = "/home/rocketmq/rocketmq-4.5.0/bin/mqadmin"
 const UpdateBrokerConfig  = "updateBrokerConfig"
 const ParamNameServiceAddress = "namesrvAddr"
 const EnvNameServiceAddress = "NAMESRV_ADDR"
@@ -41,4 +41,9 @@
 const BrokerHighAvailabilityContainerPort  = 10912
 const BrokerHighAvailabilityContainerPortName = "ha"
 
+const StorageModeNFS  = "NFS"
+const StorageModeEmptyDir  = "EmptyDir"
+const StorageModeHostPath  = "HostPath"
+
+
 
diff --git a/pkg/controller/broker/broker_controller.go b/pkg/controller/broker/broker_controller.go
index c39805c..2101ce3 100644
--- a/pkg/controller/broker/broker_controller.go
+++ b/pkg/controller/broker/broker_controller.go
@@ -250,14 +250,14 @@
 }
 
 // statefulSetForBroker returns a master broker StatefulSet object
-func (r *ReconcileBroker) statefulSetForMasterBroker(m *rocketmqv1alpha1.Broker, brokerGroupIndex int) *appsv1.StatefulSet {
-	ls := labelsForBroker(m.Name)
+func (r *ReconcileBroker) statefulSetForMasterBroker(broker *rocketmqv1alpha1.Broker, brokerGroupIndex int) *appsv1.StatefulSet {
+	ls := labelsForBroker(broker.Name)
 	var a int32 = 1
 	var c = &a
 	dep := &appsv1.StatefulSet{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      m.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-master",
-			Namespace: m.Namespace,
+			Name:      broker.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-master",
+			Namespace: broker.Namespace,
 		},
 		Spec: appsv1.StatefulSetSpec{
 			Replicas: c,
@@ -270,24 +270,24 @@
 				},
 				Spec: corev1.PodSpec{
 					Containers: []corev1.Container{{
-						Image:           m.Spec.BrokerImage,
+						Image:           broker.Spec.BrokerImage,
 						Name:            cons.MasterBrokerContainerNamePrefix + strconv.Itoa(brokerGroupIndex),
-						ImagePullPolicy: m.Spec.ImagePullPolicy,
+						ImagePullPolicy: broker.Spec.ImagePullPolicy,
 						Env: []corev1.EnvVar{{
 							Name:  cons.EnvNameServiceAddress,
-							Value: m.Spec.NameServers,
+							Value: broker.Spec.NameServers,
 						}, {
 							Name:  cons.EnvReplicationMode,
-							Value: m.Spec.ReplicationMode,
+							Value: broker.Spec.ReplicationMode,
 						}, {
 							Name:  cons.EnvBrokerId,
 							Value: "0",
 						}, {
 							Name:  cons.EnvBrokerClusterName,
-							Value: m.Name,
+							Value: broker.Name,
 						}, {
 							Name:  cons.EnvBrokerName,
-							Value: m.Name + "-" + strconv.Itoa(brokerGroupIndex),
+							Value: broker.Name + "-" + strconv.Itoa(brokerGroupIndex),
 						}},
 						Ports: []corev1.ContainerPort{{
 							ContainerPort: cons.BrokerVipContainerPort,
@@ -301,35 +301,36 @@
 						}},
 						VolumeMounts: []corev1.VolumeMount{{
 							MountPath: cons.LogMountPath,
-							Name: m.Spec.VolumeClaimTemplates[0].Name,
-							SubPath: cons.LogSubPathName,
+							Name:      broker.Spec.VolumeClaimTemplates[0].Name,
+							SubPath:   cons.LogSubPathName,
 						},{
 							MountPath: cons.StoreMountPath,
-							Name: m.Spec.VolumeClaimTemplates[0].Name,
-							SubPath: cons.StoreSubPathName,
+							Name:      broker.Spec.VolumeClaimTemplates[0].Name,
+							SubPath:   cons.StoreSubPathName,
 						}},
 					}},
+					Volumes: getVolumes(broker),
 				},
 			},
-			VolumeClaimTemplates: m.Spec.VolumeClaimTemplates,
+			VolumeClaimTemplates: getVolumeClaimTemplates(broker),
 		},
 	}
 	// Set Broker instance as the owner and controller
-	controllerutil.SetControllerReference(m, dep, r.scheme)
+	controllerutil.SetControllerReference(broker, dep, r.scheme)
 
 	return dep
 
 }
 
 // statefulSetForBroker returns a replica broker StatefulSet object
-func (r *ReconcileBroker) statefulSetForReplicaBroker(m *rocketmqv1alpha1.Broker, brokerGroupIndex int, replicaIndex int) *appsv1.StatefulSet {
-	ls := labelsForBroker(m.Name)
+func (r *ReconcileBroker) statefulSetForReplicaBroker(broker *rocketmqv1alpha1.Broker, brokerGroupIndex int, replicaIndex int) *appsv1.StatefulSet {
+	ls := labelsForBroker(broker.Name)
 	var a int32 = 1
 	var c = &a
 	dep := &appsv1.StatefulSet{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      m.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-replica-" + strconv.Itoa(replicaIndex),
-			Namespace: m.Namespace,
+			Name:      broker.Name + "-" + strconv.Itoa(brokerGroupIndex) + "-replica-" + strconv.Itoa(replicaIndex),
+			Namespace: broker.Namespace,
 		},
 		Spec: appsv1.StatefulSetSpec{
 			Replicas: c,
@@ -342,24 +343,24 @@
 				},
 				Spec: corev1.PodSpec{
 					Containers: []corev1.Container{{
-						Image:           m.Spec.BrokerImage,
+						Image:           broker.Spec.BrokerImage,
 						Name:            cons.ReplicaBrokerContainerNamePrefix + strconv.Itoa(brokerGroupIndex),
-						ImagePullPolicy: m.Spec.ImagePullPolicy,
+						ImagePullPolicy: broker.Spec.ImagePullPolicy,
 						Env: []corev1.EnvVar{{
 							Name:  cons.EnvNameServiceAddress,
-							Value: m.Spec.NameServers,
+							Value: broker.Spec.NameServers,
 						}, {
 							Name:  cons.EnvReplicationMode,
-							Value: m.Spec.ReplicationMode,
+							Value: broker.Spec.ReplicationMode,
 						}, {
 							Name:  cons.EnvBrokerId,
 							Value: strconv.Itoa(replicaIndex),
 						}, {
 							Name:  cons.EnvBrokerClusterName,
-							Value: m.Name,
+							Value: broker.Name,
 						}, {
 							Name:  cons.EnvBrokerName,
-							Value: m.Name + "-" + strconv.Itoa(brokerGroupIndex),
+							Value: broker.Name + "-" + strconv.Itoa(brokerGroupIndex),
 						}},
 						Ports: []corev1.ContainerPort{{
 							ContainerPort: cons.BrokerVipContainerPort,
@@ -373,26 +374,67 @@
 						}},
 						VolumeMounts: []corev1.VolumeMount{{
 							MountPath: cons.LogMountPath,
-							Name: m.Spec.VolumeClaimTemplates[0].Name,
-							SubPath: cons.LogSubPathName,
+							Name:      broker.Spec.VolumeClaimTemplates[0].Name,
+							SubPath:   cons.LogSubPathName,
 						},{
 							MountPath: cons.StoreMountPath,
-							Name: m.Spec.VolumeClaimTemplates[0].Name,
-							SubPath: cons.StoreSubPathName,
+							Name:      broker.Spec.VolumeClaimTemplates[0].Name,
+							SubPath:   cons.StoreSubPathName,
 						}},
 					}},
+					Volumes: getVolumes(broker),
 				},
 			},
-			VolumeClaimTemplates: m.Spec.VolumeClaimTemplates,
+			VolumeClaimTemplates: getVolumeClaimTemplates(broker),
 		},
 	}
 	// Set Broker instance as the owner and controller
-	controllerutil.SetControllerReference(m, dep, r.scheme)
+	controllerutil.SetControllerReference(broker, dep, r.scheme)
 
 	return dep
 
 }
 
+func getVolumeClaimTemplates(broker *rocketmqv1alpha1.Broker) []corev1.PersistentVolumeClaim{
+	switch broker.Spec.StorageMode {
+	case cons.StorageModeNFS:
+		return broker.Spec.VolumeClaimTemplates
+	case cons.StorageModeEmptyDir:
+		fallthrough
+	case cons.StorageModeHostPath:
+		fallthrough
+	default:
+		return nil
+	}
+}
+
+func getVolumes(broker *rocketmqv1alpha1.Broker) []corev1.Volume {
+	switch broker.Spec.StorageMode {
+	case cons.StorageModeNFS:
+		return nil
+	case cons.StorageModeEmptyDir:
+		volumes := []corev1.Volume{{
+			Name: broker.Spec.VolumeClaimTemplates[0].Name,
+			VolumeSource: corev1.VolumeSource{
+				EmptyDir: &corev1.EmptyDirVolumeSource{
+
+				}},
+		}}
+		return volumes
+	case cons.StorageModeHostPath:
+		fallthrough
+	default:
+		volumes := []corev1.Volume{{
+			Name: broker.Spec.VolumeClaimTemplates[0].Name,
+			VolumeSource: corev1.VolumeSource{
+				HostPath: &corev1.HostPathVolumeSource{
+					Path: broker.Spec.HostPath,
+				}},
+		}}
+		return volumes
+	}
+}
+
 // labelsForBroker returns the labels for selecting the resources
 // belonging to the given broker CR name.
 func labelsForBroker(name string) map[string]string {
diff --git a/pkg/controller/nameservice/nameservice_controller.go b/pkg/controller/nameservice/nameservice_controller.go
index a3278ea..5395771 100644
--- a/pkg/controller/nameservice/nameservice_controller.go
+++ b/pkg/controller/nameservice/nameservice_controller.go
@@ -205,7 +205,7 @@
 			return reconcile.Result{Requeue: true}, err
 		}
 
-		mqAdmin := cons.MqAdminDir
+		mqAdmin := cons.AdminToolDir
 		subCmd := cons.UpdateBrokerConfig
 		key := cons.ParamNameServiceAddress
 
@@ -234,6 +234,44 @@
 	}
 }
 
+func getVolumeClaimTemplates(nameService *rocketmqv1alpha1.NameService) []corev1.PersistentVolumeClaim{
+	switch nameService.Spec.StorageMode {
+	case cons.StorageModeNFS:
+		return nameService.Spec.VolumeClaimTemplates
+	case cons.StorageModeEmptyDir, cons.StorageModeHostPath:
+		fallthrough
+	default:
+		return nil
+	}
+}
+
+func getVolumes(nameService *rocketmqv1alpha1.NameService) []corev1.Volume {
+	switch nameService.Spec.StorageMode {
+	case cons.StorageModeNFS:
+		return nil
+	case cons.StorageModeEmptyDir:
+		volumes := []corev1.Volume{{
+			Name: nameService.Spec.VolumeClaimTemplates[0].Name,
+			VolumeSource: corev1.VolumeSource{
+				EmptyDir: &corev1.EmptyDirVolumeSource{
+
+				}},
+		}}
+		return volumes
+	case cons.StorageModeHostPath:
+		fallthrough
+	default:
+		volumes := []corev1.Volume{{
+			Name: nameService.Spec.VolumeClaimTemplates[0].Name,
+			VolumeSource: corev1.VolumeSource{
+				HostPath: &corev1.HostPathVolumeSource{
+					Path: nameService.Spec.HostPath,
+				}},
+		}}
+		return volumes
+	}
+}
+
 func getNameServers(pods []corev1.Pod) []string {
 	var nameServers []string
 	for _, pod := range pods {
diff --git a/purge-operator.sh b/purge-operator.sh
index 5c3091f..81c75d0 100755
--- a/purge-operator.sh
+++ b/purge-operator.sh
@@ -16,8 +16,8 @@
 # limitations under the License.
 
 echo "Stopping RocketMQ-Operator..."
-#kubectl delete -f deploy/crds/rocketmq_v1alpha1_broker_cr.yaml
-#kubectl delete -f deploy/crds/rocketmq_v1alpha1_nameservice_cr.yaml
+#kubectl delete -f example/rocketmq_v1alpha1_broker_cr.yaml
+#kubectl delete -f example/rocketmq_v1alpha1_nameservice_cr.yaml
 
 kubectl delete -f deploy/operator.yaml
 kubectl delete -f deploy/role_binding.yaml