1. introduction:
This paper introduces a scheme of dynamically generating NAS storage volume: on an existing file system, a directory is automatically generated, which is defined as the target storage volume;
Image address: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-433631d-aliyun
Default build resource:
The name of the generated PV is: PVC - ${PVC uid}
Name of the generated directory: namespace pvcname pvname
You can make the following declaration in annotations of pvc, and customize the name:
The generated pv and directory names are the names defined below.
annotations: pv-name-created: replace-user-id
2. Deploy NAS Controller
Alicloud NAS controller is created to realize dynamic provider nas pv;
Create alicloud NAS storageclass to provide template for nas pv provision;
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas provisioner: alicloud/nas reclaimPolicy: Delete parameters: drivertype: flexvolume nfsversion: "4.0" options: "" --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: alicloud-nas-controller namespace: kube-system spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: alicloud-nas-controller spec: tolerations: - effect: NoSchedule operator: Exists key: node-role.kubernetes.io/master - effect: NoSchedule operator: Exists key: node.cloudprovider.kubernetes.io/uninitialized serviceAccount: admin containers: - name: alicloud-nas-controller image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-433631d-aliyun imagePullPolicy: Always volumeMounts: - mountPath: /persistentvolumes name: nfs-client-root env: - name: NFS_SERVER value: 154154b095-**.cn-beijing.nas.aliyuncs.com - name: NFS_PATH value: / volumes: - name: nfs-client-root flexVolume: driver: alicloud/nas options: path: / server: 154154b095-**.cn-beijing.nas.aliyuncs.com vers: "4.0"
StorageClass instructions:
drivertype: used to represent the pv storage type generated, optional nfs, flexvolume NFS: the default option, indicating that k8s native NFS drive is used for mounting; Flexvolume: indicates using the Flexvolume NAS driver provided by alicloud to mount; nfsversion: mount the version used by nfs, which supports 3, 4.0. The default is 4.0; Configured here when the drivertype is flexvolume; When it is nfs, it is configured through mountOptions; options: optional configuration for mounting nfs; Configured here when the drivertype is flexvolume; When it is nfs, it is configured through mountOptions;
StorageClass example:
## Use the NFS driver provided by kubernetes, and configure mountOptions. The reclaimPolicy is Delete; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-nfs mountOptions: - vers=4.0 - noresvport provisioner: alicloud/nas reclaimPolicy: Delete ## Use the Flexvolume NAS driver provided by alicloud to configure the nfs version and options; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-flex provisioner: alicloud/nas reclaimPolicy: Delete parameters: drivertype: flexvolume nfsversion: "3" options: "noresvport"
3. Create application Deployment:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: replace-user-id annotations: pv-name-created: replace-user-id spec: storageClassName: alicloud-nas accessModes: - ReadWriteMany resources: requests: storage: 5Gi --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: "deploy-nas" spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: deploy-nas spec: containers: - name: "nginx" image: "nginx" volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: replace-user-id //Implementation: # userID="hello-123" # cat deploy.yaml | sed "s/replace-user-id/\"$userID\"/g" | kubectl create -f - # kubectl get pod | grep deploy-nas deploy-nas-85696b6bfc-t5dmh 1/1 Running 0 28m # kubectl get pvc | grep hell hello-123 Bound hello-123 5Gi RWX alicloud-nas-flex 28m # kubectl get pv | grep hell hello-123 5Gi RWX Delete Bound default/hello-123 alicloud-nas-flex 28m # To view the generated directory in the Nas Directory: # ls -l | grep hello drwxrwxrwx 2 root root 4096 2 Month 1909:58 hello-123
4. Create application statefullset:
Using volumetamplateclaim does not support using pv name created to configure pv name;
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: web spec: replicas: 2 serviceName: "nginx" template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine volumeMounts: - mountPath: "/data" name: pvc-sts volumeClaimTemplates: - metadata: name: pvc-sts spec: accessModes: - ReadWriteOnce storageClassName: alicloud-nas-flex resources: requests: storage: 2Gi //View after creation: # kubectl get pod | grep web web-0 1/1 Running 0 7s web-1 1/1 Running 0 4s # kubectl get pvc | grep web pvc-sts-web-0 Bound pvc-65ab251a-33ec-11e9-a151-00163e066784 2Gi RWO alicloud-nas-flex 13m pvc-sts-web-1 Bound pvc-8437c50e-33ed-11e9-a151-00163e066784 2Gi RWO alicloud-nas-flex 5m # kubectl get pv | grep web pvc-65ab251a-33ec-11e9-a151-00163e066784 2Gi RWO Delete Bound default/pvc-sts-web-0 alicloud-nas-flex 13m pvc-8437c50e-33ed-11e9-a151-00163e066784 2Gi RWO Delete Bound default/pvc-sts-web-1 alicloud-nas-flex 5m # To view the generated directory in the Nas Directory: # ls -l | grep sts drwxrwxrwx 2 root root 4096 2 Month 1910:16 default-pvc-sts-web-0-pvc-65ab251a-33ec-11e9-a151-00163e066784 drwxrwxrwx 2 root root 4096 2 Month 1910:24 default-pvc-sts-web-1-pvc-8437c50e-33ed-11e9-a151-00163e066784
5. Create app Pod:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: replace-user-id annotations: pv-name-created: replace-user-id spec: storageClassName: alicloud-nas-flex accessModes: - ReadWriteMany resources: requests: storage: 5Gi --- apiVersion: v1 kind: Pod metadata: name: "nas-pod" spec: containers: - name: "nginx" image: "nginx" volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: replace-user-id
# userID="pod-123" # cat pod.yaml | sed "s/replace-user-id/\"$userID\"/g" | kubectl create -f - # kubectl get pod | grep pod nas-pod 1/1 Running 0 32s # kubectl get pvc | grep pod pod-123 Bound pod-123 5Gi RWX alicloud-nas-flex 44s # kubectl get pv | grep pod pod-123 5Gi RWX Delete Bound default/pod-123 alicloud-nas-flex 48s # ls -l | grep pod drwxrwxrwx 2 root root 4096 2 Month 1910:54 pod-123