容器磁盘上的文件是暂时的,这给在容器中运行的重要应用程序带来了一些问题。
首先,当容器崩溃时,kubelet将重新启动它,但是文件将丢失 — 容器将以一个干净的状态开始。其次,在一个Pod中运行容器时,常常需要在容器之间共享文件。Kubernetes卷抽象解决了这两个问题。
原理
Docker也有一个卷的概念,尽管它比较松散,管理也比较少。在Docker中,卷就是磁盘上或另一个容器中的目录。生存期没有管理,直到最近才出现了本地磁盘支持的卷。Docker现在提供了卷驱动程序,但是目前的功能非常有限(例如,从Docker 1.7开始,每个容器只允许一个卷驱动程序,并且没有办法将参数传递给卷)。
Kubernetes卷有一个明确的生命周期 —— 与卷所在pod一样。因此,卷的寿命比在Pod中运行的任何容器都长,并且跨容器重新启动时保留数据。当然,当一个pod终止时,卷也将终止。
Kubernetes支持多种类型的卷,一个Pod可以同时使用任意数量的卷。
卷的核心是一个目录,其中可能包含一些数据,可以访问Pod中的容器。
要使用卷,Pod要配置好卷的描述信息(.spec.volumes
字段)和挂载位置(.spec.containers[*].volumeMounts
)。
容器中的进程看到由其Docker镜像和卷组成的文件系统视图。Docker镜像位于文件系统的根目录下,任何卷都挂载在镜像内的指定路径上。卷不能挂载到其他卷或与其他卷的硬链接。Pod中的每个容器必须独立地指定在何处挂载每个卷。
卷的类型
Kubernetes支持很多类型的卷:
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- cinder
- configMap
- csi
- downwardAPI
- emptyDir
- fc (fibre channel)
- flexVolume
- flocker
- gcePersistentDisk
- gitRepo (deprecated)
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume
详情可参考官网。
持久卷 与 持久卷声明
- 持久性卷(PV) 是由管理员提供的网络存储。它是集群中的资源,独立于使用PV的任何单独pod。
- 持久卷声明(PVC) pod所需存储空间的声明。用户不需要知道底层配置,声明必须在创建pod的相同命名空间中创建。