一、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.2HostPath

生命周期:与节点相关。

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

三、PV、PVC和StorageClass

3.1 介绍

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

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

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

3.2CSI

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

3.3PV

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.4PVC

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

创建PVC并查看。

3.5StorageClass

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

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

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

四、Pod中使用PVC

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