【kubernetes】带你了解k8s中PV和PVC的由来

文章目录

      • 1 为什么需要卷(Volume)
      • 2 卷的挂载
        • 2.1 k8s集群中可以直接使用
        • 2.2 需要额外的存储组件
        • 2.3 公有云
      • 2 PV(Persistent Volume)
      • 3 SC(Storage Class) 和 PVC(Persistent Volume Claim)
      • 4 总结

1 为什么需要卷(Volume)

Pod是由一个或者多个容器组成的,在启动Pod中的容器之前,会先创建一个pause容器,再将其他容器加入到pause容器的网络命名空间,因此,多个容器的网络是共享的,pause容器就像是一个宿主机,多个容器就像是宿主机上面的多个进程,既然多个容器共享网络命名空间,那么多个容器肯定就不能监听同一个端口。多个容器由于都有自己的文件系统,因此,多个容器的文件系统肯定是相互隔离的,如果多个容器之间需要共享数据呢?Pod在重建时,Pod中的所有容器都会基于镜像重建,那么,原来的Pod中的容器中的数据都会丢失,但是很多场景下都需要对数据进行持久化保存,例如,mysql的Pod在重建时可不希望保存的数据没有了。

为了解决以上两个问题,k8s提供了数据卷的机制,可以将同一个数据卷挂载到Pod的多个容器,实现多个容器的数据共享;也可以将数据卷对接外部的存储,实现数据的持久化,使得Pod重建或者被删除后,数据不丢失。

2 卷的挂载

一个Pod可以在pod.spec.volumes中声明,使用命令kubectl explain pod.spec.volumes可以发现里面各种类型的卷,看这些卷的类型会发现,有些卷是可以直接在k8s集群中使用的,有些是需要安装额外组件的,还有一些是对接共有云的,因此,每种类型的卷中的参数是不一样的。

2.1 k8s集群中可以直接使用
卷的类型特点特性状态
configMap对接ConfigMap,可以将ConfigMap中的多个KV挂载为容器中的多个文件
downwardAPI对接DownwardAPI,可以将集群的信息挂载为容器中的文件
emptyDir用于多个容器之间的数据共享,相当于将一个空目录分别挂载到Pod的多个容器,它的生命周期与Pod相同,只要Pod在运行,卷就不会被删除
gitRepo从git上clone仓库代码,然后挂载到容器已废弃,建议在initContainer中在emptyDir下载代码
hostPath将宿主机的路径挂载到容器中,这种方式有安全风险,通常不建议使用
persistentVolumeClaim用于将PV挂载到容器中
projected投射卷,可以将多个卷同时挂载到容器中的一个目录,源卷只能是secret、downwardAPI、configMap、serviceAccountToken
sercet将Secret挂载为容器中的文件
2.2 需要额外的存储组件
卷的类型特点特性状态
cephfs对接CephFS1.28版本中废弃,建议使用Ceph CSI第三方存储驱动
cinder对接Openstack Cinder1.11版本中废弃,1.26版本中移除,1.27版本开始可以使用Openstack Cinder第三方驱动程序
fc对接FiberChannel
glusterfs对接GlusterFS1.25版本中废弃,1.26版本中移除
iscsi对接iSCSI
nfs对接NFS
portworxVolume对接Portworx1.25版本中废弃
rdb对接CephFS的rdb1.28版本中废弃
2.3 公有云
卷的类型特点特性状态
awsElasticBlockStore对接AWS EBS1.19版本中废弃,1.28版本中移除,1.28版本开始可以使用AWS EBS第三方存储驱动
azureDisk对接Azure Disk1.19版本中废弃,1.28版本中移除,1.28版本开始可以使用Azure Disk第三方存储驱动
azureFile对接Azure File1.21版本中废弃,1.26版本开始可以使用Azure File第三方存储驱动
gcePersistentDisk对接GCE PersistentDisk1.17版本中废弃
vsphereVolume对接VMWare vsphere VMDK1.28版本可以使用vSphere CSI第三方存储驱动

当在pod.spec.volumes配置使用的卷后,就可以在pod.spec.containers.volumeMounts将卷挂载到容器中,以下以configMap类型的卷为例,将app-config这个ConfigMap挂载到nginx容器的/opt目录:

apiVersion: v1
kind: Pod
metadata:name: test
spec:containers:- name: nginximage: nginxvolumeMounts:- name: my-configmountPath: /opt/volumes:- name: my-config configMap:name: app-config

2 PV(Persistent Volume)

将pod.spec.volumes中配置的卷挂载到容器中,这时候volume是附属于Pod的,volume和Pod就构成了一种静态绑定关系,这对于hostPath、configMap、secret等类型的volume来说是可以的,因为hostPath是对本地目录的挂载,configMap和secret是对ConfigMap和Secret的挂载,这时候ConfigMap/Secret和Pod是同一个人创建的。

当开发人员用这种方式将NFS挂载到容器中:

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: registry.k8s.io/test-webservername: test-containervolumeMounts:- mountPath: /my-nfs-dataname: test-volumevolumes:- name: test-volumenfs:server: my-nfs-server.example.compath: /my-nfs-volumereadOnly: true

此处将my-nfs-server.example.com的/my-nfs-volume目录挂载到test-container容器的/my-nfs-data路径,这里的问题是:当运维部门的同事部署完NFS后,难道还需要将NFS的域名/IP和路径告诉开发人员?但是开发人员实际上并不关心这些,那有没有一种方式可以让开发人员只是使用NFS而不需要关心NFS的具体配置?这就需要使用到PV(持久卷)。

apiVersion: v1
kind: PersistentVolume
metadata:name: my-nfs
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncenfs:path: /tmpserver: 172.17.0.2

上述yaml会创建一个my-nfs的PV,需要注意的是:PV是集群级别的资源。这里用的pv.spec.nfs字段跟pod.spec.volumes.nfs相同,只是多了外层的capacity和accessModes,它们分别表示PV的容量和访问模式。当运维人员部署完成NFS文件系统,就可以直接创建好PV,然后开发人员就可以直接引用该PV。

这样虽然可以解决volume创建和volume使用的问题,如果集群中只有少量的PV时是没有问题的,运维人员是可以手动创建的。如果PV的数量很多呢?当运维人员创建了很多PV后,开发人员难道需要自己从中挑选PV使用吗?那管理的复杂度会非常大,因此,k8s提供了SC和PVC。

3 SC(Storage Class) 和 PVC(Persistent Volume Claim)

独立的PV资源分离了卷的创建和使用,而PVC资源则进一步将卷的使用分为卷的申请和绑定:当用户创建一个PVC,表明要申请一个持久卷,控制器就会去找到合适的PV,然后将PVC的pvc.spec.volumeName设置为PV的名称,同时将PVC的信息写入PV的pv.spec.claimRef,将PV和PVC进行双向关联,这成为动态绑定

那什么才是合适的PV呢?或者说PV满足哪些条件才能被某个PVC进行绑定呢?

在这里插入图片描述

  • 容量:在PVC中是request,表明需要多大容量的PV,在PV中是capacity,表明当前PV的容量
  • 访问模式:accessModes,不同的存储系统有不同的访问特点,有的卷可以被多个Pod同时读写,有的只能以只读方式挂载
  • 存储类:storageClassName,创建PV的存储类型

当根据PVC去查找PV时,就会根据上述三个条件去找到对应的PV完成绑定操作。PVC使得用户选择不用自己去选择PV,而是让控制器帮我们选择合适的PV。

还剩下最后一个问题:PV应该是谁创建的?肯定有一个类似控制器的组件负责创建PV,该控制器能够接收创建PV的请求,根据请求中的参数创建对应规格的持久卷。

