pod中的每个容器都有自己独立的文件系统,因为文件系统来自容器镜像。
在某些场景下,我们可能希望新的容器可以在之前容器结束的位置继续运行,比如在物理机上重启进程。可能不需要(或者不想要)整个文件系统被持久化,但又希望能保存实际数据的目录。
Kubernetes
通过定义存储卷来满足这个需求,它们不像pod这样的顶级资源,而是被定义为pod的一部分,并和pod共享相同的生命周期。这意味着在pod启动时创建卷,并在删除pod时销毁卷。因此,在容器重新启动期间,卷的内容将保持不变,在重新启动容器之后,新容器可以识别前一个容器写入卷的所有文件。另外,如果一个pod包含多个容器,那这个卷可以同时被所有的容器使用。
1 可用的卷类型
emptyDir
——用于存储临时数据的简单空目录。hostPath
——用于将目录从工作节点的文件系统挂载到pod中。gitRepo
——通过检出Git仓库的内容来初始化的卷。nfs
——挂载到pod中的NFS共享卷。gcePersistentDisk
(Google高效能型存储磁盘卷)、awsElastic BlockStore
(Amazon Web 服务弹性块存储卷)、azureDisk
(Microsoft Azure 磁盘卷)——用于挂载云服务商提供的特定存储类型。cinder
、cephfs
、iscsi
、flocker
、glusterfs
、quobyte
、rbd
、flexVolume
、vsphere-Volume
、photonPersistentDisk
、scaleIO
——用于挂载其他类型的网络存储。configMap
、secret
、downwardAPI
——用于将Kubernetes
部分资源和集群信息公开给pod的特殊类型的卷。persistentVolumeClaim
——一种使用预置或者动态配置的持久存储类型。
2 通过卷在容器之间共享数据
2.1 使用emptyDir
卷
-
在pod中使用
emptyDir
卷 -
创建pod
-
查看pod状态
$ kubectl port-forward fortune 8080:80
将端口从本地机器转发到pod$ curl http://localhost:8080
-
指定用于
EMPTYDIR
的介质
2.2 使用Git仓库作为存储卷
对Github
项目中的文件进行修改后,这些更改在web服务器上不可见,因为gitrepo
卷与Git
仓库未能保持同步,可以通过再次访问pod
来确认这一点。要查看新版本的站点,需要删除pod
并重建,每次进行更改时,没必要每次都删除pod
,可以运行一个附加进程(sidecar容器
)来使卷与Git
仓库保持同步。
3 访问工作节点文件系统上的文件
3.1 介绍hostPath
卷
hostPath
卷指向节点文件系统上的特定文件或目录。在同一个节点上运行并在其hostPath
卷中使用相同路径的pod可以看到相同的文件。
hostPath
卷是我们介绍的第一种类型的持久性存储,因为gitRepo
和emptyDir
卷的内容都会在pod被删除时被删除,而hostPath
卷的内容则不会被删除。如果删除了一个pod,并且下一个pod使用了指向主机上相同路径的hostPath
卷,则新pod将会发现上一个pod留下的数据,但前提是必须将其调度到与第一个pod相同的节点上。
如果你正在考虑使用hostPath
卷作为存储数据库数据的目录,请重新考虑。因为卷的内容存储在特定节点的文件系统中,所以当数据库pod被重新安排在另一个节点时,会找不到数据。这解释了为什么对常规pod使用hostPath
卷不是一个好主意,因为这会使pod对预定规划的节点很敏感。
3.2 检查使用hostPath
卷的系统pod
如何正确地使用hostPath
卷?先看一下是否有系统层面的pod已经在使用这种类型的卷,而不是直接创建一个新pod。
4 使用持久化存储
当运行在一个pod中的应用程序需要将数据保存到磁盘上,并且即使该pod重新调度到另一个节点时也要求具有相同的数据可用。这就不能使用到目前为止我们提到的任何卷类型,由于这些数据需要可以从任何集群节点访问,因此必须将其存储在某种类型的网络存储(NAS
)中。
5 小结
- 创建一个多容器pod,并通过为pod添加一个卷并将其挂载到每个容器中,来让pod中的容器操作相同的文件
- 使用
emptyDir
卷存储临时的非持久数据 - 使用
gitRepo
卷可以在pod启动时使用Git库的内容轻松填充目录 - 使用
hostPath
卷从主机节点访问文件 - 将外部存储装载到卷中,以便在pod重启之前保持pod数据读写
- 通过使用持久卷和持久卷声明解耦pod与存储基础架构
- 为每个持久卷声明动态设置所需(或缺省)存储类的持久卷
- 当需要将持久卷声明绑定到预配置的持久卷时,防止动态置备程序干扰