K8S 部署 NFS Dynamic Provisioning(动态存储供应)

本文档提供完整的 K8s NFS 动态存储部署流程,包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。

2. 部署步骤

2.1 创建命名空间

首先创建独立的命名空间 nfs-storageclass,用于隔离 NFS 相关资源:

kubectl create namespace nfs-storageclass

2.2 创建 ServiceAccount 和 RBAC 权限

NFS Provisioner 需要特定权限才能管理 PV/PVC 资源,通过 nfs-rbac.yaml 配置权限:

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# 与命名空间保持一致namespace: nfs-storageclass
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:# 权限1:获取节点信息- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]# 权限2:管理 PV(创建/删除/查看)- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]# 权限3:管理 PVC(查看/更新)- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]# 权限4:查看 StorageClass- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]# 权限5:创建事件(用于状态通知)- 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: nfs-storageclass
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: nfs-storageclass
rules:# 权限:管理 endpoints(用于 Provisioner  leader 选举)- 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: nfs-storageclass
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs-storageclass
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

2.3 部署 NFS Provisioner

NFS Provisioner 是动态生成 PV 的核心组件,需先拉取镜像并配置部署文件。

2.3.2 编写部署文件 nfs-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-client-provisionernamespace: nfs-storageclass
spec:replicas: 1  # 单副本(避免多副本竞争)selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreate  # 重建策略(避免滚动更新导致的状态不一致)template:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisioner  # 关联前面创建的 ServiceAccountcontainers:- name: nfs-client-provisionerimage: docker.1ms.run/dyrnq/nfs-subdir-external-provisioner:v4.0.2  # 镜像名volumeMounts:# 挂载 NFS 共享目录到容器内 /persistentvolumes- name: nfs-client-rootmountPath: /persistentvolumesenv:# 1. Provisioner 名称(需与后续 StorageClass 的 provisioner 一致)- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner# 2. NFS 服务器 IP(替换为你的 NFS 服务器地址)- name: NFS_SERVERvalue: 192.168.48.19# 3. NFS 共享目录路径(替换为你的 NFS 共享路径)- name: NFS_PATHvalue: /data/k8s_datavolumes:# 定义 NFS 挂载卷- name: nfs-client-rootnfs:server: 192.168.48.19  # NFS 服务器 IP(与上面一致)path: /data/k8s_data    # NFS 共享路径(与上面一致)

2.4 创建 StorageClass

StorageClass 是 PVC 申请存储的「模板」,通过 nfs-sc.yaml 配置:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client  # StorageClass 名称(PVC 需引用此名)namespace: nfs-storageclass
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner  # 与 Provisioner 环境变量 PROVISIONER_NAME 一致
parameters:# 1. PV 在 NFS 中的目录结构:${PVC命名空间}/${PVC名称}(便于区分不同 PVC 的存储)pathPattern: ${.PVC.namespace}/${.PVC.name}# 2. PVC 删除时的策略:delete 表示删除 NFS 中对应的目录(可选:retain 保留目录)onDelete: delete

2.5 验证 NFS 存储

通过创建 PVC 和 PV(可选,动态模式下 PV 会自动生成)验证存储是否可用。

