当前位置: 首页 > news >正文

k8s配置nfs存储类

1.开启nfs-server

# 在 NFS 服务器上安装并配置
sudo apt install nfs-kernel-server  # Ubuntu/Debian
sudo mkdir -p /data/nfs
sudo chmod 777 /data/nfs# 编辑 /etc/exports 添加:
# /data/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
sudo exportfs -ra

2.在master节点部署

---
# 1. RBAC 权限配置
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- 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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: kube-system
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: kube-system
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io---
# 2. NFS Client Provisioner 部署
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: kube-systemlabels:app: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.1.100      # ⚠️ 修改为你的 NFS 服务器 IP- name: NFS_PATHvalue: /data/nfs           # ⚠️ 修改为你的 NFS 共享路径- name: ENABLE_LEADER_ELECTIONvalue: "true"# 可选:设置子目录命名规则- name: PATH_PATTERNvalue: "${.PVC.namespace}-${.PVC.name}"volumes:- name: nfs-client-rootnfs:server: 192.168.1.100        # ⚠️ 修改为你的 NFS 服务器 IPpath: /data/nfs              # ⚠️ 修改为你的 NFS 共享路径---
# 3. StorageClass 定义
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client                    # 使用时的 storageClassNameannotations:storageclass.kubernetes.io/is-default-class: "true"  # 设为默认存储类(可选)
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:archiveOnDelete: "false"            # 删除 PVC 时是否归档(true=重命名保留,false=直接删除)# pathPattern: "${.PVC.namespace}/${.PVC.name}"  # 自定义路径模式
mountOptions:- hard                              # 硬挂载- nfsvers=4.1                       # NFS 版本- nolock                            # 不使用文件锁- noatime                           # 不更新访问时间
reclaimPolicy: Delete                 # 回收策略:Delete 或 Retain
volumeBindingMode: Immediate          # Immediate 或 WaitForFirstConsumer
allowVolumeExpansion: true            # 允许扩容

3.创建pvc验证

# 查看 StorageClass
kubectl get sc# 查看 Provisioner 运行状态
kubectl get pods -n kube-system -l app=nfs-client-provisioner# 测试创建 PVC
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-clientresources:requests:storage: 1Gi
EOFkubectl get pvc test-nfs-pvc

4.启用nfs-server磁盘的大小配额(XFS Project Quota)

UUID=xxxxx  /data  xfs  defaults,prjquota  0  0mount -o remount,prjquota /data
mount | grep " /data "
# 应显示 prjquota
sudo tee /usr/local/bin/set-nfs-quota.sh << 'EOF'
#!/bin/bash
# 为 /data/nfs 下所有子目录设置 50G project quota
# 注意:xfs_quota 在 /data 挂载点操作,但项目路径是完整的NFS_ROOT="/data/nfs"
MOUNT_POINT="/data"  # XFS 挂载点
MAX_PROJECT_ID=$(cat /etc/projects 2>/dev/null | awk -F: '{print $1}' | sort -n | tail -1)
[ -z "$MAX_PROJECT_ID" ] && MAX_PROJECT_ID=100# 确保 nfs 目录存在
[ -d "$NFS_ROOT" ] || exit 0# 遍历所有子目录
for dir in "$NFS_ROOT"/*/; do[ -d "$dir" ] || continue# 标准化路径(去除尾部斜杠)dir=$(realpath "$dir")dirname=$(basename "$dir")project_name="nfs_${dirname}"project_id=""# 跳过非目录项[ "$dirname" == "nfs" ] && continue# 检查是否已在 /etc/projects 中if grep -q ":${dir}$" /etc/projects 2>/dev/null; thenproject_id=$(grep ":${dir}$" /etc/projects | head -1 | cut -d: -f1)echo "Existing project found: $project_name (ID: $project_id) for $dir"else# 分配新 project IDMAX_PROJECT_ID=$((MAX_PROJECT_ID + 1))project_id=$MAX_PROJECT_IDecho "${project_id}:${dir}" >> /etc/projectsecho "Created new project: $project_name (ID: $project_id) for $dir"fi# 写入 /etc/projidif ! grep -q "^${project_name}:${project_id}$" /etc/projid 2>/dev/null; then# 删除旧的同名 project(如果有)grep -v "^${project_name}:" /etc/projid > /tmp/projid.tmp 2>/dev/null || truemv /tmp/projid.tmp /etc/projid 2>/dev/null || trueecho "${project_name}:${project_id}" >> /etc/projidfi# 设置 project ID 到目录(在挂载点 /data 上操作)xfs_quota -x -c "project -s ${project_name}" "$MOUNT_POINT" 2>/dev/null# 设置 50G 硬限制xfs_quota -x -c "limit -p bhard=50g ${project_name}" "$MOUNT_POINT"echo "Set 50G quota for: $dir"
done
EOFsudo chmod +x /usr/local/bin/set-nfs-quota.sh
# 创建空的 projects 和 projid 文件(如果不存在)
sudo touch /etc/projects /etc/projid

设置监控脚本

sudo tee /usr/local/bin/watch-nfs-dirs.sh << 'EOF'
#!/bin/bash
NFS_ROOT="/data/nfs"
LOG_FILE="/var/log/nfs-quota.log"# 检查 inotifywait 是否可用
if ! command -v inotifywait &> /dev/null; thenecho "Error: inotifywait not found. Install inotify-tools."exit 1
fiecho "$(date): Starting NFS quota watcher on $NFS_ROOT" >> "$LOG_FILE"inotifywait -m "$NFS_ROOT" -e create -e moved_to --format '%w%f' 2>/dev/null | while read NEW_PATH; doif [ -d "$NEW_PATH" ]; thenecho "$(date): New directory detected: $NEW_PATH" >> "$LOG_FILE"sleep 1/usr/local/bin/set-nfs-quota.sh >> "$LOG_FILE" 2>&1fi
done
EOFsudo chmod +x /usr/local/bin/watch-nfs-dirs.sh

设置systemd

sudo tee /etc/systemd/system/nfs-quota-watcher.service << 'EOF'
[Unit]
Description=NFS Directory Quota Watcher
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/watch-nfs-dirs.sh
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target
EOFsudo systemctl daemon-reload
sudo systemctl enable nfs-quota-watcher
sudo systemctl start nfs-quota-watcher

安装依赖并启动

sudo apt update && sudo apt install -y inotify-tools xfsprogs# 立即初始化现有目录
sudo /usr/local/bin/set-nfs-quota.sh# 启动监控服务
sudo systemctl daemon-reload
sudo systemctl enable nfs-quota-watcher
sudo systemctl start nfs-quota-watcher

验证

# 查看 XFS 挂载参数(确认 prjquota)
mount | grep /data# 查看所有 project 配额(在 /data 挂载点)
sudo xfs_quota -x -c "report -pbh" /data# 查看详细项目信息
sudo xfs_quota -x -c "project -l" /data# 测试新目录
mkdir /data/nfs/testdir
# 等待几秒后检查
sudo xfs_quota -x -c "report -pbh" /data

在目录下生成大文件并验证

# 在当前目录生成
fallocate -l 60G ./largefile

 

http://www.jsqmd.com/news/661233/

相关文章:

  • macOS视频预览终极指南:3个技巧让Finder识别所有视频格式
  • 3个关键步骤:用PyBullet构建专业级无人机强化学习环境
  • 欧卡北欧超写实影调画质丨雪月光照+Ultimate Graphics Mod+Reshade特调滤镜+PNG、JBX——鲜艳配置
  • 告别重复劳动:用CodeGeeX的‘交互模式’和‘智能问答’,5分钟搞定C#单元测试和代码解释
  • 如何用本地AI助手突破性提升Obsidian笔记的智能与隐私
  • 别再踩坑了!Python列表赋值‘幽灵修改’问题的深度分析与三种解决方案
  • PyTorch模型保存与加载:从state_dict到完整模型的实战解析
  • 在iPhone和Mac上运行Windows和Linux的终极指南:UTM虚拟机完整教程
  • 别再死记硬背了!用Python代码带你直观理解离散数学中的等价关系与划分
  • GEMMA基因组关联分析技术解析与实战应用指南
  • AI麻将助手:实时分析智能决策的开源工具指南
  • 别再凭感觉选电容了!手把手教你计算STM32/STM8晶振外接电容(附Excel计算工具)
  • RuoYi若依后台忘记密码别慌!手把手教你用SecurityUtils生成密文(含新旧版本区别)
  • 5分钟搞定!腾讯混元HY-MT1.5翻译模型Docker一键部署实战
  • 2026 东莞法律服务推荐榜|专业律所与律师精选 - 速递信息
  • Ostrakon-VL-8B多实例部署与负载均衡配置指南
  • 3步解锁AMD Ryzen隐藏性能:SMUDebugTool深度调优实战手册
  • 收藏!Java程序员裸辞All in AI一年,从写代码到调AI,小白也能抄的转型指南
  • 终极Mac鼠标平滑滚动解决方案:让外接鼠标拥有触控板般的丝滑体验
  • 解读EN IEC 62660-2:2019:如何通过标准测试保障电动车锂离子电池的安全与耐用
  • 教你如何避坑:百联OK卡回收常见问题详解 - 团团收购物卡回收
  • 从IS到CLIP Score:文本生成图像主流评价指标演进与实战解析
  • LibreCAD终极指南:免费开源2D CAD软件如何革新工程设计
  • QLVideo终极指南:彻底解锁macOS视频预览与元数据管理的隐藏潜能
  • 机器学习期末急救包:KD树、朴素贝叶斯等5大核心算法手算详解(附可撕式答题模板)
  • 硬件工程师避坑指南:选型时,别只看正向压降!PN结的这些“隐藏参数”才是关键
  • 三步快速备份微信聊天记录:告别数据丢失的终极方案
  • 告别玄学调试:手把手教你用串口log和esptool诊断ESP32/ESP8266的Flash下载问题
  • 一文理清 汇编、图形学API、CUDA,在完整的链路中各自的位置
  • Cadence Virtuoso新手村:用拉扎维经典共源级电路,5分钟搞定DC/AC/瞬态三大仿真