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

2024-09-02 06:44

本文主要是介绍【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 动态供给》

这篇关于【Kubernetes】持久卷的动态供给 Dynamic Provisioning的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129286

相关文章

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P