k8s可以对接许多不同的外部存储系统,为了区分这些存储系统,k8s提供了StorageClass资源,每个StorageClass代表一个存储系统,为了支持这个存储系统,在k8s中还会有一个provisoner的组件,它通过CSI接口与外部存储系统进行通信,负责PV的管理。

在这里插入图片描述

下面数理下整体的工作流程:

  • 用户创建PVC,说明要申请一个PV,此时的PVC的状态是Pending
  • provisioner监听到PVC的创建时,会根据PVC的参数调用CSI接口创建PV,此时PV的状态是Available,表明未被绑定
  • 控制器监听到PV的创建,并发现未被绑定的PVC,就会将二者进行绑定
  • 将PV挂载到容器中使用

下面的PVC申请2G大小的nfs存储卷:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2GistorageClassName: nfs

而在SC中:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfsannotations:storageclass.kubernetes.io/is-default-class: "true"   ## 是否设置为默认的storageclass
provisioner: nfs.csi.k8s.io
parameters:archiveOnDelete: "true"                                  ## 设置为"false"时删除PVC不会保留数据,"true"则保留数据
mountOptions: - hard                                                   ## 指定为硬挂载方式- nfsvers=4 

上面的PVC指定storageClassName为nfs,表明要向nfs申请卷,下面的SC由于有is-default-class的annotations,它就是默认的SC,当PVC未指定storageClassName时,就会向nfs申请卷。SC中有个参数是provisioner,是provisioner的标识字符串,通常是csidriver驱动程序的名称,可以通过kubectl get csidrivers命令查询。

4 总结

本文介绍了k8s中的PV、PVC、SC等资源以及它们的出现分别解决了什么问题,并对资源的yaml文件的一些字段进行了解释。

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

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

相关文章

Python1-Pillow库简单使用

Python1-Pillow库简单使用 1.安装pillow2.打开和显示图像3.图像基本操作4.批量图像格式转换 save5.批量创建缩略图 thumbnail6.批量图像加文字、图片水印 blend composite7.批量调整图像大小resize 1.安装pillow # pip安装或者conda安装 conda install pillow2.打开和显示图像…

JavaScript中的模块化编程,包括CommonJS和ES6模块的区别。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化编程概述⭐ CommonJS 模块⭐ ES6 模块⭐ 区别⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、…

git的基础操作

https://blog.csdn.net/a18307096730/article/details/124586216?spm1001.2014.3001.5502 1:使用场景 SVN,如果服务器里面的东西坏掉了,那么就全线崩盘了。 1:基本配置 git config --global user.name “luka” (自己的名字就行) git co…

Linux 网络驱动实验

本文章对Linux 网络驱动实验中的设备树进行介绍,Linux网络驱动程序比较复杂,只要学会应用。 1、I.MX6ULL 网络外设设备树 I.MX6ULL 有两个 10/100M 的网络 MAC 外设,因此 I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。 fec1…

一篇短小精悍的文章让你彻底明白KMP算法中next数组的原理

以后保持每日一更,由于兴趣较多,更新内容不限于数据结构,计算机组成原理,数论,拓扑学......,所谓:深度围绕职业发展,广度围绕兴趣爱好。往下看今日内容 一.什么是KMP算法 KMP&#x…

ARM-day5作业

.text .global _start _start: 1、设置GPIOE、GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2、设置PE10、PF10、PE8管脚为输出模式 GPIOE_MODER[21:20]->01 0x50006000…

Windows环境下下载安装Elasticsearch和Kibana

Windows环境下下载安装Elasticsearch和Kibana 首先说明这里选择的版本都是7.17 &#xff0c;为什么不选择新版本&#xff0c;新版本有很多坑&#xff0c;要去踩&#xff0c;就用7就够了。 Elasticsearch下载 Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;最初由…

SparkSQL 外部数据源

