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
相关文章
|
27天前
|
存储 Kubernetes 安全
在 Kubernetes 中实现 NFS 动态存储供应:生产级实践指南
本文详解如何在Kubernetes生产环境中基于NFS实现动态存储供应,涵盖NFS服务器部署、`nfs-subdir-external-provisioner`集成、StorageClass优化配置及离线环境下的Harbor私有镜像管理方案,提供完整YAML模板与安全实践,助力构建稳定高效的共享存储体系。
|
1月前
|
人工智能 安全 API
Nacos 安全护栏:MCP、Agent、配置全维防护,重塑 AI Registry 安全边界
Nacos安全新标杆:精细鉴权、无感灰度、全量审计!
869 70
|
Arthas druid Java
一次druid数据库连接池连接泄露的排查分析
一次druid数据库连接池连接泄露的排查分析
2489 1
|
Kubernetes 容器 Perl
kubeadm初始化k8s集群延长证书过期时间
kubeadm初始化k8s集群延长证书过期时间
|
18天前
|
人工智能 Java Nacos
构建开放智能体生态:AgentScope 如何用 A2A 协议与 Nacos 打通协作壁垒?
AgentScope 全面支持 A2A 协议和 Nacos 智能体注册中心,实现跨语言跨框架智能体互通。
500 55
|
5月前
|
移动开发 前端开发 安全
如何使用Foldables.js库?
如何使用Foldables.js库?
378 122
|
14天前
|
监控 API 开发者
印度股市数据集成指南:利用 StockTV API 快速接入 NSE/BSE 实时行情
StockTV API 为印度股市(NSE/BSE)提供全维度实时数据:Nifty 50指数、数千只个股行情、K线图、涨跌幅榜及IPO日历。仅需`countryId=14`,配合`key`认证,即可快速接入——支持HTTP/WS双模式,毫秒级延迟,赋能量化交易与金融科技开发。(239字)
|
1月前
|
机器学习/深度学习 人工智能 安全
构建AI智能体:八十六、大模型的指令微调与人类对齐:从知识渊博到善解人意
本文探讨了大模型从知识储备到实用助手的进化过程。首先分析了原始预训练模型存在的问题:擅长文本补全但缺乏指令理解能力,可能生成有害或无关内容。然后详细介绍了指令微调技术,通过高质量(指令-输出)数据集教会模型理解并执行翻译、总结、情感分析等任务。进一步阐述了人类对齐技术,包括基于人类反馈的强化学习(RLHF)的三个关键步骤,使模型输出不仅符合指令,更符合人类价值观。最后展示了Qwen模型微调实践,包括代码实现和效果对比。整个过程将AI从知识库转变为既强大又安全可靠的智能助手。
279 19
|
数据安全/隐私保护 C++ 开发工具
Windows10 VS2017 C++使用crypto++库加密解密(AES)
版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/85262234 参考文章:https://blog.
6105 0