首页 > 其他分享 >nfs-ganesha对比NFS最佳实践

nfs-ganesha对比NFS最佳实践

时间:2024-10-12 10:53:24浏览次数:3  
标签:缓存 ganesha NFS 文件系统 FSAL Ganesha nfs 线程

概述

随着业务规模的不断扩大和数据访问需求的日益增长,现有的文件共享服务面临着诸多挑战,如性能瓶颈、扩展性不足等问题。为了有效解决这些问题,我们考虑引入NFS-Ganesha作为新一代的高性能网络文件系统解决方案。

NFS-Ganesha是一款基于用户空间的高性能网络文件系统服务器,它支持多种存储后端,并且能够提供高吞吐量、低延迟的数据访问能力。通过采用NFS-Ganesha,不仅可以显著提升文件系统的性能表现,还能增强系统的可扩展性和可靠性,满足未来业务发展的需求。

本报告旨在全面评估NFS-Ganesha组件引入的可能性及其对现有系统的影响。我们将从技术架构、性能、安全性等多个维度进行深入探讨,并结合实际应用场景提出具体的实施方案和技术建议。此外,还将对比分析其他可能的技术方案,以确保最终选择的最佳实践能够最大程度地满足业务需求,同时兼顾成本效益和技术可行性。

定义与功能

基本情况

NFS-Ganesha是一个运行在用户空间的NFS文件服务器,能够处理多个版本的NFS协议(如NFSv3、NFSv4、NFSv4.1等)。NFS-Ganesha 是一个功能强大且灵活的开源文件系统,适用于各种存储需求和应用场景,从传统的文件共享到现代的容器化和云原生环境。

主要特点

  • 适配云原生环境
  • NFS访问协议适配多个存储后端
  • 模块化设计

架构设计要点

分层架构

NFS-Ganesha每个模块负责不同的任务和目标,例如缓存管理模块只负责管理内存中的数据。

模块化设计

其核心架构包括多个独立的模块,如RPCSEC_GSS模块用于数据传输,Memory Manager模块负责内存管理。

访问协议支持

提供前端访问多协议支持。支持NFSv2、NFSv3、NFSv4、NFSv4.1以及pNFS和9p.2000L协议。可以同时支持所有这些协议,提供灵活的兼容性。

解决的问题

当我们在现有的NFS应用中遇到问题时,NFS-Ganesha作为一个高性能的网络文件系统服务器,能够有效地解决许多常见的挑战。下面是从NFS应用中遇到的问题角度出发,给出了NFS-Ganesha解决问题的信息:

性能瓶颈

传统的NFS服务器可能会遇到性能瓶颈,尤其是在高并发访问场景下。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 多线程处理:NFS-Ganesha采用了多线程模型来处理客户端请求,能够更好地利用多核CPU资源,提高并发处理能力。
  • 内存缓存:通过内存缓存机制减少磁盘I/O操作,加快数据读取速度。
  • 智能调度:根据系统负载动态调整资源分配,优化整体性能。

扩展性不足

随着业务的增长,单一NFS服务器难以满足大规模数据访问的需求。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 集群部署:支持多节点集群部署,通过负载均衡和故障转移机制提高系统的可扩展性和可用性。
  • 存储后端多样化:支持多种存储后端,如POSIX文件系统、Ceph RADOS等,可以根据实际需求灵活选择。

安全性问题

传统NFS服务器可能存在安全漏洞,容易遭受攻击。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 身份验证:支持多种身份验证机制,如Kerberos、LDAP等,确保只有授权用户才能访问数据。
  • 加密传输:支持TLS/SSL加密,保护数据在传输过程中的安全。
  • 访问控制:提供细粒度的访问控制策略,确保数据的安全访问。

高可用性

单点故障可能导致服务中断,影响业务连续性。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 故障转移:支持高可用性配置,通过多个实例之间的负载均衡和故障转移机制来保证服务的连续性。
  • 热备份:可以在主服务器发生故障时自动切换到备用服务器,确保服务不中断。

管理复杂性

传统NFS服务器的管理和维护工作较为繁琐。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 配置管理:支持通过命令行或API接口进行配置管理,简化了日常运维工作。
  • 监控工具:提供了性能指标监控工具,帮助管理员快速定位问题并进行优化。

