【Kubernetes】持久卷的动态供给 Dynamic Provisioning

持久化存储》系列,共包含以下文章:

  • K8s 持久化存储方式
  • 持久卷 PV
  • 持久卷声明 PVC
  • 持久卷的动态供给 Dynamic Provisioning

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

持久卷的动态供给 Dynamic Provisioning

  • 1.搭建 NFS 服务
  • 2.创建 RBAC 权限
  • 3.部署 NFS Provisioner
  • 4.创建 StorageClass
  • 5.创建 PVC,自动关联 PV
  • 6.创建 Pod,测试数据是否持久

Kubernetes 提供了一套可以自动创建 PV 的机制,即 Dynamic Provisioning。而这个机制的核心在于 StorageClass 这个 API 对象。

StorageClass 对象会定义下面两部分内容:

  • PV 的属性。比如,存储类型、Volume 的大小等。
  • 创建这种 PV 需要用到的存储插件。

有了这两个信息之后,Kubernetes 就能够根据用户提交的 PVC,找到一个对应的 StorageClass,之后 Kubernetes 就会调用该 StorageClass 声明的存储插件,进而创建出需要的PV。

🚀 但是其实使用起来是一件很简单的事情,你只需要根据自己的需求,编写YAML文件即可,然后使用 kubectl create 命令执行即可。

在一个大规模的 Kubernetes 集群里,可能有成千上万个 持久卷声明PVC),这就意味着运维人员必须实现创建出这个多个 持久卷PV)。此外,随着项目的需要,会有新的 PVC 不断被提交,那么运维人员就需要不断的添加新的、满足要求的 PV,否则新的 Pod 就会因为 PVC 绑定不到 PV 而导致创建失败。而且通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求。

而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass

通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。

PV 对象和 PVC 对象可以通过 存储类 storageClass 实现自动的匹配和绑定。因此,存储类 storageClass 可以实现 PV 资源的动态供给,它是 PV 资源分配的一种策略。

基于存储类 storageClasss 实现持久卷的动态供给的过程如下图所示。
在这里插入图片描述

下面来演示如何实现持久卷的动态供给。

1.搭建 NFS 服务

apt install -y nfs-kernel-server
mkdir /nfs
echo "/nfs *(rw,sync,no_root_squash)" > /etc/exports
systemctl restart nfs-kernel-server
systemctl status nfs-server

在这里插入图片描述

🌞 更多详情可参考我的这篇博客《Ubuntu 安装 NFS 步骤详解》。

2.创建 RBAC 权限

vim nfs-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: ["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-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
kubectl apply -f nfs-rbac.yaml

在这里插入图片描述

3.部署 NFS Provisioner

要使用 StorageClass,我们就得安装对应的 自动配置程序,比如我们这里存储后端使用的是 NFS,那么我们就需要使用到一个 nfs-client-provisioner 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 NFS 服务器,来自动创建持久卷,也就是自动帮我们创建 PV。

在这里插入图片描述
nfs-client-provisioner 是一个 Kubernetes 的简易 NFS 的外部 Provisioner,本身不提供 NFS,需要现有的 NFS 服务器提供存储。

在这里插入图片描述

🚀 注意:地址和目录要改成实际的 NFS 服务对应配置。

vim nfs-provisioner-deploy.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-provisionerimage: k8s.gcr.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: 172.30.1.2  - name: NFS_PATHvalue: /nfsvolumes:- name: nfs-client-rootnfs:server: 172.30.1.2path: /nfs
  • 存储类 StorageClass 需要使用 provisioner(制备器)字段来决定使用哪个卷插件来创建 PV。制备器字段必须指定。nfs-provisioner-deploy.yaml 文件通过创建制备器来提供基于 NFS 的 PV 存储方式。
  • 这里使用 k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 镜像作为 NFS Server 的客户端程序来访问 NFS。
kubectl apply -f nfs-provisioner-deploy.yaml 
kubectl get pods

在这里插入图片描述

4.创建 StorageClass

vim storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-provisioner-storageannotations:storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:archiveOnDelete: "false"pathPattern: "${.PVC.namespace}/${.PVC.name}"
  • metadata.name:PVC 申请时需明确指定的 storageclass 名称。
  • provisioner:制备器名称,必须和上面创建的 PROVISIONER_NAME 保持一致。
  • parameters.archiveOnDelete:如果值为 false,删除 PVC 后也会删除目录内容;值为 true 则会对数据进行保留。
  • parameters.pathPattern:创建目录路径的模板,默认为随机命名。
kubectl apply -f storageclass.yaml

查看创建的存储类 storageClass。

kubectl get storageclass

🚀 该命令可以简写成以下形式:kubectl get sc

输出的信息如下:

在这里插入图片描述

5.创建 PVC,自动关联 PV

编辑 nfs-pvc-test.yaml 文件创建测试的 PVC 对象,以检测存储类 storageClass 能否正常工作。

vim nfs-pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc-test
spec:storageClassName: "nfs-provisioner-storage"accessModes:- ReadWriteManyresources:requests:storage: 0.5Gi
kubectl apply -f nfs-pvc-test.yaml

查看 Deploy、Pod、SC 和 PVC 的信息。

kubectl get deploy,pod,sc,pvc

在这里插入图片描述

🚀 可以看到,PVC 已经绑定成功。

kubectl describe pv pvc-6f1a4f2d-5db9-4c08-bed7-9ce84e2472b6

在这里插入图片描述

6.创建 Pod,测试数据是否持久

编辑 nginx-pvc-test.yaml 文件创建 Pod 来使用 PVC 资源。

vim nginx-pvc-test.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-sc
spec:containers:- name: nginximage: nginxvolumeMounts:- name: nginx-pagemountPath: /usr/share/nginx/htmlvolumes:- name: nginx-pagepersistentVolumeClaim:claimName: nfs-pvc-test
kubectl apply -f nginx-pvc-test.yaml 

查看 Deploy、Pod、SC 和 PVC 的信息。

kubectl get deploy,pod,sc,pvc

在这里插入图片描述

在 master 节点 NFS Server 的共享目录 /nfs/default/nfs-pvc-test 下,创建数据文件 data.txt

echo hello world > /nfs/default/nfs-pvc-test/data.txt

🚀 由于 Kubernetes 实现了持久卷的动态供给,并将 NFS 作为存储的方式,因此,即使没有指定存储路径,也会在 NFS Server上自动为 PVC 创建存储的目录。

进入 Pod 中观察是否能够访问新创建的文件。

kubectl exec -it pod/nginx-sc sh

输出的信息如下:

在这里插入图片描述


参考:《Kubernetes 数据持久化 StorageClass 动态供给》

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

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

相关文章

C++实现文件加解密及OllyDbg逆向

一.PE病毒和WannaCry勒索蠕虫 1.PE病毒 什么是PE病毒? PE病毒是以Windows PE程序为载体,能寄生于PE文件或Windows系统的病毒程序。PE病毒数量非常之多,包括早起的CIH病毒,全球第一个可以破坏计算机硬件的病毒,它会破…

Linux和Unix的区别及为什么鸿蒙系统不用Unix的原因

目录 Linux是什么? Unix是什么? 他们的区别: 鸿蒙系统介绍及鸿蒙系统不用Unix的原因 Linux是什么? Linux的历史可以追溯到1991年,由芬兰的计算机科学家林纳斯托瓦兹(Linus Torvalds)为了学习操作系统的工作原理而…

计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的豆瓣电子图书数…

计算机毕业设计Hadoop+Spark抖音可视化 抖音舆情监测 预测算法 抖音爬虫 抖音大数据 情感分析 NLP 自然语言处理 Hive 机器学习 深度学习

技术栈:数据分析Spark、数据库Hive MySQL、服务器djano、爬虫requests jieba库中文分词,通俗来说,就是将一句(段)话按一定的规则(算法)拆分成词语、成语、单个文字。 中文分词是很多应用技术的前置技术,如搜索引擎、机器翻译、词…

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

C#上位机采用数据库操作方式对Excel或WPS表格进行读取操作

C#采用数据库操作方式对Excel或WPS表格进行读取操作 1、创建连接字符串并编写一个进行数据库操作的方法 public class OleDbHelper{//创建连接字符串private static string connString "ProviderMicrosoft.ACE.OLEDB.12.0;Data Source{0};" "Extended Propert…

tecplot宏批量导入数据

Tecplot新手进阶——使用tecplot宏操作批量处理数据输出图片(详细步骤) tecplot 宏的使用方法及代码改写 第一步:首先点击Scripting–>Record Macro,生成一个脚本文件,即.mcr文件 点击保存,会出现这个…

SpringBoot实战:Spring Boot项目使用SM4国密加密算法

引言 在业务系统构建与部署的环节中,数据库作为核心存储组件,其连接信息的安全至关重要。通常情况下,这些敏感信息,如数据库密码,会直接以明文形式存储在YAML配置文件中,这无疑增加了信息泄露的风险。为有效…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统): 1、活动类型:答题、图片展示、签到、抽奖、组团等活动 2、活动介绍: a、答题活动: 第一种是签到后,随机抽取10道题,答对8到就可以抽奖; 第二种是随机抽取一道题&#xff0…