1.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景。 - CSV - JSON - Parquet - ORC - JDBC/ODBC connections - Plain-text files 1.2 读数据格式 所有读取 API 遵循以下调用格式: // …

基于SVM+TensorFlow+Django的酒店评论打分智能推荐系统——机器学习算法应用(含python工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境方法一方法二 安装其他模块安装MySQL 数据库 模块实现1. 数据预处理1&#xff09;数据整合2&#xff09;文本清洗3&#xff09;文本分词 相关其它博客工程源代码下载其它资料下载 前言 本项目以支…

C++对象模型(7)-- 数据语义学:成员变量偏移值、地址

1、成员变量偏移值 &#xff08;1&#xff09; 成员变量偏移值&#xff0c;就是指这个成员变量的地址离对象首地址偏移了多少字节&#xff0c;这个偏移值在编译完成后是不变的。 class Base { public:int b_i;int b_j; };int main() {Base base;printf(" b_i的偏移值:%…

关于深拷贝和浅拷贝你需要了解的内容

深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是在复制对象或数据结构时使用的两种不同的策略&#xff0c;它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。 浅拷贝&#xff1a; 浅拷贝创建一个新对象&#xff…

C#WPF属性元素语法应用实例

本文介绍C#WPF属性元素语法应用实例 一、属性元素语法 对于对象元素的某些属性,无法使用特性语法(比如:Background="Blue"),因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语…

计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)

文档编辑平台&#xff08;SpringBootVueMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的…

Linux 基金会分叉 Terraform,正式推出 OpenTofu

Linux 基金会宣布推出 OpenTofu&#xff0c;这是一个 Terraform 的开源替代方案&#xff0c;并且分叉自 Terraform。OpenTofu 原名 OpenTF&#xff0c;为所有人提供了一个在中立治理模式下的可靠的开源替代方案。 Terraform 是 HashiCorp 开源的一个安全和高效的用来构建、更改…

内网渗透——哈希传递

文章目录 哈希传递1. 概念1.1 LM1.2 NTLM 2. 原理3. 利用3.1 hash传递浏览上传文件3.2 hash传递获取域控RDP 4. 总结 哈希传递 哈希传递攻击&#xff08;Pass The Hash&#xff09;是基于 NTLM 认证缺陷的一种攻击方式&#xff0c;攻击者可以利用用户的密码哈希值来进行 NTLM …

Linux- 使用ssh远程连接

1. Linux上安装ssh 如果在Linux系统上运行sudo service ssh status提示Unit ssh.service could not be found.&#xff0c;这意味着SSH服务没有安装或者它可能在系统上有一个不同的服务名称。 下面&#xff0c;我们来介绍ssh的安装步骤&#xff1a; 安装SSH服务: 在不同的Lin…

提升微信小程序MAU,这些方法你需要落地执行

面对激烈的微信小程序竞争,如何提升微信小程序的月活跃用户量(MAU)是每个小程序运营者需要思考的问题。经过分析,提升微信小程序MAU可以从以下几个方面着手。更多提升微信小程序MAU相关&#xff0c;可某薇找我名字。 提升微信小程序MAU 第一,丰富小程序功能,提升用户黏性。可以…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

GPU问题:Unable to determine the device handle for gpu: Unknown Error

问题 linux服务器使用nvidia-smi出现 ((Unknown Error)) &#xff0c;无法识别到对应bus-id的设备。 Unable to determine the device handle for gpu 0000:49:00.0: Unknown Error解决 可以重启解决&#xff0c;重新识别bus-id对应的设备。 我们的服务器可能是由于0号卡过热…

笔记34:转置卷积 Transposed Convolution 的由来

注&#xff1a;该文章为视频课的笔记补充 视频课&#xff1a;转置卷积&#xff08;transposed convolution&#xff09;_哔哩哔哩_bilibili 更详细的推导在&#xff1a;抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09;_逆卷积-CSDN博客 a a a 补充1…