NAS存储卷适用于大数据分析、共享数据、Web应用以及保存日志等场景。除使用静态存储卷外,您也可以创建PVC并配置StorageClass来实现存储资源的动态分配,让系统为您自动预留持久化存储卷,无需预先手动创建和配置存储资源。您可以通过subpath方式、sharepath方式以及filesystem方式挂载NAS动态存储卷。
前提条件
集群默认已安装CSI组件。如需升级,请参见升级csi-plugin和csi-provisioner。
说明如果您集群中使用Flexvolume组件,由于Flexvolume已废弃,请参见迁移Flexvolume至CSI完成迁移后再进行挂载。您可以在 ,在存储页签下确认存储组件类型。
已开通文件存储NAS服务。
首次登录文件存储NAS产品详情页时,按照页面引导开通服务。
使用限制
不支持挂载SMB协议的NAS文件系统。
NAS文件系统只能挂载到相同VPC的Pod上,不支持跨VPC挂载。
说明同一VPC下,NAS可以跨可用区挂载。
通用型NAS与极速型NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
注意事项
NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上,可能出现多个Pod同时写入数据的问题,需应用自行确保数据一致性。
关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
若您在应用模板中配置了
securityContext.fsgroup
参数,kubelet在存储卷挂载完成后会执行chmod
或chown
操作,导致挂载时间延长。若已配置securityContext.fsgroup
参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。挂载NAS存储卷后,请勿删除NAS挂载点,否则会造成系统无响应。
挂载说明
StorageClass中的volumeAs
参数可以定义PV和NAS文件系统(及其子目录)的对应关系,请根据您的业务场景选择合适的挂载方式。
挂载方式 | 说明 | 使用场景 |
创建子目录类型的PV,一个PV对应一个NAS文件系统的子目录。 |
| |
创建PV时不会创建实际的目录,每个PV实际上会对应同一个NAS目录。 | 多个跨Namespace的Pod挂载同一个NAS子目录。 | |
使用filesystem方式挂载(不推荐) | 自动创建NAS文件系统,一个PV对应一个NAS文件系统。 | 单独使用一个NAS文件系统。需要动态创建和删除NAS文件系统和挂载点。 |
使用subpath方式挂载
使用subpath方式挂载时,请确保CSI组件的版本为1.31.4及以上。如需升级,请参见升级csi-plugin和csi-provisioner。
步骤一:获取NAS文件系统和挂载点信息
步骤二:创建存储类(StorageClass)
kubectl
修改以下YAML内容,并保存为alicloud-nas-subpath.yaml。
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" archiveOnDelete: "true" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain allowVolumeExpansion: true
参数
描述
mountOptions
NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。
parameters
volumeAs
挂载方式。本示例设置为
subpath
,表示创建子目录类型的PV。一个PV对应一个NAS文件系统的子目录。server
要挂载的NAS文件系统的挂载点地址及子目录。格式为
<NAS挂载点地址>:<挂载目录>
。如未设置子目录,则默认挂载根目录/
。archiveOnDelete
表示在
reclaimPolicy
为Delete
时,是否删除后端存储文件数据。由于NAS为共享存储,添加此选项进行双重确认。true
(默认):不会真正删除目录或文件,而是将其重命名,格式为archived-{pvName}.{timestamp}
。false
:会真正删除后端对应的存储资源。
说明业务流量非常大时,不建议配置为false。更多信息,请参见使用NAS动态存储卷时Controller的任务队列已满且无法创建新的PV。
如需完全删除后端存储的文件数据,仅支持通过kubectl方式设置
parameters.archiveOnDelete
为false
进行删除。
provisioner
驱动类型。固定为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。reclaimPolicy
PV的回收策略,默认为
Delete
,支持Retain
。Delete
:需配合archiveOnDelete
一起使用。当
archiveOnDelete
为true
时,删除PVC时,NAS中的文件只会被重命名,不会被删除。当
archiveOnDelete
为false
时,删除PVC时,NAS中的文件会被真正删除。重要此处真正删除的是NAS的subpath目录以及其中的文件,NAS文件系统本身不会被删除,如需继续删除NAS文件系统,请参见删除文件系统。
Retain
:删除PVC的时候,PV和NAS中文件不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用
Retain
方式以免误删数据。allowVolumeExpansion
仅通用型NAS文件系统支持设置此参数。开启时,该StorageClass动态创建的PV将会被配置NAS目录配额以限制可使用的容量,并支持通过更新PVC进行卷容量扩容。更多信息,请参见为NAS动态存储卷设置目录配额。
说明NAS配额的生效是异步的,即动态创建出PV后,目录配额不能保证立即生效,且快速连续写入大量数据可能会超出设置的容量上限。关于NAS目录配额的更多信息,请参见目录配额。
创建StorageClass。
kubectl create -f alicloud-nas-subpath.yaml
控制台
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击创建。
在创建对话框中,StorageClass的相关配置完成后,单击创建。
主要配置项如下所示。
配置项
说明
示例值
名称
StorageClass的名称。格式要求请参考界面提示。
alicloud-nas-subpath
存储卷类型
选择NAS。
NAS
选择挂载点
NAS文件系统的挂载点地址。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com
存储卷模式
存储卷访问模式。本示例选择子目录,即使用subpath方式挂载,会在挂载路径下自动创建子目录。数据将存储于
<NAS挂载点>:<挂载路径>/<pv-name>/
下。说明子目录模式仅在CSI组件为1.31.4及以上版本时生效,否则均为共享目录模式。
子目录
挂载路径
要挂载的NAS子目录。
如果未设置,则默认挂载到根目录。
如果NAS中没有该目录,会自动创建后再进行挂载。
说明通用型NAS的根目录为
/
,极速型NAS的根目录为/share
。挂载极速型NAS的子目录时,path
必须以/share
开头,如/share/data
。/k8s
回收策略
PV的回收策略。推荐使用Retain模式,以免误删数据。
Delete:需配合
archiveOnDelete
一起使用。由于控制台界面暂不支持配置archiveOnDelete
,仅在此处选择Delete不会生效,即删除PVC时不会真正删除PV和NAS文件。如需配置archiveOnDelete
请通过YAML创建PV,具体YAML示例,请参考kubectl操作。Retain:删除PVC时,PV和NAS文件不会被删除,需要您手动删除。
Retain
挂载选项
NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。
保持默认
创建成功后,可在存储类列表查看创建的StorageClass。
步骤三:创建存储声明(PVC)
kubectl
修改YAML内容,并保存为nas-pvc.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-subpath resources: requests: storage: 20Gi
参数
说明
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。storageClassName
要绑定的StorageClass的名称。
storage
声明所需使用的存储卷的容量。
创建PVC。
kubectl create -f nas-pvc.yaml
查看PV。
kubectl get pvc
预期返回如下,可以看到CSI已基于StorageClass自动创建了PV,并绑定到PVC。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-a7540d97-0f53-4e05-b7d9-557309****** 20Gi RWX Retain Bound default/nas-csi-pvc alicloud-nas-subpath <unset> 5m
控制台
在集群管理页左侧导航栏,选择 。
在存储声明页面,单击创建。
在弹出的创建存储声明页面中,配置完成后,单击创建。
配置项
说明
示例值
存储声明类型
选择NAS。
NAS
名称
创建的存储声明名称在命名空间内必须唯一。
pvc-nas
分配模式
本示例选择使用存储类动态创建。
使用存储类动态创建
已有存储类
单击选择存储类,在弹出的对话中选择上一步创建的存储类。
alicloud-nas-subpath
总量
创建存储卷的容量,此处设置的大小不会限制应用可使用的最大容量。
20Gi
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
步骤四:创建应用并挂载NAS
kubectl
创建2个Deployment并挂载同一PVC,使其共享同一个NAS文件系统的同一个子目录。
如果要为多个Pod挂载同一NAS文件系统的不同子目录,请按照子目录创建不同的StorageClass和对应的PVC,再分别挂载PVC。
修改以下YAML内容,分别保存为nginx-1.yaml和nginx-2.yaml。
YAML示例如下,除
metadata.name
外,nginx-1.yaml和nginx-2.yaml的其他配置均一致,2个应用绑定同一PVC。nginx-1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test-1 labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" # NAS在容器中的挂载路径 volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc # 用于绑定PVC
nginx-2.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test-2 labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" # NAS在容器中的挂载路径 volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc # 用于绑定PVC
创建2个Deployment。
kubectl create -f nginx-1.yaml -f nginx-2.yaml
查看Pod信息。
kubectl get pod -l app=nginx
预期返回如下,已为不同的应用挂载同一个NAS文件系统的同一个子目录。
NAME READY STATUS RESTARTS AGE nas-test-1-b75d5b6bc-vqwq9 1/1 Running 0 51s nas-test-2-b75d5b6bc-8k9vx 1/1 Running 0 44s
控制台
重复以下操作,分别创建2个Deployment并挂载同一PVC,使其共享同一个NAS文件系统的同一个子目录。
在集群管理页左侧导航栏,选择
。在无状态页面,单击使用镜像创建。
配置创建应用的参数信息。
主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。
配置项
参数
说明
示例
应用基本信息
应用名称
Deployment名称,自定义输入。格式要求请参考界面提示。
deployment-nas-1
副本数量
Deployment的副本数量。
1
容器配置
镜像名称
用于部署应用的镜像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需资源
所需的vCPU和内存资源。
0.25 vCPU,512 MiB
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入NAS文件系统要挂载到的容器路径。
挂载源:pvc-nas
容器路径:/data
查看应用部署状态。
在无状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
使用sharepath方式挂载
步骤一:获取NAS文件系统和挂载点信息
步骤二:创建存储类(StorageClass)
kubectl
保存以下内容至alicloud-nas-sharepath.yaml文件,并根据需求修改相关参数。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-sharepath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: sharepath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/sharepath" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
参数
描述
mountOptions
NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。
parameters
volumeAs
挂载方式。本示例设置为
sharepath
,表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,即每个PV实际上会对应同一个NAS目录。server
要挂载的NAS文件系统的挂载点地址及子目录。格式为
<NAS挂载点地址>:<挂载目录>
。如未设置子目录,则默认挂载根目录/
。provisioner
驱动类型。固定为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。reclaimPolicy
PV的回收策略。使用sharepath方式挂载时必须要设置为
Retain
。创建StorageClass。
kubectl create -f alicloud-nas-sharepath.yaml
控制台
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击创建。
在创建对话框中,StorageClass的相关配置完成后,单击创建。
主要配置项如下所示。
配置项
说明
示例值
名称
StorageClass的名称。格式要求请参考界面提示。
alicloud-nas-sharepath
存储卷类型
选择NAS。
NAS
选择挂载点
NAS文件系统的挂载点地址。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com
存储卷模式
存储卷访问模式。本示例选择共享目录,即使用sharepath方式挂载,表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,这意味着每个PV实际上会对应同一个NAS目录,便于跨Namespace共享目录使用场景。
共享目录
挂载路径
要挂载的NAS子目录。
如果未设置,则默认挂载到根目录。
如果NAS中没有该目录,会自动创建后再进行挂载。
说明通用型NAS的根目录为
/
,极速型NAS的根目录为/share
。挂载极速型NAS的子目录时,path
必须以/share
开头,如/share/data
。/sharepath
回收策略
使用sharepath方式挂载时必须要设置为
Retain
。Retain
挂载选项
NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。
保持默认
创建成功后,可在存储类列表查看创建的StorageClass。
步骤三:创建存储声明(PVC)
以下示例将在2个不同Namespace下创建PVC,
kubectl
为实现跨Namespace下Pod的挂载NAS,您需要先创建2个不同的Namespace。
创建命名空间ns1和ns2。
kubectl create ns ns1 kubectl create ns ns2
修改以下YAML内容,并保存为pvc.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns1 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns2 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi
参数
说明
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。storageClassName
要绑定的StorageClass的名称。
storage
声明所需使用的存储卷的容量。
创建PVC。
kubectl create -f pvc.yaml
查看PV。
kubectl get pv
预期返回如下,可以看到CSI已基于StorageClass自动创建了2个PV,并绑定到不同命名空间下的2个PVC。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE nas-0b448885-6226-4d22-8a5b-d0768c****** 20Gi RWX Retain Bound ns1/nas-csi-pvc alicloud-nas-sharepath <unset> 74s nas-bcd21c93-8219-4a11-986b-fd934a****** 20Gi RWX Retain Bound ns2/nas-csi-pvc alicloud-nas-sharepath <unset> 74s
控制台
创建命名空间ns1和ns2,请参见创建命名空间。
在集群管理页左侧导航栏,选择 。
在命名空间ns下,创建一个存储声明。
在存储声明页面,选择命名空间为ns1,单击创建。
在弹出的创建存储声明页面中,配置完成后,单击创建。
配置项
说明
示例值
存储声明类型
选择NAS。
NAS
名称
创建的存储声明名称在命名空间内必须唯一。
pvc-nas
分配模式
本文中选择使用存储类动态创建。
使用存储类动态创建
已有存储类
单击选择存储类,在弹出的对话框中选择已创建的存储类。
alicloud-nas-sharepath
总量
创建的存储卷的容量。
20Gi
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
参考上一步,在命名空间ns2下,再创建一个存储声明。
返回存储声明页面,在命名空间ns1和ns2下,确认2个PVC均已绑定自动创建的PV。
步骤四:创建应用并挂载NAS
在2个不同Namespace下分别创建应用,并挂载相应Namespace下的PVC,它们将共享StorageClass中定义的NAS目录。
kubectl
修改以下YAML内容,分别保存为nginx-ns1.yaml和nginx-ns2.yaml。
YAML示例如下,除
metadata.namespace
外,nginx-ns1.yaml和nginx-ns2.yaml的其他配置均一致,2个应用分别绑定相应Namespace下的PVC。nginx-ns1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test namespace: ns1 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
nginx-ns2.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nas-test namespace: ns2 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
创建2个Deployment。
kubectl create -f nginx-ns1.yaml -f nginx-ns2.yaml
查看Pod信息。
kubectl get pod -A -l app=nginx
预期返回如下,已为不同Namespace下的Pod挂载同一个NAS文件系统的子目录。
NAMESPACE NAME READY STATUS RESTARTS AGE ns1 nas-test-b75d5b6bc-ljvfd 1/1 Running 0 2m19s ns2 nas-test-b75d5b6bc-666hn 1/1 Running 0 2m11s
控制台
在集群管理页左侧导航栏,选择
。在命名空间ns1下,创建一个Deployment,并挂载相应的PVC。
选择命名空间为ns1,单击使用镜像创建。
配置创建应用的参数信息。
主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。
配置项
参数
说明
示例
应用基本信息
应用名称
Deployment名称,自定义输入。格式要求请参考界面提示。
nginx
副本数量
Deployment的副本数量。
2
容器配置
镜像名称
用于部署应用的镜像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需资源
所需的vCPU和内存资源。
0.25 vCPU,512 MiB
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入NAS文件系统要挂载到的容器路径。
挂载源:pvc-nas
容器路径:/data
参考上一步,在命名空间ns2下,再创建一个Deployment,并挂载相应的PVC。
返回无状态页面,在命名空间ns1和ns2下,分别查看2个Deployment的部署情况,确认Pod已正常Running,且挂载了对应的PVC。
使用filesystem方式挂载
当应用需要动态创建和删除NAS文件系统和挂载点时,您可以使用filesystem方式挂载NAS,使用filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点。
filesystem类型的NAS动态卷在删除时默认保留文件系统和挂载点,如需在释放PV资源的同时释放NAS文件系统和挂载点,则需要同时设置StorageClass中的reclaimPolicy
为Delete
且deleteVolume
的值为true
。
步骤一:RAM Policy设置和授予(仅ACK专有集群需执行)
步骤二:创建存储类(StorageClass)
步骤三:创建存储声明(PVC)
步骤四:创建应用并挂载NAS
验证NAS的共享存储和持久化存储
按照上文示例创建的多个Pod挂载了同一NAS文件系统。您可以通过以下方式进行验证:
在一个Pod中创建文件,然后另一个Pod中查看文件,以此来验证共享存储。
重建Deployment,然后在新创建的Pod中查看文件系统中的数据是否存在,以此来验证持久化存储。
查看Pod信息。
kubectl get pod | grep nas-test
返回示例如下:
nas-test-*****a 1/1 Running 0 40s nas-test-*****b 1/1 Running 0 40s
验证共享存储。
在一个Pod中创建文件。
以名为
nas-test-*****a
的Pod作为示例:kubectl exec nas-test-*****a -- touch /data/test.txt
在另一个Pod中查看文件。
以名为
nas-test-*****b
的Pod作为示例:kubectl exec nas-test-*****b -- ls /data
预期返回如下,可以看到已共享新建的文件
test.txt
。test.txt
验证持久化存储。
重建Deployment。
kubectl rollout restart deploy nas-test
查看Pod,等待新Pod创建成功。
kubectl get pod | grep nas-test
返回示例如下:
nas-test-*****c 1/1 Running 0 67s nas-test-*****d 1/1 Running 0 49s
在新Pod中查看文件系统中的数据是否存在。
以名为
nas-test-*****c
的Pod作为示例:kubectl exec nas-test-*****c -- ls /data
预期返回如下,可以看到NAS文件系统中的数据依然存在,在新Pod的挂载目录下可以重新获取。
test.txt
常见问题
在挂载和使用NAS存储卷的过程中,如果遇到问题,可参考以下文档进行排查。
相关文档
通过CNFS可以实现对NAS文件系统的独立管理,提升NAS文件系统的性能和QoS控制。具体操作,请参见通过CNFS管理NAS文件系统(推荐)。
通过subpath方式挂载的通用型NAS支持目录配额功能,可以为子目录PV设置容量限制,提高资源利用率。具体操作,请参见为NAS动态存储卷设置目录配额。