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,在ConfigMapSecret章节介绍过如何将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)

相关推荐
阿里云云原生1 天前
研发视角的新突破:当 AI Coding 工具集成全域运维诊断,排查线上故障只需 3 分钟
云原生
小猿姐2 天前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生
阿里云云原生2 天前
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
云原生·agent
阿里云云原生3 天前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang4534 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4534 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4534 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生4 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生4 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事6 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes