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

k8s基于nfs创建storageClass

首先安装nfs

#服务端安装
yum install -y nfs-utils rpcbind
#客户端安装
yum install -y nfs-utils
#启动服务 并设置开启启动
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
#创建共享目录
mkdir -p /root/data/nfs
#设置权限
chmod 666 /root/data/nfs
#修改 NFS 配置文件
vim /etc/exports
/root/data/nfs 192.168.140.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
#载入配置
exportfs -rv
#查看 NFS 服务项 rpc 服务器注册的端口列表
rpcinfo -p localhost
#服务端看下是否正确加载了设置的 /etc/exports 配置
showmount -e localhost
#关闭防火墙
systemctl stop firewalld.service
#设置开机自动挂载
echo "192.168.140.129:/root/data/nfs /share nfs defaults 0 0" >> /etc/fstab
#客户端查看能否正常挂载 192.168.140.129 是nfs服务端ip
showmount -e 192.168.140.129
#客户端执行绑定目录注意:一定挂载根目录例如: /share
mount 192.168.140.129:/root/data/nfs /share
#客户端在/share里写入文件测试

搭建好nfs 下一步 以静态方式通过手动创建pv pvc来实现nfs存储
注意:首先要在各节点安装nfs客户端
确保 Kubernetes 节点安装了 NFS 客户端
要确保 NFS 能在 Kubernetes 中正常挂载,所有工作节点(worker nodes)必须安装 NFS 客户端工具包。NFS 的挂载操作是由 Kubernetes 节点来处理的,而不是容器内的程序。你可以通过以下命令在节点上安装 NFS 工具。
否则会报如下异常:

 Warning  FailedMount  33s                  kubelet            Unable to attach or mount volumes: unmounted volumes=[nfs-storage], unattached volumes=[nfs-storage kube-api-access-cpsjc]: timed out waiting for the conditionWarning  FailedMount  27s (x9 over 2m35s)  kubelet            MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t nfs 192.168.140.129:/root/data/nfs /var/lib/kubelet/pods/107290f4-9c5d-40c6-b42a-b5533c76dc57/volumes/kubernetes.io~nfs/nfs-pv
Output: mount: 文件系统类型错误、选项错误、192.168.140.129:/root/data/nfs 上有坏超级块、缺少代码页或助手程序,或其他错误(对某些文件系统(如 nfs、cifs) 您可能需要一款 /sbin/mount.<类型> 助手程序)有些情况下在 syslog 中可以找到一些有用信息- 请尝试dmesg | tail  这样的命令看看。

部署yaml静态使用nfs示例

#测试pod使用nfs存储
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pvnamespace: storagedemo
spec:capacity:storage: 1Gi   # 你想要的存储大小accessModes:- ReadWriteMany  # 允许多个节点读写nfs:path: /root/data/nfs   # NFS 共享的路径server: 192.168.140.129  # NFS 服务器地址persistentVolumeReclaimPolicy: Retain---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvcnamespace: storagedemo
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nfsdemo-v1namespace: storagedemolabels:app: nfsdemoversion: v1
spec:replicas: 3selector:matchLabels:app: nfsdemoversion: v1template:metadata:labels:app: nfsdemoversion: v1spec:containers:- name: nfsdemoimage: 192.168.140.135:5000/nfsdemo:v1ports:- containerPort: 6085volumeMounts:- name: nfs-storagemountPath: /root/data  # 容器内的挂载路径volumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:name: nfsdemo-servicenamespace: storagedemo
spec:type: NodePort  # 设置为 NodePort 类型selector:app: nfsdemo  # 与 Deployment 中的 Pod 匹配的标签ports:- port: 6085          # 服务的端口targetPort: 6085    # Pod 中容器的端口

使用storageClass动态创建pv
注意:需要安装nfs的provisioner
本例使用provisioner镜像:nfs-subdir-external-provisioner:latest
还需要配置一系列权限 provisioner 需要许多集群权限 否则创建不成功pv报错
处理报错的方法 查看provisioner的pod日志 一个个修改即可
本例yaml配置

