NFS Subdir Provisioner 实现K8S动态PV供应

简介: 本文介绍基于原生NFS与NFS Subdir External Provisioner的K8S动态存储方案,通过Ubuntu 24搭建NFS服务器,实现自动创建PVC专属子目录,避免数据混叠。部署简单、维护成本低,适用于90%中小规模K8S集群,含完整配置步骤与安全建议。

本文转载自:https://mp.weixin.qq.com/s/9w_PN7dLQtMmGekagHz8AA




原生 NFS + NFS Subdir External Provisioner,这是 K8S 社区最主流的方案 ——原生 NFS 服务器提供存储能力,NFS Subdir Provisioner 实现 K8S 动态 PV 供应,能自动为每个 PVC 创建专属 NFS 子目录(避免多 PVC 数据混叠),部署简单、维护成本低,适合 90% 的中小规模 K8S 集群,部署以Ubuntu24为例。



搭建K8S后端存储的NFS服务器流程


首先了解当前服务器的存储情况和环境配置。


第一步:检查存储设备情况



  1. 查看磁盘列表:

lsblk


识别到新设备(如/dev/sdb),未分区、未格式化。




  1. 确认磁盘详情:

sudo fdisk -l /dev/sdb


确认/dev/sdb是未分区的新磁盘。



第二步:准备数据盘


(步骤:创建分区 → 格式化文件系统 → 创建挂载点并挂载)



  1. 创建磁盘分区:

echo -e "n\np\n1\n\n\nw" | sudo fdisk /dev/sdb


  1. 格式化文件系统(ext4):

sudo mkfs.ext4 /dev/sdb1


  1. 创建挂载点:

sudo mkdir /nfs-storage


  1. 挂载分区到挂载点:

sudo mount /dev/sdb1 /nfs-storage


  1. 配置开机自动挂载:

sudo tee -a /etc/fstab <<EOF
/dev/sdb1 /nfs-storage ext4 defaults 0 0
EOF


  1. 验证挂载情况:

df -h /nfs-storage


显示/dev/sdb1已挂载到/nfs-storage即成功。



第三步:安装NFS服务器


sudo apt update && sudo apt install -y nfs-kernel-server

第四步:配置NFS共享



  1. 创建NFS共享目录结构:

sudo mkdir -p /nfs-storage/k8s-pvs


  1. 修改共享目录权限:

sudo chown nobody:nogroup /nfs-storage/k8s-pvs && sudo chmod 777 /nfs-storage/k8s-pvs


  1. 配置/etc/exports(NFS共享规则):
    (注:原直接编辑文件失败,改用tee命令)

sudo tee /etc/exports <<'EOF'
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
/nfs-storage/k8s-pvs (rw,sync,no_subtree_check,no_root_squash,fsid=0)
EOF

第五步:启动和配置NFS服务



  1. 重启NFS服务:

sudo systemctl restart nfs-kernel-server


  1. 设置NFS服务开机自启:

sudo systemctl enable nfs-kernel-server


  1. 验证NFS共享配置:

sudo exportfs -v

第六步:配置防火墙(如果需要)



  1. 检查防火墙状态:

sudo ufw status


若防火墙未启用,则无需额外配置。



第七步:测试NFS共享



  1. 本地创建测试挂载点并挂载NFS:

sudo mkdir -p /tmp/test-nfs && sudo mount -t nfs localhost:/nfs-storage/k8s-pvs /tmp/test-nfs


  1. 写入测试文件验证:

df -h /tmp/test-nfs && echo "NFS测试成功" | sudo tee /tmp/test-nfs/test.txt


  1. 卸载测试挂载点并清理:

sudo umount /tmp/test-nfs && sudo rmdir /tmp/test-nfs

第八步:创建NFS Subdir Provisioner所需目录


sudo mkdir -p /nfs-storage/k8s-pvs/.nfs-provisioner && sudo chown nobody:nogroup /nfs-storage/k8s-pvs/.nfs-provisioner

第九步:验证最终配置


(示例:检查共享目录权限)


ls -ld /nfs-storage/k8s-pvs

第十步:生成K8S部署配置文件(nfs-provisioner-deployment.yaml


# NFS Subdir External Provisioner Deployment for K8S
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
rules:
  - apiGroups: ["coordination.k8s.io"]
    resources: ["leases"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 192.168.9.2  # 替换为你的NFS服务器IP
            - name: NFS_PATH
              value: /nfs-storage/k8s-pvs
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.9.2  # 替换为你的NFS服务器IP
            path: /nfs-storage/k8s-pvs
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true

完成总结


已完成的核心配置



  1. 存储准备



    • 识别并分区格式化新磁盘(/dev/sdb
    • 格式化为ext4文件系统
    • 创建/nfs-storage挂载目录
    • 配置开机自动挂载

  2. NFS服务器



    • 安装nfs-kernel-server服务
    • 创建NFS共享目录(/nfs-storage/k8s-pvs
    • 配置/etc/exports允许所有客户端访问(权限:rw,sync,no_subtree_check,no_root_squash,fsid=0
    • 启动并设置NFS服务开机自启
    • 本地挂载测试验证


NFS服务器信息



  • 服务器IP:192.168.9.2
  • 共享路径:/nfs-storage/k8s-pvs
  • 访问权限:所有客户端可读写

K8S部署准备



  • 已生成nfs-provisioner-deployment.yaml文件,包含:

    • ServiceAccount和RBAC权限配置
    • NFS Provisioner Deployment
    • NFS StorageClass


下一步操作



  1. 在K8S集群中部署Provisioner:

kubectl apply -f nfs-provisioner-deployment.yaml


  1. 创建测试PVC验证:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-storage


PVC创建后会自动绑定PV,PV实际路径对应/nfs-storage/k8s-pvs/default-test-nfs-pvc-xxx



安全建议(可选)



  1. 限制NFS访问来源为K8S节点网段(替换/etc/exports中的
  2. 启用NFS的Kerberos认证
  3. 定期备份NFS存储数据


本文转载自:https://mp.weixin.qq.com/s/9w_PN7dLQtMmGekagHz8AA



相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
存储 Kubernetes 中间件
在Kubernetes集群中部署NFS Subdir ExternalProvisioner的完整复盘
本文完整复盘Kubernetes中NFS Subdir External Provisioner的Helm部署实践,涵盖环境准备、原理剖析、分步安装、动态PV创建与回收验证。通过配置StorageClass实现PVC自动绑定NFS子目录,支持ReadWriteMany,提升共享存储管理效率。(239字)
192 1
|
消息中间件 运维 Java
【消息中间件】在Docker下安装的RocketMQ,使用mqadmin命令报错解决[10015:signature-failed]
前在Docker下安装了RocketMQ以及他的管理平台,但是管理平台在运维的时候只能满足我们部分的需求,所以为了在集群运维时能够的得心应手,研究了下mqadmin的使用,没想到一开始就遇到了报错,在这里和大家分享下解决的方法。
1941 105
|
3月前
|
存储 Kubernetes 安全
在 Kubernetes 中实现 NFS 动态存储供应:生产级实践指南
本文详解如何在Kubernetes生产环境中基于NFS实现动态存储供应,涵盖NFS服务器部署、`nfs-subdir-external-provisioner`集成、StorageClass优化配置及离线环境下的Harbor私有镜像管理方案,提供完整YAML模板与安全实践,助力构建稳定高效的共享存储体系。
|
2月前
|
监控 应用服务中间件 nginx
别再手写 Nginx 配置了!用 Nginx UI 图形化管理你的 Web 服务!
Nginx UI 是一款轻量级图形化管理工具,让 Nginx 配置告别手写与 reload 煎熬。支持站点管理、反向代理、HTTPS 一键申请/续期、日志查看、配置版本回滚与语法校验,Docker 一键部署,适配单机及集群,真正将 Nginx 变成“可视化管家”。
816 3
|
9月前
|
Kubernetes 负载均衡 Ubuntu
Kubernetes安装详细教程 Ubuntu版
本教程基于Ubuntu 22.04配置Kubernetes环境,涵盖依赖安装、swap关闭、内核参数调整、containerd与Kubernetes组件安装、集群初始化及CNI网络插件部署等内容,并提供常见问题处理方法和相关工具推荐。
|
9月前
|
人工智能 JSON JavaScript
这个开源的「AI + 低代码」开发平台绝了,Gitee上斩获 9.2K Star!
VTJ.PRO 是一款 AI 驱动的低代码开发平台,深度融合 Vue3 技术栈,支持可视化设计与源码级编辑双向自由切换。通过 AI 智能生成、代码修复、跨端输出等能力,大幅提升前端开发效率,实现设计即代码、代码即设计的高效工作流,适用于原型开发、项目重构等多种场景。平台完全开源,提供在线沙盒与本地部署,助力开发者兼顾开发速度与代码自由度。
965 0
|
应用服务中间件 nginx Docker
配置Containerd运行时镜像加速器
containerd配置国内容器镜像加速器
5153 1
|
存储 Kubernetes 网络协议
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数
9349 3
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如果后端nfs存储的ip发生变化如何解决?
在K8S中,如果后端nfs存储的ip发生变化如何解决?
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
648 0