通过容器网络文件系统CNFS,可将NAS文件系统作为原生Kubernetes资源进行管理,以声明式方式完成NAS的创建、纳管和使用。这为网站、数据分析等工作负载提供了简单、高效的持久化存储卷,并能灵活支持数据共享与隔离等多种业务场景。
准备工作
创建NAS文件系统
选择NAS文件系统的创建与接入方式
开始操作前,选择如何为集群提供NAS文件系统。
方式 | 说明 | 卷提供方式 | 适用场景 |
CNFS自动创建并管理一个配置固定的NAS文件系统,实现快速挂载。 | 动态卷 |
| |
CNFS根据参数配置,创建一个全新的、可自定义的NAS文件系统。 |
| 对性能、加密、成本等有特定要求,或需要精细化管理存储。 | |
将已存在的NAS文件系统接入CNFS进行统一管理。 |
| 将已有NAS平滑接入集群。 |
方式一:自动创建并使用NAS文件系统
通过CNFS自动创建一个默认配置的NAS文件系统。CNFS会根据集群环境完成创建,默认不加密。若当前地域不支持容量型NAS,则自动使用性能型NAS。
创建CNFS资源和StorageClass后,工作负载通过PVC请求存储,即可在NAS上动态创建PV并挂载至Pod。
kubectl
1. 创建CNFS 创建一个 |
|
2. 创建StorageClass 创建 | |
3. 创建PVC 应用通过PVC申请存储卷,并引用StorageClass作为配置模板。 | |
4. 创建应用并挂载PVC PVC创建后,部署示例应用(如Deployment或StatefulSet),将PVC绑定的 PV 挂载到应用中。 |
|
5. 结果验证 |
|
控制台
1. 创建CNFS |
|
2. 创建StorageClass |
|
3. 创建PVC |
|
4. 创建应用并挂载NAS | 创建Deployment或创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。 以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。
|
方式二:自定义参数创建并使用NAS文件系统
通过CNFS创建一个具有自定义参数的NAS文件系统。
定义一个
ContainerNetworkFileSystem资源,实例化一个新的NAS文件系统。通过创建静态PV或动态StorageClass,将该文件系统暴露给集群内的应用进行挂载。
kubectl
1. 创建自定义的NAS文件系统 创建一个 |
|
2. 创建PV或StorageClass 创建CNFS后,选择应用如何接入并使用NAS。
| 静态数据卷PV参数详见使用NAS静态存储卷。 动态数据卷StorageClass参数详见使用NAS动态存储卷。 |
3. 创建PVC 根据此前创建的静态PV和动态StorageClass,创建引用NAS文件系统的PVC。 | 静态数据卷动态数据卷 |
4. 创建应用并挂载NAS PVC创建后,将其绑定的 PV 挂载到应用中。 | |
5. 结果验证 |
|
控制台
|
|
| PV
StorageClass
|
|
|
| 创建Deployment或创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。 以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。
|
方式三:纳管并使用已有的NAS文件系统
通过CNFS纳管一个已存在的NAS文件系统,并将其接入集群供应用进行挂载和使用。
kubectl
1. 使用已有NAS创建CNFS 创建一个 |
|
2. 创建PV或StorageClass 创建CNFS后,选择应用如何接入并使用NAS。
| 静态数据卷PV参数详见使用NAS静态存储卷。 动态数据卷StorageClass参数详见使用NAS动态存储卷。 |
3. 创建PVC 根据此前创建的静态PV和动态StorageClass,创建引用NAS文件系统的PVC。 | 静态数据卷动态数据卷 |
4. 创建应用并挂载NAS PVC创建后,将其绑定的 PV 挂载到应用中。 | |
5. 结果验证 |
|
控制台
|
|
| PV
StorageClass
|
|
|
| 创建Deployment或创建StatefulSet时,在容器配置页面的数据卷区域,可以配置PVC挂载到容器。 以下示例表示将通过CNFS创建的NAS文件系统挂载到容器中的/data路径下。
|
应用场景配置:共享与隔离
完成NAS文件系统的创建或纳管后,可根据业务需求,通过不同的配置方式实现数据的共享或隔离。
配置NAS共享存储卷(多个Pod共享同一数据目录)
为解决Pod间的数据共享问题,可将NAS文件系统中的同一个目录作为共享存储,挂载给多个Pod使用。
核心机制:通过静态存储卷方式实现。在PV中,声明的
path与CSI最终挂载的路径完全一致。因此,当多个Pod通过同一个PVC挂载该静态PV时,均可访问同一个存储目录,从而实现数据共享。关键配置:在工作负载的Pod模板(
.spec.template)中,将volumes字段下的persistentVolumeClaim.claimName参数统一设置为同一个PVC名称。
1. 创建指向特定目录的PV和PVC | |
2. 创建示例Deployment | |
3. 结果验证 |
配置NAS隔离存储卷(每个Pod拥有独立数据目录)
为满足多租户等场景的数据隔离需求,可为每个Pod或每组Pod提供独立的、相互隔离的存储目录。
核心机制:通过动态存储卷方式实现。在StorageClass中,CSI会在声明的
path路径下,自动创建一个与PV同名的独立子目录作为挂载点。因此,每个PVC都会绑定到一个独立的存储目录,从而实现数据隔离。关键配置:
在StatefulSet关联的StorageClass中,通过
parameters的volumeAs: subpath(默认值)为每个PVC创建独立的子目录。在StatefulSet中定义
volumeClaimTemplates,为每个Pod自动创建并绑定一个独立的PVC。
1. 创建支持动态子目录的StorageClass | |
2. 创建示例StatefulSet | |
3. 结果验证 |
生产环境使用建议
数据安全
数据加密:创建新NAS文件系统时,建议在CNFS的
parameters中设置encryptType: SSE-KMS,以启用NAS服务端的静态数据加密,提升数据安全性。数据保护与回收策略:CNFS的
reclaimPolicy固定为Retain,删除Kubernetes中的CNFS对象不会删除后端的NAS实例。但PV的回收策略由其StorageClass定义,生产环境建议设置为Retain,避免误删。回收站功能:创建NAS时,建议通过
enableTrashCan: "true"参数开启回收站功能,避免误删。并发写入:当多个Pod挂载同一个共享存储卷时,应在应用层面避免多个实例同时写入同一个文件,以免因并发写入导致文件损坏。
运维管理
性能隔离:隔离存储卷仅实现数据层面隔离,所有隔离卷共享后端同一个NAS实例的IOPS和吞吐量。对于IO性能要求严苛且需要稳定延迟的核心应用,建议为其规划独立的专用NAS文件系统。
容量管理:在StorageClass中设置
allowVolumeExpansion: true,以便对存储卷的目录配额进行扩容。PVC中
requests.storage取值主要用于调度决策,并非整个NAS文件系统的配额上限。监控与告警:利用容器存储监控对NAS的容量使用率、IOPS、吞吐量等关键指标配置告警,及时发现容量或性能瓶颈。
成本优化
参考信息
验证共享存储、数据隔离、持久化存储
NAS挂载完成后,可进一步验证存储行为是否符合预期。
验证Deployment的共享存储和持久化存储
验证StatefulSet的数据隔离和持久化存储
CNFS YAML说明
执行kubectl get cnfs/<cnfsName> -o yaml查看CNFS YAML时,可查看CNFS对象的全部配置和实时状态。
此处以方式二中执行kubectl get cnfs/cnfs-nas-filesystem -o yaml查看cnfs-nas-filesystem YAML为例。
YAML示例
参数说明
资源释放指引
为避免产生预期外费用并确保数据安全,请遵循以下流程释放无需使用的资源。
删除工作负载
操作:删除所有使用相关PVC的应用,如Deployment、StatefulSet等,停止Pod并卸载存储卷。
命令示例:
kubectl delete deployment <your-deployment-name>
删除PVC
操作:删除应用关联的PVC,PV删除结果取决于回收策略(
reclaimPolicy)。Retain(推荐):删除PVC后,后端NAS上的数据和目录会完整保留。Delete:删除PVC后,其绑定的PV也会被删除。后端NAS上的数据和目录将根据StorageClass中archiveOnDelete参数的设置进行处理。"true"(默认):不会真正删除目录或文件,而是将其重命名,格式为archived-{pvName}.{timestamp}。"false":数据被永久删除,此操作不可逆,请谨慎使用。
命令示例:
kubectl delete pvc <your-pvc-name>
删除PV
操作:删除PV。主要针对静态PV,或在上一步中使用
Retain策略后处于Released状态的PV。此操作仅移除Kubernetes中的资源定义,不删除后端NAS数据。
命令示例:
kubectl delete pv <your-pv-name>
删除Kubernetes存储定义(可选)
操作:删除不再需要的StorageClass和CNFS对象。
此操作仅移除Kubernetes中的资源定义,不删除后端NAS数据。
命令示例:
kubectl delete sc <your-storageclass-name>、kubectl delete cnfs <your-cnfs-name>
删除后端NAS文件系统
操作:请参见删除文件系统。此操作将永久删除该NAS上的所有数据,且无法恢复,请谨慎操作。执行前,请务必确认该NAS已无任何业务依赖。