#权限设置
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: storagedemoname: endpoint-reader
rules:
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "create", "update", "delete"]  
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-provisioner-storageclass-role
rules:
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "create", "update", "delete"]  
- apiGroups: [""]resources: ["events"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-provisioner-storageclass-binding
subjects:
- kind: ServiceAccountname: defaultnamespace: storagedemo
roleRef:kind: ClusterRolename: nfs-provisioner-storageclass-roleapiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:namespace: storagedemoname: endpoint-reader-binding
subjects:
- kind: ServiceAccountname: defaultnamespace: storagedemo
roleRef:kind: Rolename: endpoint-readerapiGroup: rbac.authorization.k8s.io---#先创建nfs的provisioner
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: storagedemo
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:containers:- name: nfs-client-provisionerimage: 192.168.140.135:5000/nfs-subdir-external-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: "example.com/nfs"  # 存储类名称- name: NFS_SERVERvalue: "192.168.140.129"  # NFS 服务器 IP- name: NFS_PATHvalue: "/root/data/nfs"        # NFS 共享路径volumes:- name: nfs-client-rootnfs:server: 192.168.140.129 # NFS 服务器 IPpath: /root/data/nfs # NFS 共享路径
---
#创建storageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storage-classnamespace: storagedemo
provisioner: example.com/nfs # 存储类名称与provisioner的存储类名称对应
parameters:archiveOnDelete: "false"  # 当 PVC 删除时是否保留 PV---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvcnamespace: storagedemo
spec:storageClassName: nfs-storage-classaccessModes:- ReadWriteManyresources:requests:storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nfsdemo-v1namespace: storagedemolabels:app: nfsdemoversion: v1
spec:replicas: 3selector:matchLabels:app: nfsdemoversion: v1template:metadata:labels:app: nfsdemoversion: v1spec:containers:- name: nfsdemoimage: 192.168.140.135:5000/nfsdemo:v1ports:- containerPort: 6085volumeMounts:- name: nfs-storagemountPath: /root/data  # 容器内的挂载路径volumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:name: nfsdemo-servicenamespace: storagedemo
spec:type: NodePort  # 设置为 NodePort 类型selector:app: nfsdemo  # 与 Deployment 中的 Pod 匹配的标签ports:- port: 6085          # 服务的端口targetPort: 6085    # Pod 中容器的端口
http://www.lryc.cn/news/451541.html

相关文章:

  • Chrome无法拖入加载.crx扩展文件(以IDM为例)
  • 数字教学时代:构建高效在线帮助中心的重要性
  • 828华为云征文|华为云弹性云服务器FlexusX实例下的Nginx性能测试
  • 知识图谱入门——2:技术体系基本概念:知识表示与建模、知识抽取与挖掘、知识存储与融合、知识推理与检索
  • 【不看会后悔系列】排序之——文件归并【史上最全详解】~
  • 安全点的应用场景及其原理详解
  • 计算机各专业2025毕业设计选题推荐【各专业 | 最新】
  • 【Python报错已解决】IndexError: index 0 is out of bounds for axis 1 with size 0
  • SpringGateway(网关)微服务
  • jQuery面试题:(第三天)
  • 聊聊国内首台重大技术装备(2)
  • python 实现rayleigh quotient瑞利商算法
  • Java Web应用升级故障案例解析
  • Java类和对象、自定义包、static、代码块、方法重写
  • 【系统代码】招投标采购一体化管理系统,JAVA+vue
  • 基于yolov8深度学习的120种犬类检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面目标检测狗类检测犬类识别系统
  • UNI-APP_iOS开发技巧之:跳转到TestFlight或者App Store
  • 基于SSM+Vue技术的定制式音乐资讯平台
  • Spring依赖注入和注解驱动详解和案例示范
  • 网络通信——OSPF协议(基础篇)
  • Kubernetes从零到精通(15-安全)
  • 《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版
  • Soar项目中添加一条新的SQL审核规则示例
  • RISC-V开发 linux下GCC编译自定义指令流程笔记
  • java代码是如何与数据库通信的?
  • gateway--网关
  • 北京数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
  • 土地规划与区域经济发展:筑基均衡未来的战略经纬
  • wsl(2) -- ubuntu24.04配置
  • python快速搭建https服务器