通过NFS使用NAS动态存储卷
一、通过kubectl命令行方式使用subpath类型的NAS动态存储卷
- 参考文档:https://help.aliyun.com/document_detail/477383.html#section-0ee-mcw-3q2
当您的多个Kubernetes应用或者Pod需要挂载相同的NAS存储卷共享数据时,或不同的Pod挂载相同NAS文件系统的不同子目录时, 可以使用subpath类型的NAS动态存储卷方式。
NAS动态存储卷的挂载方式为subpath类型时,您需要手动创建NAS文件系统和挂载点。
-
创建NAS文件系统和挂载点。
-
创建StorageClass。
-
创建并复制以下内容到alicloud-nas-subpath.yaml文件中。
-
挂载参数参考:https://help.aliyun.com/document_detail/90529.html
-
推荐您通过NFS v3协议挂载文件系统,以获得最佳访问性能。
-
NFS v4.0支持文件锁(包括range lock),如果您需要使用多台Linux ECS实例同时修改一个文件,请使用NFS v4.0协议挂载文件系统。
-
文件系统版本。
-
vers=3:使用NFS v3协议挂载文件系统。
-
vers=4
:使用NFS v4协议挂载文件系统。
其中,
minorversion
为协议次版本号,NAS支持的NFS v4协议版本为4.0,因此使用NFS v4协议挂载文件系统时,次版本号为0。
说明
- 容量型或性能型NAS:支持NFS v3和NFS v4.0。
- 极速型NAS:只支持NFS v3,不支持NFS v4。
-
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-subpath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
参数 描述 mountOptions 挂载NAS的options参数在mountOptions中配置,包括NFS协议版本。 volumeAs 可选subpath、filesystem,分别表示创建子目录类型的PV和文件系统类型PV。 server 表示创建子目录类型的PV时,NAS文件系统的挂载点地址。 provisioner 驱动类型。本例中取值为 nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。reclaimPolicy PV的回收策略,默认为Delete,支持Retain。Delete模式:需配合archiveOnDelete一起使用。当archiveOnDelete为true,删除PVC时,PV和NAS文件只是被重命名,不会被删除。当archiveOnDelete为false,删除PVC时,PV和NAS文件会被真正删除。Retain模式:删除PVC的时候,PV和NAS文件系统不会被删除,需要您手动删除。如果数据安全性要求高,推荐使用Retain方式以免误删数据。 archiveOnDelete 表示在reclaimPolicy为Delete时,是否删除后端存储。因为NAS为共享存储,添加此选项进行双重确认。在参数parameters下配置。默认为true,表示不会真正删除目录或文件,而是将其Rename,格式为: archived-{pvName}.{timestamp}
;如果是配置为false,表示会真正删除后端对应的存储资源。说明 在业务流量非常大时,不适合配置为false。更多信息,请参见使用NAS动态存储卷时Controller的任务队列已满且无法创建新的PV。 -
-
执行以下命令创建StorageClass。
kubectl create -f alicloud-nas-subpath.yaml
-
-
执行以下命令创建PVC。
-
创建并复制以下内容到pvc.yaml文件中。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-subpath resources: requests: storage: 20Gi
参数 说明 name PVC的名称。 accessModes 配置访问模式。 storageClassName StorageClass的名称,用于绑定StorageClass。 storage 声明应用存储使用量。 -
执行以下命令创建PVC。
kubectl create -f pvc.yaml
-
-
执行以下命令创建应用。
创建应用nginx-1和nginx-2共享NAS存储卷的同一个子目录。
-
创建并复制以下内容到nginx-1.yaml文件中。
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nas-1 labels: app: nginx-1 spec: selector: matchLabels: app: nginx-1 template: metadata: labels: app: nginx-1 spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
mountPath
:NAS在容器中挂载的位置。claimName
:PVC的名称,用于绑定PVC。本例中为nas-csi-pvc。
-
创建并复制以下内容到nginx-2.yaml文件中。
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nas-2 labels: app: nginx-2 spec: selector: matchLabels: app: nginx-2 template: metadata: labels: app: nginx-2 spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
mountPath
:NAS在容器中挂载的位置。本例为/data。claimName
:输入与nginx-1应用相同的PVC名称,本例为nas-csi-pvc。
-
执行以下命令创建应用nginx-1和nginx-2。
kubectl create -f nginx-1.yaml -f nginx-2.yaml
-
-
执行以下命令查看Pod信息。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE deployment-nas-1-5b5cdb85f6-n**** 1/1 Running 0 32s deployment-nas-2-c5bb4746c-4**** 1/1 Running 0 32s 123
说明 NAS存储卷的
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/share/nas-79438493-f3e0-11e9-bbe5-00163e09****
会同时挂载到deployment-nas-1-5b5cdb85f6-n****
和deployment-nas-2-c5bb4746c-4****
的/data目录下。其中:/share
:StorageClass中指定的subpath。nas-79438493-f3e0-11e9-bbe5-00163e09****
:PV的名称。
如果您需要为不同的Pod挂载同一个NAS文件系统的不同子目录, 则需要分别创建pvc-1和nginx-1以及pvc-2和nginx-2。
二、通过kubectl命令行方式使用NAS静态存储卷
- 文档:https://help.aliyun.com/document_detail/204013.html#section-jgf-w0l-0hh
-
执行以下命令创建静态PV。
kubectl create -f pv-nas.yaml
以下为创建静态卷PV的YAML示例文件。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountOptions: - nolock,tcp,noresvport - vers=3 1234567891011121314151617181920
参数 说明 name PV的名称。 labels 设置PV的标签。 storage NAS的可使用量。 accessModes 配置访问模式。 driver 驱动类型。本例中取值为 nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。volumeHandle 配置PV的唯一标识符。若需要同时使用多个PV,则各个PV中该值必须不一致。 server NAS挂载点。 path 挂载子目录,极速NAS需要以/share为父目录。 vers 挂载NAS数据卷的NFS协议版本号,推荐使用v3,极速类型NAS只支持v3。 -
执行以下命令创建静态PVC。
创建NAS存储声明PVC,使用selector筛选PV,精确配置PVC和PV的绑定关系。
kubectl create -f pvc-nas.yaml
以下为创建静态卷PVC的YAML示例文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas
参数 说明 name PVC的名称。 accessModes 配置访问模式。 storage 声明应用使用量,不能大于存储卷的总量。 matchLabels 输入PV的标签,用于关联PV。 -
执行以下命令创建名为nas-static的应用,并挂载PVC。
kubectl create -f nas.yaml
以下为创建nas-static应用的nas.yaml示例文件。
apiVersion: apps/v1 kind: Deployment metadata: name: nas-static labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas
参数 说明 mountPath NAS在容器中挂载的位置。 claimName PVC的名称,用于绑定PVC。 -
执行以下命令,查看Pod信息。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
三、验证NAS的持久化存储
-
查看部署应用和NAS文件。
-
执行以下命令,查看部署的应用名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
-
执行以下命令,查看任意一个应用的/data路径下的文件,本文以名为
nas-static-5b5cdb85f6-n****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-n**** ls /data
无返回结果,说明/data路径下无文件。
-
-
执行以下命令,在名为
nas-static-5b5cdb85f6-n****
Pod的/data路径下创建文件nas。kubectl exec nas-static-5b5cdb85f6-n**** touch /data/nas
-
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
Pod的/data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** ls /data
预期输出:
nas
-
执行以下命令,删除Pod。
kubectl delete pod nas-static-5b5cdb85f6-n****
-
同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
-
验证删除Pod后,NAS里创建的文件是否还存在。
-
执行以下命令,查看Kubernetes重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
-
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
的Pod /data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** ls /data
预期输出:
nas
nas文件仍然存在,说明NAS的数据可持久化保存。
-
四、验证NAS的共享存储
-
查看部署的应用所在的Pod和NAS文件。
-
执行以下命令,查看应用所在Pod的名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
-
执行以下命令,查看2个Pod /data路径下的文件。
kubectl exec nas-static-5b5cdb85f6-n**** ls /data kubectl exec nas-static-c5bb4746c-4**** ls /data
-
-
执行以下命令,在任意一个Pod的/data路径下创建文件nas。
kubectl exec nas-static-5b5cdb85f6-n**** touch /data/nas
-
执行以下命令,查看2个Pod /data路径下的文件。
-
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
的Pod /data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** ls /data
预期输出:
nas
-
执行以下命令,查看名为
nas-static-c5bb4746c-4****
的Pod /data路径下的文件。kubectl exec nas-static-c5bb4746c-4**** ls /data
预期输出:
nas
如果在任意一个Pod的/data下创建的文件,两个Pod下的/data路径下均存在此文件,则说明两个Pod共享一个NAS。
-