NFS动态存储实战案例

news/2025/1/24 10:28:30/文章来源:https://www.cnblogs.com/lin-strive/p/18689168

NFS动态存储实战案例

Kubernetes 不包含内部 NFS 驱动。你需要使用外部驱动为 NFS 创建 StorageClass。

卷插件 内置配置器 配置示例
AzureFile Azure File
CephFS - -
FC - -
FlexVolume - -
iSCSI - -
Local - Local
NFS - NFS
PortworxVolume Portworx Volume
RBD Ceph RBD
VsphereVolume vSphere
1、开放后端存储NFS
[root@web04 ~]# mkdir -pv /kubelet/storage_class
[root@web04 ~]# tail -n1 /etc/exports
/kubelet/storage_class 10.0.0.0/24(rw,sync,no_root_squash,no_subtree_check)
[root@web04 ~]# systemctl restart nfs-server.service
[root@web04 ~]# exportfs
/kubelet/storage_class10.0.0.0/24
2、部署NFS驱动器支持SC功能
[root@k8smaster01 ~]# git clone https://gitee.com/yinzhengjie/k8s-external-storage.git
[root@k8smaster01 ~]# cd k8s-external-storage/nfs-client/deploy/# 修改配置文件
[root@k8smaster01 deploy]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisioner# image: quay.io/external_storage/nfs-client-provisioner:latestimage: registry.cn-hangzhou.aliyuncs.com/k8s_study_rfb/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs- name: NFS_SERVERvalue: 10.0.0.2- name: NFS_PATHvalue: /kubelet/storage_classvolumes:- name: nfs-client-rootnfs:server: 10.0.0.7path: /kubelet/storage_class#修改动态存储类配置文件
[root@k8smaster01 deploy]# cat class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:# archiveOnDelete: "false"archiveOnDelete: "true"#应用动态存储类
[root@k8smaster01 deploy]# kubectl apply -f class.yaml && kubectl get sc
storageclass.storage.k8s.io/managed-nfs-storage created
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  0s[root@k8smaster01 deploy]# kubectl get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  10m
3、应用RBAC角色
[root@k8smaster01 deploy]# cat rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
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-provisioner# replace with namespace where provisioner is deployednamespace: default
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-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io#应用RBAC授权角色
[root@k8smaster01 deploy]#  kubectl apply -f rbac.yaml#应用NFS动态存储配置器
[root@k8smaster01 deploy]# kubectl apply -f deployment.yaml[root@k8smaster01 deploy]# kubectl get pods,sc
NAME                                          READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-5db5f57976-ghs8l   1/1     Running   0          4sNAME                                              PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  11m
4、测试动态存储类
# PVC配置文件
[root@k8smaster01 deploy]# cat test-claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim#以注解的方式指定sc资源annotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Mi#Pod配置文件
[root@k8smaster01 deploy]# cat test-pod.yaml
kind: Pod
apiVersion: v1
metadata:name: test-pod
spec:containers:- name: test-podimage: busyboxcommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim
[root@k8smaster01 deploy]# kubectl apply -f test-claim.yaml -f test-pod.yaml#后端存储目录
[root@web04 ~]# ll /kubelet/storage_class/
total 0
drwxrwxrwx 2 root root 21 Dec 11 15:29 default-test-claim-pvc-72dca5dd-eb1e-4826-a18a-0773acfe55cf
[root@web04 ~]# ll /kubelet/storage_class/default-test-claim-pvc-72dca5dd-eb1e-4826-a18a-0773acfe55cf/
total 0
-rw-r--r-- 1 root root 0 Dec 11 15:29 SUCCESS

image-20241211153103798

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

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

相关文章

为什么Claude AI在与ChatGPT的竞争中落后——尽管产品更优越

Claude广告由Anthropic开发的Claude AI因其技术能力受到赞誉,有些用户声称它在上下文理解和处理更大文本输入方面优于ChatGPT。然而,一个强大的产品并不一定能直接转化为市场主导地位。尽管Claude AI具有潜力,但在ChatGPT主导的竞争市场中,它却难以获得关注。 问题不在于技…

STM32 IAP(OTA)

一、背景知识STM32启动流程(从内部flash启动)[1]正常情况下,程序从Flash启动时的流程如下:(转载自) https://blog.csdn.net/qq_42190402/article/details/139671333程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。(0x0800 0004处是中断向量表的起始地址,也…

稀疏基因组学:大规模基因组分析的新范式

随着基因测序技术的飞速发展,我们面临着一个巨大的挑战:如何高效地处理和分析海量的基因组数据。 2025年1月21日,发表在《Nature Communications》上的一篇论文提出了一个名为“稀疏化基因组学”(Sparsified Genomics)的新概念,通过系统性地排除基因组序列中的大量碱基,…

【译】我们最喜欢的2024年的 Visual Studio 新功能

去年,Visual Studio 团队发布了许多新的面向开发人员的改进和 AI 集成,其中许多直接来自您在开发者社区的反馈。在这篇文章中,我们将重点介绍2024年团队最喜欢的功能,这些功能可以提高生产力,简化工作流程,并增强您的编码体验。让我们开始吧! 图像悬停预览:立即看到您的…

如何修改PHP网站的名称,以确保名称准确且符合品牌形象?

修改PHP网站的名称是一个重要的任务,它不仅关系到网站的准确性和专业性,还影响到用户体验和品牌形象。以下是详细的步骤和建议:备份现有文件:在进行任何修改之前,务必备份网站的原始文件和数据库,以防止意外情况发生。 确定修改位置:通常,网站名称位于模板文件中,如he…

【分享】晶尊微MC802:打造炫酷触控发光方案,轻松点亮创意未来

MC802 带 2 个自校正容性触摸按键功能和 4 个 I/O 口的单片机,是以 EPROM 作为记忆体的 8 位微控制器,专为多 IO 产品的应用而设计。最近,科技圈出现这样一个好东西。它不仅能随时为手机、耳机等充电设备提供应急充电,还能瞬间变身露营灯、氛围灯、台灯,满足不同场景下的需…

二-2、代码生成-swagger

地址 http://192.168.0.115:39999/swagger-ui.html?docExpansion=none/ 位置步骤配置数据库数据Cb-SYSMICROSERVICE(微服务)Cb-SYSRELATIONTABLE(表)生成代码传参 { "author": "jmc",--作者 "lngmsid": 207,--SYSMICROSERVICE表ID "ln…

为什么PHP无法正常修改网站?

PHP无法正常修改网站可能有多种原因,以下是一些常见的问题和解决方法:文件权限问题:确保PHP脚本有足够的权限来修改网站文件。检查文件和文件夹的权限设置,确保PHP进程有权读取、写入和执行相关文件。路径问题:确认PHP脚本中使用的文件路径是正确的。如果路径错误,PHP将无…

如何修改后台网站底部信息?

要修改后台网站底部信息,通常可以按照以下步骤进行:登录到后台管理系统:使用管理员账号和密码登录到网站的后台管理系统。找到页面编辑功能:在后台管理系统中,找到可以编辑页面内容的功能或模块。这可能是一个可视化编辑器、HTML编辑器或其他类似的工具。定位到底部区域:…

如何修改PHP网站的页面内容?

要修改PHP网站的页面内容,通常可以按照以下步骤进行:确定要修改的页面:首先,明确您想要修改的具体页面。这可能是首页、产品页面、文章页面等。找到页面文件:根据页面的类型和位置,找到对应的PHP文件。这些文件通常位于网站的根目录或特定的文件夹中。备份文件:在进行任…

Vite + Vue/React:用 import.meta 解决图片路径问题

在 Vite 中开发 Vue 和 React 项目时,import.meta.url 是一个非常有用的工具,它可以帮助我们动态获取模块的路径,进而处理静态资源(如图片)的加载路径。本文将结合实际例子,展示如何使用 import.meta.url 动态切换图片。 一. import.meta.url 是什么? import.meta 是 EC…

天通ERP S系列如何设置根据不同字段区分商品显示汇总,且在两个表中显示

展示效果:操作方式: 1、任我行打印管理器,点击右上角添加公式按钮,添加一个字段名称为空、字符类型为字符数据,且表达内容为空的公式字段保存(英文输入法下两个’’)2、在表头的最后添加一列,绑定刚才添加的空的公式字段,并绑定新增的字段为分单总计 且该字段取消显示边框 3、…