一、什么是Volume¶
Kubernetes的Volumes是一个对存储资源的抽象,属于Pod级别的一个配置字段。
对于大多数项目而言,数据文件的存储是非常常见的需求,比如存储用户上传的头像、上传的文件以及数据库的数据。在Kubernetes中,由于应用的部署具有高度的可扩展性和编排能力(不像传统架构部署在固定的位置),因此把数据存放在本地是非常不可取的,这样做也无法保障数据的安全。
卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们的容器镜像的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。
卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。
卷不能挂载到其他卷之上(不过存在一种使用 subPath的相关机制),也不能与其他卷有硬链接。
Volumes在Pod中绑定多个、多种的数据类型,比如NFS、NAS、CEPH等,这些绑定的数据,可以挂载到Pod中的一个或多个容器中,从而实现容器的数据持久化和数据共享。
二、为什么要引入Volume¶
引入Volume的原因主要有两点:
-
Kubernetes卷具有明确的生命周期,与使用它的Pod相同。因此,在Kubernetes中的卷可以比Pod中运行的任何容器生命周期都长,并且可以在容器重启或者销毁之后保留数据。Kubernetes支持多种类型的卷,并且Pod可以同时使用任意数量的卷。
-
当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决
三、Volume类型有哪些¶
官网链接:https://kubernetes.io/docs/concepts/storage/volumes/
在传统架构中,企业内可能有自己的存储平台,比如NFS、Ceph、GlusterFS、Minio等。如果读者的环境在公有云,可以使用公有云提供的NAS、对象存储等。在Kubernetes中,Volume也支持配置以上存储,用于挂载到Pod中实现数据的持久化。Kubernetes Volume支持的卷的类型有很多,以下为常用的卷:
- CephFS
- GlusterFS
- ISCSI
- Cinder
- NFS&NAS:网络文件系统,主要用于挂载远程存储到容器中,实现跨主机的数据共享和持久化
- RBD
- HostPath:节点数据共享,HostPath可以让容器直接访问节点上的文件或目录,常用于和节点共享数据
当然,也支持一些Kubernetes独有的类型:
- ConfigMap:用于存储配置文件
-
Secret:用于存储敏感数据
-
EmptyDir:临时目录,当Pod从节点删除时,EmptyDir中的数据也会被删除,常用于临时数据存储,如缓存、中间计算结果、数据共享等
- PersistentVolumeClaim:对PersistentVolume的申请
- Downward API:元数据挂载,主要用于容器访问Pod的一些元数据,比如标签、命名空间等
四、Volume如何使用¶
本文通过几个比较常用的类型的Volume配置演示一下Volume的使用
- 示例1---通过emptyDir共享数据
- 示例2---使用HostPath挂载宿主机文件
- 示例3---挂载NFS至容器