兼容性问题

不同版本的NFS客户端之间可能存在兼容性问题。
NFS-Ganesha为用户提供了如下特性,解决或者改善了上述问题:

  • 多版本支持:同时支持NFSv3和NFSv4,能够与各种版本的NFS客户端无缝对接。
  • POSIX兼容性:支持POSIX文件系统接口,便于集成到现有的Linux环境中。

通过上述解决方案,NFS-Ganesha不仅能够解决现有NFS应用中遇到的各种问题,还能够提供更高效、更安全、更易于管理的服务。这对于构建稳定可靠的大规模分布式存储系统来说是非常重要的。

应用场景

  1. NFS-Ganesha 是一个开源的高性能、可扩展的用户空间 NFS服务器实现,广泛应用于多种场景。通过和其他IT基础设施的交互,能够提供以下技术应用场景的支持:
  2. NFS-Ganesha 支持高可用性的 Active-Active 模式,这意味着当一个 NFS-Ganesha 服务器宕机时,客户端可以无缝切换到另一个服务器,无需任何管理干预。这种特性使其在需要高可靠性和容错能力的环境中非常适用。
  3. NFS-Ganesha 能够对多种文件系统和命名空间进行导出,类似于树状结构的文件系统,并且使用称为 FSAL(File System Abstraction Layer)的后端模块来实现与底层命名空间的无缝连接。这使得它可以在复杂的存储环境中灵活地管理和访问数据。
  4. NFS-Ganesha 在许多大型 HPC 环境中得到广泛应用,因为它提供了高性能和可靠的 NFS 服务。这种性能优势对于需要处理大量数据和计算任务的 HPC 应用至关重要。
  5. NFS-Ganesha 可以通过 Ceph 公共网络绑定其 NFS 服务,从而实现 CephFS 的共享。用户 VM 和 Compute实例可以通过额外的 NIC 连接到存储 NFS 网络,以访问 NFS 共享。此外,NFS-Ganesha 还增强了安全性,防止用户实例直接访问 Ceph 守护进程。
  6. NFS-Ganesha 支持通过 DBus接口动态添加和删除导出,并创建和维护一个伪文件系统,使客户端能够无缝访问所有导出对象。这种灵活性和扩展性使其适用于需要动态管理存储资源的场景。
  7. NFS-Ganesha 的 NFSv4 协议包括对 Windows 类似的 ACL 支持,这些 ACL可以识别受信任者并指定允许或拒绝他们的访问权限。这为需要细粒度访问控制的应用提供了强大的支持。
  8. NFS-Ganesha 支持 pNFS,这是 NFS v4.1协议的一部分,允许计算客户端直接并行访问存储设备。这种特性特别适合需要并行处理和存储访问的高性能应用。
  9. NFS-Ganesha 还支持 FUSE(Filesystem in Userspace),可以让我们直接把 FUSE 挂载在 NFS 上而不需要额外的配置。这增加了其灵活性和可移植性。
  10. NFS-Ganesha 在高可用性环境、多文件系统和命名空间导出、高性能计算、Ceph 存储共享、动态卷导出、伪文件系统、访问控制列表支持以及并行文件系统访问等多个领域都有广泛的应用。其高性能、可靠性和灵活性使其成为现代存储解决方案中的重要组成部分。

nfs-ganesha细节

NFS-Ganesha 是一个基于模块的用户空间文件服务器,支持 NFSv3、v4、v4.1 和 pNFS 协议,并且可以运行在大多数 UNIX/Linux 系统上。其架构设计使得它能够通过文件系统抽象层(FSAL)将后端存储机制抽象成一个统一的 API,从而提供给客户端访问。

架构组成

在这里插入图片描述

模块化设计:NFS-Ganesha 是一个基于模块的程序,每个模块负责不同的任务和目标。例如:

  • 缓存管理模块:负责管理缓存数据。
  • 内存管理模块:负责 Ganesha 的内存管理。
  • RPCSEC_GSS 模块:使用 RPCSEC_GSS进行数据传输,通常使用 krb5、SPKM3 或 LIPKEY 来管理。
  • NFS 协议模块:负责 NFS 消息结构的管理
  • Metadata(Inode) Cache: 负责元数据缓存管理
  • File Content Cache:负责数据缓存管理
  • Hash Tables:提供了基于红黑树的哈希表,这个模块在 Ganesha 里用到很多 文件系统抽象层(FSAL) :NFS-Ganesha
    提供了 FUSE 兼容的文件系统抽象层,允许文件系统的开发者插入他们的存储机制并从任何 NFS 客户端访问它。

用户空间运行:NFS-Ganesha 在用户地址空间中运行,而不是作为操作系统内核的一部分。

内存管理

内存管理是开发 Ganesha 时比较大的问题,因为大多数 Ganesha 架构中的所有模块都必须执行动态内存分配。 例如,管理 NFS 请求的线程可能需要分配用于存储所请求结果的缓冲器。 如果使用常规的 LibC malloc / free 调用,则存在内存碎片的风险,因为某些模块将分配大的缓冲区,而其他模块将使用较小的缓冲区。 这可能导致程序使用的部分内存被交换到磁盘,性能会迅速下降的情况。

因此 Ganesha 有一个自己的内存管理器,来给各个线程分配需要的内存。内存管理器使用了 Buddy Malloc algorithm,和内核使用的内存分配是一样的。内存分配器中调用了 madvise 来管束 Linux 内存管理器不要移动相关页。其会向 Linux 申请一大块内存来保持高性能表现。

线程管理

管理 CPU 相比较内存会简单一些。Ganesha 使用了大量的线程,可能在同一时间会有几十个线程在并行工作。开发团队在这里用到了很多 POSIX 调用来管理线程,让 Linux 调度进程单独处理每一个线程,使得负载可以覆盖到所有的 CPU。

开发团队也考虑了死锁情况,虽然引入互斥锁可以用来防止资源访问冲突,但是如果大量线程因此陷入死锁状态,会大大降低性能。因此开发团队采用了读写锁,但是由于读写锁可能因系统而异,因此又开发了一个库来完成读写锁的转换。

当一个线程池中同时存在太多线程时,这个线程池会成为性能瓶颈。为了解决这个问题, Ganesha 给每一个线程分配了单独的资源,这样也要求每个线程自己处理垃圾回收,并且定期重新组合它的资源。同时 ”dispatcher thread” 提供了一些机制来防止太多线程在同一时间执行垃圾回收;在缓存层中垃圾回收被分成好几个步骤,每个步骤由单独代理处理。经过生产环境实测,这种设计时得当的。

哈希表

关联寻找功能在 Ganesha 被大量使用,比如我们想通过对象的父节点和名称来寻找对象元数据等类似行为是很经常的,因此为了保证 Ganesha 整体的高性能,关联寻找功能必须非常高效。

为了达到这个目的,开发团队采用了红黑树,它会在 add/update 操作后自动冲平衡。由于单棵红黑树会引发进程调用冲突(多个进程同时 add/update,引发同时重平衡),如果加读写锁在红黑树上,又会引发性能瓶颈。因此开发团队设计了红黑树数组来解决了这个问题,降低了两个线程同时访问一个红黑树的概率,从而避免了访问冲突。

大型多线程守护程序

运行 Ganesha 需要很多线程同时工作,因此设计一个大型的线程守护程序在设计之初尤为重要,线程分为以下不同类型:

  1. dispatcher thread: 用于监听和分发传入的 NFS、MOUNT 请求。它会选择处于最空闲的 worker
    线程然后将请求添加到这个 worker 线程的待处理列表中。这个线程会保留最近 10 分钟内的请求答复,如果在 10
    分钟内收到相同指令(存在哈希表并用 RPC Xid4 值寻址),则会返回以前的请求回复。
  2. worker thread: Ganesha 中的核心线程,也是使用最多的线程。worker 线程等待 dispatcher
    的调度,收到请求后先对其进行解码,然后通过调用 inode cache API 和 file content API 来完成请求操作。
  3. statistics thread: 收集每个 module 中的线程统计信息,并定期用 CSV 格式记录数据,以便于进一步处理。
  4. admin gateway: 用于远程管理操作,包括清楚缓存,同步数据到 FSAL 存储端,关闭进程ganeshaadmin 这个程序专门用于与 admin gateway 线程交互。

缓存处理

在上文中提到,Ganesha 使用了大片内存用于建立元数据和数据缓存。我们先从元数据缓存开始讲起。metadata cache 存放在 Cache Inode Layer( MDCache Layer )层 。每个实例对应一个命名空间中的实例(文件,符号链接,目录)。这些 Cache Inode Layer 中的实例对应一个 FSAL 中的对象,把从 FSAL 中读取到的对象结构映射在内存中。

Cache Inode Layer 将元数据与对应 FSAL 对象 handle 放入哈希表中,用来关联条目。初版的 Ganesha 采用 ’write through’ 缓存策略来做元数据缓存。实例的属性会在一定的时间(可定义)后过期,过期后该实例将会在内存中删除。每个线程有一个 LRU(Least Recently Used) 列表,每个缓存实例只能存在于 1 个线程的 LRU 中,如果某个线程获得了某个实例,将会要求原线程在 LRU 列表中释放对应条目。
每个线程需要自己负责垃圾回收,当垃圾回收开始时,线程将从 LRU 列表上最旧的条目开始执行。 然后使用特定的垃圾策略来决定是否保存或清除条目。由于元数据缓存应该非常大(高达数百万条目),因此占满分配内存的 90%(高位)之前不会发生垃圾回收。 Ganesha 尽可能多得将 FSAL 对象放入缓存的‘树型拓扑’中,其中节点代表目录,叶子可代表文件和符号链接;叶子的垃圾回收要早于节点,当节点中没有叶子时才会做垃圾回收。

File Content Cache 数据缓存并不是独立于与 Inode Cache,一个对象的元数据缓存和数据缓存会一一对应(数据缓存是元数据缓存的‘子缓存’),从而避免了缓存不统一的情况。文件内容会被缓存至本地文件系统的专用目录中,一个数据缓存实例会对应 2 个文件:索引文件和数据文件。数据文件等同于被缓存的文件。索引文件中包含了元数据信息,其中包含了对重要的 FSAL handle。索引文件主要用于重建数据缓存,当服务器端崩溃后没有干净地清掉缓存时,FSAL handle 会读取索引文件中的信息来重建元数据缓存,并将其指向数据文件,用以重建数据缓存实例。

当缓存不足时,worker thread 会查看 LRU 列表中很久未被打开的实例,然后开始做元数据缓存回收。当元数据缓存回收开始时,数据缓存的垃圾回收也会同时进行:在回收文件缓存实例时,元数据缓存会问询数据缓存是否认识该文件实例,如果不认识则代表该数据缓存已经无效,则元数据回收正常进行,并完成实例缓存回收;如果认识,对应的文件缓存以及数据缓存均会被回收,随后对应的元数据缓存也会被回收。这样保证了一个数据缓存有效的实例不会被回收。

这种方式很符合 Ganesha 的架构设计:worker 线程可以同时管理元数据缓存和数据缓存,两者一直保持一致。Ganesha 在小文件的数据缓存上采用 ’write back’ 策略,如果文件很大的话则会直接读取,而不经过缓存;

FSAL(File System Abstraction Layer)

FSAL 是相当重要的模块。FSAL 本身给 Inode Cache 和 File Content Cache 提供了通用接口,收到请求后会调用具体的 FSAL(FSAL_SNMP, FSAL_RGW 等)。FSAL 中的对象对应一个 FSAL handle。由于 FSAL 的语义设计与 NFSv4 很相似,因此开发和可以自己编写新的 FSAL API 来适配 Ganesha。Ganehsa 软件包还提供了 FSAL 源代码模板。

工作原理

客户端请求:当 NFS 客户端发起一个请求时,它会通过 NFS 协议与 NFS-Ganesha 服务器进行通信。
FSAL 调用:NFS-Ganesha 使用 FSAL 将请求转发到相应的后端存储机制。例如,如果后端是 Ceph,则 NFS-Ganesha 会将请求传递给 Ceph 并获取响应。
数据处理和返回:后端存储机制处理请求并返回结果,NFS-Ganesha 将这些结果封装成 NFS 协议所需的格式并返回给客户端。
缓存机制:为了提高性能,NFS-Ganesha 可以使用写通过策略来缓存元数据。实例的属性会在一定时间后过期,过期后该实例将会在内存中删除。
如下图所示:

在这里插入图片描述

相关工具和生态

Kubernetes 集成

NFS-Ganesha 可以通过外部动态提供程序(External动态提供程序)在 Kubernetes 中使用。例如,nfs-ganesha-server-and-external-provisioner 是一个针对 Kubernetes 1.14+ 版本的动态存储提供商,可以快速而轻松地部署几乎在任何地方都能工作的共享存储解决方案。

性能优化工具

基于 eBPF 的性能分析与故障诊断工具 eNFSanalyzer 能够通过内核模块实现对 NFS 请求的快速回复,这种方法具有低开销、低侵害、高性能等优势,并支持被广泛使用的 NFS-Ganesha。此外,kNFS 提供了对 NFS-Ganesha 的内核增强功能,旨在提供更高性能和更安全的网络文件系统。

其他应用

NFS-Ganesha 还可以与其他分布式存储系统如 GlusterFS 结合使用,进行文件服务迁移和重构。此外,它也可以作为 Ceph 对象网关的接口,为应用提供 POSIX 文件系统接口到 Ceph 对象存储。

和传统nfs服务的比较

容器化和云原生支持

传统NFS服务在容器化环境中部署较为复杂,需要额外的配置和管理。
NFS-Ganesha天生支持容器化部署,可以轻松集成到Kubernetes等云原生平台中。通过使用外部动态提供器(如kubernetes-sigs/nfs-subdir-external-provisioner),可以实现自动化的存储资源管理。此外,NFS-Ganesha还可以与云服务商提供的存储服务结合使用,进一步提升云原生环境下的存储解决方案。
从云原生角度来看,NFS-Ganesha相较于传统NFS服务具有显著的优势。它在用户态运行,具有更好的可移植性和灵活性;支持高可用性和多种存储后端;性能优异且资源利用率高;天然支持容器化和云原生环境;并且具有良好的可扩展性和灵活性。因此,在云原生架构下,NFS-Ganesha是一个更优的选择。

性能优化与灵活性

传统NFS服务的性能可以通过调整参数、使用高速网络、合理规划文件系统等方式进行优化。例如,服务器端可以设置noatime和修改tcp_slot_table_entries参数,客户端可以调整timeo。然而,传统NFS在处理小文件时性能较差,尤其是在网络延迟较高的情况下。
NFS-Ganesha则提供了更高的灵活性和可扩展性,支持NFSv2、NFSv3和NFSv4协议,并在许多大型高性能计算(HPC)环境中得到广泛应用。NFS-Ganesha通过模块化设计,每个模块负责各自的任务和目标,保证了后期扩展的便捷性。

小文件性能表现

传统NFS在处理小文件时性能较差,尤其是在网络延迟较高的情况下。然而,通过优化配置和使用高速网络,可以显著提升其性能。
NFS-Ganesha在处理小文件时表现出显著的速度提升,尤其是在网络延迟较低的情况下。例如,在1KB大小的文件上,vNFS比基准快19倍(读取)和5倍(写入)。这表明NFS-Ganesha在处理小文件时具有显著的性能优势。

高可用性和可靠性

NFS-Ganesha提供了高可用性和故障恢复能力,能够在节点故障时无缝切换到另一个节点,确保服务的连续性。例如,在高可用性环境中,如果一个NFS-Ganesha服务器故障,客户端可以无缝连接到另一个NFS-Ganesha服务器。
传统NFS服务在高可用性方面相对较弱,通常需要手动干预和配置复杂的故障恢复机制。

协议支持和功能扩展

NFS-Ganesha支持多种存储后端,如CephFS,并通过文件系统抽象层(FSAL)实现与不同存储系统的集成。此外,NFS-Ganesha还支持文件追加和服务器端复制等协议扩展。
传统NFS服务主要支持NFSv4协议,并且在协议扩展方面相对有限。

评估指标

名称NFS-Ganesha备注
开源协议未公布协议
部署方式全平台(裸金属、容器、K8s)
支持语言所有具有网络访问能力的语言
扩展性支持
安全性支持
管理复杂性支持
兼容性支持
协议多协议
运行日志
高可用支持
分布式支持

