如何在Kubernetes集群动态使用 NAS 持久卷
1. 介绍:
本文介绍的动态生成NAS存储卷的方案:在一个已有文件系统上,自动生成一个目录,这个目录定义为目标存储卷;
镜像地址:registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-433631d-aliyun
默认生成资源:
生成的PV名字为:pvc-${pvc-uid}
生成目录的名字:namespace-pvcname-pvname
可以再pvc的annotations中如下声明,自定义名字:
生成的pv、目录名字为下面定义的名字。
annotations: pv-name-created: replace-user-id
2. 部署NAS Controller
创建alicloud-nas-controller,实现动态provider nas pv;
创建alicloud-nas storageclass,为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使用说明:
drivertype: 用来表示生成pv存储类型,可选nfs, flexvolume. nfs: 默认选项,表示使用k8s原生NFS驱动挂载; flexvolume: 表示使用阿里云提供的Flexvolume NAS驱动挂载; nfsversion: 挂载nfs使用的版本,支持3,4.0.默认为4.0; drivertype为flexvolume的时候在这里配置; 为nfs的时候通过mountOptions 配置; options:为挂载nfs的可选项配置; drivertype为flexvolume的时候在这里配置; 为nfs的时候通过mountOptions 配置;
StorageClass举例:
## 使用kubernetes提供的NFS驱动,并配置mountOptions,reclaimPolicy为Delete; apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-nfs mountOptions: - vers=4.0 - noresvport provisioner: alicloud/nas reclaimPolicy: Delete ## 使用阿里云提供的Flexvolume NAS驱动,配置nfs版本、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. 创建应用-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 执行: # 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 # Nas目录下查看生成目录: # ls -l | grep hello drwxrwxrwx 2 root root 4096 2月 19 09:58 hello-123
4. 创建应用-StatefulSet:
使用volumeTemplateClaim不支持使用pv-name-created配置pv名字;
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 创建后查看: # 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 # Nas目录下查看生成目录: # ls -l | grep sts drwxrwxrwx 2 root root 4096 2月 19 10:16 default-pvc-sts-web-0-pvc-65ab251a-33ec-11e9-a151-00163e066784 drwxrwxrwx 2 root root 4096 2月 19 10:24 default-pvc-sts-web-1-pvc-8437c50e-33ed-11e9-a151-00163e066784
5. 创建应用-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月 19 10:54 pod-123
本文作者:kanjunbao
本文为云栖社区原创内容,未经允许不得转载。
相关推荐
朱培知浅ZLH 2020-11-16
cdbdqn00 2020-11-12
达观数据 2020-11-11
JustinChia 2020-11-11
远远的山 2020-11-09
jingtao 2020-11-08
大叔比较胖 2020-10-30
gracecxj 2020-10-30
onepiecedn 2020-10-29
kunyus 2020-10-28
JustHaveTry 2020-10-27
锋锋 2020-10-26
hubanbei00的家园 2020-10-25
谢恩铭 2020-10-23
btqszl 2020-10-21
kaidiphp 2020-10-13
guchengxinfen 2020-10-12
liverlife 2020-10-10
BigDataMining 2020-10-08