k8s-持久化存储

一、Volume

容器中的文件是临时存储在磁盘中的,容器被删除后文件也会被删除,多个容器在一个Pod中时,多个容器需要共享一些磁盘数据。因此k8s提供Volume解决数据共享和持久化问题。k8s的Volume是Pod的一部分,不能单独创建,需要在Pod中定义。

Pod中所有容器都能访问Volume,但是必须挂载,可以挂载到任意目录。如下:通过Volume实现容器资源共享。Volume的生命周期与挂载它的Pod相同,但是Volume里面的文件可能在Volume消失后仍然存在,这取决于Volume的类型。

二、Volume 类型

Kubernetes的Volume有非常多的类型,在实际使用中使用最多的类型如下。

  • emptyDir:一种简单的空目录,主要用于临时存储。
  • hostPath:将主机某个目录挂载到容器中。
  • ConfigMap、Secret:特殊类型,将Kubernetes特定的对象类型挂载到Pod,在ConfigMap和Secret章节介绍过如何将ConfigMap和Secret挂载到Volume中。
  • persistentVolumeClaim:PVC,Kubernetes的持久化存储类型,详细介绍请参考PV、PVC和StorageClass中会详细介绍。

2.1 EmptyDir

2.1.1 生命周期与用途

生命周期:与Pod一致,Pod删除后也跟着删除

用途:1、缓存空间,例如基于磁盘的归并排序。

2、为耗时较长的计算任务提供检查点,以便任务能从崩溃前状态恢复执行。

2.1.2 创建yaml

emptyDir实际是将Volume的内容写在Pod所在节点的磁盘上,另外emptyDir也可以设置存储介质为内存,如下所示,medium设置为Memory。

2.2 HostPath

生命周期:与节点相关。

应用场景:HostPath不适合跨节点数据存储。

三、PV、PVC和StorageClass

3.1 介绍

网络存储,一般云厂商可提供块存储、文件存储、对象存储三种。

  • PV:PV描述的是持久化存储卷 ,主要定义的是一个持久化存储在宿主机上的目录,比如一个NFS的挂载目录。
  • PVC:PVC描述的是Pod所希望使用的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。

PV是实际存储数据目录,PVC是对数据存储的声明。Pod的Volume通过PVC绑定PV实现持久化存储。

3.2 CSI

Kubernetes提供了CSI接口(Container Storage Interface,容器存储接口),基于CSI这套接口,可以开发定制出CSI插件,从而支持特定的存储,达到解耦的目的。如Namespace:资源分组中看到的kube-system命名空间下everest-csi-controller和everest-csi-driver就是CCE开发存储控制器和驱动。有了这些驱动就可以使用EVS、SFS、OBS存储。

3.3 PV

PV是如何描述持久化存储,例如在SFS中创建了一个文件存储,这个文件存储ID为68e4a4fd-d759-444b-8265-20dc66c8c502,挂载地址为sfs-nas01.cn-north-4b.myhuaweicloud.com:/share-96314776。如果想在CCE中使用这个文件存储,则需要先创建一个PV来描述这个存储,如下所示。

NFS(Network File System)是一种分布式文件系统协议,它允许计算机之间共享文件和目录。在Kubernetes中,NFS可以作为持久化存储的一种解决方案,用于提供容器持久化存储 。

要在Kubernetes中配置NFS卷,你需要创建一个Persistent Volume Claim(PVC)来请求一个NFS卷,并在Pod的定义中使用VolumeMounts来挂载该卷

3.4 PVC

PVC可以绑定一个PV,示例如下。

创建PVC并查看。

3.5 StorageClass

简化PV的一种形式,使用StorageClass创建PVC。

NAS:是一种专门设计用于通过网络提供数据存储和管理的设备。

NAS和NFS区别:**NAS是一种设备,而NFS是一种协议。NAS可以支持多种协议,其中之一就是NFS。**NAS设备通常作为独立的存储解决方案,而NFS可以部署在服务器上以实现文件共享。

四、Pod中使用PVC

有了PVC后,在Pod中使用持久化存储就非常方便了,在Pod Template中的Volume直接关联PVC的名称,然后挂载到容器之中即可,如下所示。甚至在StatefulSet中还可以直接声明PVC,详情请参见有状态负载(StatefulSet)。

相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)3 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21