评估结果

NFS-Ganaesha是云原生环境下nfs应用生态的适应性发展项目。对于应用广泛的nfs服务,提供了云原生环境下的解决方案。云原生环境对应用提出的分布式,高可用,扩展性和安全性等方面一系列新问题,NFS-Ganaesha都能够提供解决方案,从而为用户提供更好的适应云原生环境的存储服务。

标签:缓存,ganesha,NFS,文件系统,FSAL,Ganesha,nfs,线程
From: https://blog.csdn.net/qq_40477248/article/details/142854643

相关文章

  • INFS3208 – Cloud Computing Programming
    SchoolofInformationTechnologyandElectricalEngineeringINFS3208–CloudComputingProgrammingAssignmentTaskIII(10Marks)Taskdescription:Inthisassignment,youareaskedtowriteapieceofSparkcodetocountoccurrencesofverbsintheUN......
  • [正点原子-I.MX6ULL]嵌入式 Linux 通过 nfs 下载出现 T T T T
    [正点原子-I.MX6ULL]嵌入式Linux通过nfs下载出现TTTT问题叙述但是有几个地方要注意1.安装驱动应该是2.修改GRUB_DEFAULT时,后面的引号是英文字符,直接复制过去会有语法报错3.最后就是重启linux时,如果你是在vmware上运行的,记得按shift进入boot界面问题叙述其实......
  • NFS安装使用
    服务端安装nfs-kernel-serveraptinstallnfs-kernel-server创建共享目录sudomkdir-p/opt/nfs/sharesudochmod666/opt/nfs/share修改NFS配置sudovim/etc/exports内容如下:/opt/nfs/share*(rw,sync,insecure,no_subtree_check,no_wdelay,no_root_squash)......
  • NFS共享挂载
    如果需要在192.168.123.1上设置NFS共享,下面是一些基本步骤:安装NFS服务:sudoaptinstallnfs-kernel-server设置共享目录:编辑/etc/exports文件,添加共享目录:sudovim/etc/exports添加以下行(假设要共享/mnt/data/biosoft):#读写rw同步sync禁用子目录检查no_......
  • K8S的StorageClass实战(NFS)
    本次实战的目标是快速创建NFS类型的StorageClass,并验证该StorageClass正常可用,全文由以下部分组成:创建StorageClass;通过helm下载tomcat的chart;修改chart,让tomcat使用刚才创建的StorageClass;在NFS服务端检查文件夹已正常写入;环境信息和准备工作以下是创建StorageCla......
  • 配置NFS共享
    服务端:ServerAip:172.168.125.100客户端:ServerBIP:172.168.125.101一、NFS服务端的配置1.配置好本地yun源后,先确认系统是否已经安装NFS软件包使用rpm-qa|grep-infs查看显示如下图表示已安装;如果未安装使用yum-yinstallnfs-utilsrpcbind进行安装二、配置NFS主文件/etc/ex......
  • INFS4203/7203 Project
    INFS4203/7203Projectemester2,2024Duedates:16:00on13thSeptember2024forprojectproposal(Phase1,15%)16:00on25thOctober2024forprojectreport(Phase2,20%)ImportantAssignmentSubmissionGuidelines:Allassignmentsmustbesubmittede......
  • Kubernetes怎么进行NFS动态存储迁移
    环境查看系统环境#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)#uname-aLinuxCentOS7K8SMaster010633.10.0-1160.108.1.el7.x86_64#1SMPThuJan2516:17:31UTC2024x86_64x86_64x86_64GNU/Linux软件环境#kubectlversionClientVersion:ver......
  • centos8 搭建NFS、Samba 和 FTP 共享服务
    centos8搭建NFS、Samba和FTP共享服务1.搭建NFS共享服务1:安装NFS服务器2:启动并设置NFS服务3:配置NFS共享4:创建并设置共享目录的权限5:重新导出文件系统6:配置防火墙7:测试NFS共享2.搭建Samba共享服务1:安装Samba2:启动并设置Samba服务3......
  • k8s动态存储篇--NFS
    github地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/tree/master/deploycat<<'EOF'>deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nfs-client-provisionerlabels:app:nfs-client-pr......