Volume简介
Container 中的文件在磁盘上是临时存放的,这会带来两个问题:1)当容器崩溃时文件会丢失;2)同一Pod中运行多个容器并共享文件时,容器重启时状态丢失。Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。
Docker卷的本质是目录,存在与一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过“联合文件系统”提供一些用于持续存储或共享数据的特性。
K8S卷的本质也是目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
Kubernetes中的卷分为两类:临时卷和持久卷。临时卷会遵从 Pod 的生命周期,和Pod一起创建和删除;持久卷的生命周期独立于pod的生命周期。
Kubernetes中常用的卷类型包括:
- configMap:临时卷/投射卷,常用来存储配置数据
- secret:临时卷/投射卷,常用来存储配置数据,使用base64加密数据
- downwardAPI:临时卷/投射卷,让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。
- emptyDir:临时卷,存储pod中的数据,pod删除时数据会被删除
- hostPath:持久卷,将主机节点上的文件或目录挂载到pod中(存在许多安全风险,尽量避免使用)
- local:持久卷,创建pv时指定pv所在节点,使用pvc的pod会被调度到指定节点,将主机节点上的文件或目录挂载到pod中
- nfs:持久卷,将 NFS (网络文件系统) 挂载到的pod中。
- persistentVolumeClaim:持久卷申领,不需要知道持久卷细节。
- projected:投射卷能将多个卷来源映射到同一目录上。
持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。
PVC与PV是一一对应关系,不能一个PVC挂载多个PV,也不能一个PV挂载多个PVC。
参考文档: