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
相关文章
|
2月前
|
存储 Kubernetes 安全
在 Kubernetes 中实现 NFS 动态存储供应:生产级实践指南
本文详解如何在Kubernetes生产环境中基于NFS实现动态存储供应,涵盖NFS服务器部署、`nfs-subdir-external-provisioner`集成、StorageClass优化配置及离线环境下的Harbor私有镜像管理方案,提供完整YAML模板与安全实践,助力构建稳定高效的共享存储体系。
|
Kubernetes 容器 Perl
kubeadm初始化k8s集群延长证书过期时间
kubeadm初始化k8s集群延长证书过期时间
|
存储 C语言
数组(最全)
数组(最全)
|
Kubernetes Ubuntu 应用服务中间件
在Ubuntu上安装K8S教程
在Ubuntu上安装K8S教程
4188 1
|
2月前
|
存储 Kubernetes 中间件
在Kubernetes集群中部署NFS Subdir ExternalProvisioner的完整复盘
本文完整复盘Kubernetes中NFS Subdir External Provisioner的Helm部署实践,涵盖环境准备、原理剖析、分步安装、动态PV创建与回收验证。通过配置StorageClass实现PVC自动绑定NFS子目录,支持ReadWriteMany,提升共享存储管理效率。(239字)
|
5月前
|
运维 Prometheus 监控
别再“亡羊补牢”了!——聊聊如何优化企业的IT运维监控架构
别再“亡羊补牢”了!——聊聊如何优化企业的IT运维监控架构
232 8
|
8月前
|
Kubernetes 负载均衡 Ubuntu
Kubernetes安装详细教程 Ubuntu版
本教程基于Ubuntu 22.04配置Kubernetes环境,涵盖依赖安装、swap关闭、内核参数调整、containerd与Kubernetes组件安装、集群初始化及CNI网络插件部署等内容,并提供常见问题处理方法和相关工具推荐。
|
8月前
|
人工智能 JSON JavaScript
这个开源的「AI + 低代码」开发平台绝了,Gitee上斩获 9.2K Star!
VTJ.PRO 是一款 AI 驱动的低代码开发平台,深度融合 Vue3 技术栈,支持可视化设计与源码级编辑双向自由切换。通过 AI 智能生成、代码修复、跨端输出等能力,大幅提升前端开发效率,实现设计即代码、代码即设计的高效工作流,适用于原型开发、项目重构等多种场景。平台完全开源,提供在线沙盒与本地部署,助力开发者兼顾开发速度与代码自由度。
818 0
|
安全 算法 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识
在数字化时代,网络安全与信息安全成为了全球关注的焦点。随着技术的发展,网络攻击手段日益多样化,而防御措施也在不断进步。本文将深入探讨网络安全漏洞的成因与影响,分析当前主流的加密技术如何保护信息安全,并强调提升个人与企业的安全意识对于构建稳固防线的重要性。通过案例分析与数据统计,文章旨在为读者提供全面的网络安全知识,以应对日益复杂的网络威胁。
256 28
|
存储 Kubernetes 网络协议
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数
9170 3
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件