2.5.1 创建 PVC(nfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: nfs  # PVC 名称# annotations:  # 可选:添加注解(如指定 StorageClass,若未指定则使用默认 SC)
spec:accessModes:- ReadWriteMany  # NFS 支持多节点读写(RWX)storageClassName: nfs-client  # 引用前面创建的 StorageClassresources:requests:storage: 1Mi  # 申请的存储容量(最小 1Mi,可根据需求调整)
2.5.2 手动创建 PV(可选,动态模式可省略)

若需手动绑定 PV(非动态模式),可创建 nfs-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv  # PV 名称# namespace: kube-system  # PV 是集群级资源,无需指定命名空间(此处原配置有误,建议删除)
spec:capacity:storage: 30Gi  # PV 容量(需 ≥ PVC 申请的容量)accessModes:- ReadWriteMany  # 与 PVC 的 accessModes 一致persistentVolumeReclaimPolicy: Retain  # PVC 删除后保留 PV 数据(可选:Delete 自动删除)storageClassName: nfs-client  # 关联 StorageClassnfs:server: 192.168.48.19  # NFS 服务器 IPpath: /data/k8s_data    # NFS 共享路径

2.6 执行所有 YAML 文件

将上述所有 YAML 文件放在同一目录,执行部署:

kubectl apply -f ./

3. 验证部署结果

3.1 查看 NFS Provisioner 组件状态

kubectl get all -n nfs-storageclass

预期输出(确保 Pod 为 Running 状态):

NAME                                       READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-c8b7f495d-b2zpk   1/1     Running   0          64mNAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-client-provisioner   1/1     1            1           82mNAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/nfs-client-provisioner-c8b7f495d   1         1         1       82m

3.2 查看 StorageClass

kubectl get sc

预期输出(确保 PROVISIONER 正确且 VOLUMEBINDINGMODEImmediate):

NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  83m

3.3 查看 PVC 和 PV

# 查看 PVC(确保 STATUS 为 Bound)
kubectl get pvc# 查看 PV(确保 STATUS 为 Bound,且 CLAIM 关联 PVC)
kubectl get pv

预期输出

# PVC 输出
NAME   STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
nfs    Bound    nfs-pv     30Gi       RWX            nfs-client     <unset>                 83m# PV 输出
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
nfs-pv   30Gi       RWX            Retain           Bound    default/nfs   nfs-client     <unset>                       84m

关键说明

  1. 动态 vs 静态
    • 动态模式(推荐):创建 PVC 后,Provisioner 会自动生成 PV 并绑定,无需手动创建 PV;
    • 静态模式:需先手动创建 PV,再创建 PVC 绑定。
  2. NFS 服务器配置
    需确保 NFS 服务器已正确配置共享目录(如 /data/k8s_data),且 K8s 所有节点能访问 NFS 服务器(防火墙开放 2049 端口)。
  3. 权限问题
    NFS 共享目录需设置足够权限(如 chmod 777 /data/k8s_data),避免 Provisioner 无法读写目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95729.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95729.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95729.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:从RNN到LSTM与GRU

本文将深入探讨循环神经网络&#xff08;RNN&#xff09;的核心原理、其面临的长期依赖问题&#xff0c;以及两大革命性解决方案——LSTM和GRU的门控机制&#xff0c;并通过实例和代码帮助读者彻底理解其工作细节。1. 引言&#xff1a;时序建模的数学本质在上一篇概述中&#x…

Qt---状态机框架QState

QState是Qt状态机框架&#xff08;Qt State Machine Framework&#xff09;的核心类&#xff0c;用于建模离散状态以及状态间的转换逻辑&#xff0c;广泛应用于UI交互流程、设备状态管理、工作流控制等场景。它基于UML状态图规范设计&#xff0c;支持层次化状态、并行状态、历史…

GitHub 热榜项目 - 日榜(2025-09-02)

GitHub 热榜项目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 统计摘要 共发现热门项目&#xff1a;14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现AI Agent生态爆发趋势&#xff0c;Koog、Activepieces等项目推动多平台智能体开发框架成熟。语…

华为卫星对星引导技术深度解析:原理、实现与开源替代方案

利号&#xff1a;CNXXXXXX 涉及多传感器融合/自适应波束成形/轨道预测算法一、技术原理剖析&#xff1a;卫星间高精度指向的核心挑战在低轨卫星&#xff08;LEO&#xff09;星座中&#xff0c;卫星间链路&#xff08;ISL&#xff09;的建立面临三大技术难题&#xff1a;1. 动力…

水下管道巡检机器人结构设cad+三维图+设计说明书

目 录 1 绪论 1 1.1 选题的背景及意义 1 1.2 水下管道巡检机器人的分类 2 1.2.1 管道巡检技术的分类 2 1.2.2管道巡检机器人的分类 2 1.3 研究的现状 3 1.3.1 国内的研究现状 3 1.3.2 国外的研究现状 4 1.4 水下管道巡检机器人的发展趋势 5 1.…

[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法

引言 欢迎来到本系列的第十一篇&#xff01;在我们通过“最大深度”问题初步领略了树的递归之美后&#xff0c;今天我们将面对一个更能体现递归“分治”思想的经典问题——LeetCode 226. 反转二叉树。 这道题在面试界的地位非同凡响&#xff0c;它因 Homebrew 的作者 Max How…

Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客 “把对象的构造步骤拆成链式方法&#xff0c;调用者按需填参&#xff0c;最后一次性 build&#xff0c;避免构造函数爆炸。” 经典场景 参数多&#xff08;>4 个&#xff09;且大部分可选 需要不可变对象&#xff08;final 字段&#xf…

网页计时器,支持多计时器管理、数据分享、用户数据同步、全屏展示等功能,可进行倒计时、正计时和显示世界时钟。

一个具有现代化 UI 和交互的计时器网页应用&#xff0c;支持多计时器管理、数据分享、用户数据同步、全屏展示等功能&#xff0c;可进行倒计时、正计时和显示世界时钟。它采用玻璃态设计和流畅动画效果&#xff0c;提供极佳的视觉体验。 特点&#xff1a; 支持多个计时器的创建…

纹理融合——用 TypeScript + Babylon.js 打造“可混合纹理序列”

我不想搞个一新的Shader&#xff0c;我就想用已有的材质&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;实现纹理融合渐变等效果&#xff0c;于是我搞了一个TextureBlender。一、为什么重复造轮子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源码+数据集+部署教程】公交车部件实例分割系统源码和数据集:改进yolo11-fasternet

背景意义 随着城市化进程的加快&#xff0c;公共交通系统的需求日益增加&#xff0c;公交车作为城市交通的重要组成部分&#xff0c;其运行效率和安全性直接影响到城市的交通状况和居民的出行体验。因此&#xff0c;公交车的维护和管理显得尤为重要。在这一背景下&#xff0c;公…

【C++题解】关联容器

关于set&#xff0c;map以及变种 |关联容器| set&multiset | map&multimap |无序关联容器| Unordered set&multiset | Unordered map&multimap | 建议先了解之后再配合练习 这次练习CCF真题比较多&#xff0c;也比较基础&#xff0c;预计耗时不用这么久。 今天…

【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill&#xff0c;在学习时我尝试使用相同命令训练同一个任务&#xff0c;但是我发现最终的 success_once 指标并不是相同的&#xff0c;我感到十分焦虑&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主从复制原理分析与实战

MySQL 8.0 主从复制原理分析与实战半同步复制设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的基于全局事务标识符&#xff08;GTID&#xff09;复制GTID工作原理多主模式多主模式部署示例课程目标&#xff1a; MySQL 复制&#xff08;Replication&a…

[UT]记录case中seq.start(sequencer)的位置变化带来的执行行为的变化

现象&#xff1a; 代码选择打开57行&#xff0c;注释掉60行执行&#xff0c;结果58行不会打印。 代码选择打开60行&#xff0c;注释57行执行&#xff0c;结果58行正常打印。 sequence的执行需要时间&#xff01;&#xff01;&#xff01; SV中代码57行切换到60行的区别&#xf…

利用keytool实现https协议(生成自签名证书)

利用keytool实现https协议&#xff08;生成自签名证书&#xff09;什么是https协议&#xff1f;https&#xff08;安全超文本传输协议&#xff09;是 HTTP 的安全版本&#xff0c;通过 SSL/TLS 加密技术&#xff0c;在客户端&#xff08;如浏览器&#xff09;和服务器之间建立加…

拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路

一、引言&#xff1a;揭开 AI 大模型 “思考” 的神秘面纱​日常生活中的 AI 大模型 “思考” 场景呈现&#xff08;如 ChatGPT 对话、AI 写作辅助、智能客服应答&#xff09;​提出核心问题&#xff1a;看似具备 “思考” 能力的 AI 大模型&#xff0c;其背后的运作逻辑究竟是…

element plus 使用细节 (二)

接上一篇文章&#xff1a; element plus 使用细节 最近菜鸟忙于系统开发&#xff0c;都没时间总结项目中使用的问题&#xff0c;幸好还是在空闲之余总结了一点&#xff08;后续也会来补充&#xff09;&#xff0c;希望能给大家带来帮助&#xff01; 文章目录table fixed 的 v…

【机器学习学习笔记】numpy基础2

零基础小白的 NumPy 入门指南如果你想用电竞&#xff08;打游戏&#xff09;的思路理解编程&#xff1a;Python 是基础操作键位&#xff0c;而 NumPy 就是 “英雄专属技能包”—— 专门帮你搞定 “数值计算” 这类复杂任务&#xff0c;比如算游戏里的伤害公式、地图坐标&#x…

从自动化到智能化:家具厂智能化产线需求与解决方案解析

伴随着工业4.0浪潮和智能制造技术的成熟&#xff0c;家具行业正逐步从传统的自动化生产迈向智能化生产。智能化产线的构建不仅可以提升生产效率&#xff0c;还能满足个性化定制和柔性制造的需求。本文以某家具厂为例&#xff0c;详细解析智能化产线的核心需求&#xff0c;并提出…