Call openai-node in the backend or call https in the frontend?

题意:在后端调用 openai-node 还是在前端调用 https? 问题背景: I have a web application by ReactJS and Nodejs. This application calls OpenAI APIs. 我有一个使用 ReactJS 和 Node.js 开发的 Web 应用程序。这个应用程序调用 OpenAI …

UE5开发——射击武器类拾取

整体框架: 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能,您可以遵循以下步骤: ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类,继承自 AActor 或者 AStaticMeshActor。…

串口助手使用和插入usb转TTL的COM口识别问题

问题出现原因 由于串口调试中经常需要通过断电对单片机烧录程序,所以制作了一个转接带开关的USB 转接口,如下图所示,其中按键控制的是OUT口的电源通断。但为了能够数据传输,有两根传输数据的线是一直连接的。在使用usb进行程序烧…

什么是EDR、NDR、MDR、XDR?他们之间什么区别?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 概述 EDR是什…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件,可在任何Mac上运行Windows,体验不同操作系统之间的无缝集成,并具有创新设计和增强功能,如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外,它还支持运行更多Windo…

EasyExcel动态映射Excel数据到任意实体类教程

在使用EasyExcel进行Excel导入时,我们经常需要将Excel中的数据映射到Java实体类中。如果Excel的列名是固定的,我们可以通过ExcelProperty("列名")注解直接在实体类中指定列名。但如果Excel的列名不固定,或者我们希望根据Excel的第一…

【Unity实战】Visual Studio Debug失败

Visual Studio,就像以前Eclipse在Java领域中的地位一样,至少在Jetbrains人人皆爱之前,它是主流。可能对于当下来说显得臃肿,而且没有Jetbrains智能准确的代码分析提示,但是依旧能用。而且开大工程来说,至少…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

Jupyter如何使用Anaconda的虚拟环境

Anaconda的虚拟环境大家应该都知道是什么,我们可以建立多个虚拟环境并在对应的环境中安装不同的python三方库从而运行不同的python项目,那么在jupyter中如何使用Anaconda的虚拟环境呢,今天就为大家分享一个这样的操作教程。 请参考图文进行以…

实用好软-----电脑端 开源的视频无损剪切与合并工具

这个是一个开源项目LosslessCut 无损剪切就是基于关键帧的剪切,不需要重编码,因此速度非常快, 缺点就是切割时间无法达到非常精确,可能前后会有几秒的差距, 要做到精确的剪切,只能重编码。 LosslessCut在切…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例(vscode为例) 2.2 断言机制(重要) 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…