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
相关文章
|
5月前
|
存储 Kubernetes 中间件
在Kubernetes集群中部署NFS Subdir ExternalProvisioner的完整复盘
本文完整复盘Kubernetes中NFS Subdir External Provisioner的Helm部署实践,涵盖环境准备、原理剖析、分步安装、动态PV创建与回收验证。通过配置StorageClass实现PVC自动绑定NFS子目录,支持ReadWriteMany,提升共享存储管理效率。(239字)
295 1
|
运维 Kubernetes API
k8s集群新增master 、work节点重新生成token、certificate-key等操作
k8s集群运维中通常会存在新增和删除节点,一些token、certificate-key信息 会被遗忘,怎么去重生成了 可以按照以下方式
5401 0
|
5月前
|
存储 Kubernetes 安全
在 Kubernetes 中实现 NFS 动态存储供应:生产级实践指南
本文详解如何在Kubernetes生产环境中基于NFS实现动态存储供应,涵盖NFS服务器部署、`nfs-subdir-external-provisioner`集成、StorageClass优化配置及离线环境下的Harbor私有镜像管理方案,提供完整YAML模板与安全实践,助力构建稳定高效的共享存储体系。
|
3月前
|
人工智能 自然语言处理 监控
OpenClaw(养龙虾)全攻略:是什么?能做什么?怎么部署?
全网爆火的“养龙虾”实为部署开源AI智能体OpenClaw!它不止能对话,更能动手:自动办公、写代码、抢电商、控家居、创内容。图标是红机械龙虾,故得名。阿里云一键部署,2步搞定,支持微信/飞书等自然语言操控。让AI真正替你干活!
1707 9
|
4月前
|
监控 应用服务中间件 nginx
别再手写 Nginx 配置了!用 Nginx UI 图形化管理你的 Web 服务!
Nginx UI 是一款轻量级图形化管理工具,让 Nginx 配置告别手写与 reload 煎熬。支持站点管理、反向代理、HTTPS 一键申请/续期、日志查看、配置版本回滚与语法校验,Docker 一键部署,适配单机及集群,真正将 Nginx 变成“可视化管家”。
1134 3
|
8月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
2574 8
|
11月前
|
Kubernetes 负载均衡 Ubuntu
Kubernetes安装详细教程 Ubuntu版
本教程基于Ubuntu 22.04配置Kubernetes环境,涵盖依赖安装、swap关闭、内核参数调整、containerd与Kubernetes组件安装、集群初始化及CNI网络插件部署等内容,并提供常见问题处理方法和相关工具推荐。
|
人工智能 JavaScript 开发工具
【完全免费】VS Code 最好用的 12 款 AI 代码提示插件!!!
🎉 探索12款免费VSCode AI代码提示插件:Codeium、Codegeex、CodeFuse、TONGYI Lingma、Comate、iFlyCode、Fitten Code、Bito AI、Mintlify Doc Writer、Kodezi AI、aiXcoder、IntelliCode。这些插件提供智能补全、代码生成、注释、优化,支持多种语言,提升编程效率!🚀👩‍💻👨‍💻
28585 121
|
应用服务中间件 nginx Docker
配置Containerd运行时镜像加速器
containerd配置国内容器镜像加速器
5351 1
|
存储 Kubernetes 网络协议
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数
9477 3
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件