1. Docker 的存储卷
1.2 Docker 中的 Volume
Docker Volume 将宿主机目录,挂载到容器中。在容器中修改的文件内容,将会被持久化到宿主机中。即时容器被删除,宿主机中的文件也会被保留。
Docker 使用 /var/lib/docker/volumes/
存储容器的 Volume。
查看本地 Volume :
|
|
当创建 Volume 时,Docker 会在 /var/lib/docker/volumes/
目录下创建文件夹用于存储数据。在停止或销毁容器之后,Volume 中的数据依然持久存在。
1.2 Docker Volume 的操作
创建一个 Volume :
|
|
查看所有的 Volume :
|
|
查看 Volume 的详情 :
|
|
删除 Volume :
|
|
挂载 Volume 到容器 :
|
|
2. Kubernetes 中的存储卷
2.1 Kubernetes 的 Volume
每个 Node 都会有 Container Runtime,这里以 Docker Runtime 为例。如果按照 Docker Volume 的方式挂载,会遇到问题:由于 Kubernetes 对 Pod 的自由调度,Pod 中的容器与 Node 没有绑定关系,不能保证 Volume 一定能挂载成功,也不能保证数据的完整性和一致性。
解决办法很常规,使用服务提供有状态的功能。Kubernetes 提供了 PV 和 PVC 的方式使用 Volume 。
对于一个独立的存储后端,实现可以是 NFS、Ceph、GlusterFS 等。PV 可以从中划分一部分用于 Kubernetes 的存储,而生命周期不依赖于 Pod。容器是 Volume 的真实使用者,Pod 中的每个容器都必须指定每个 Volume 的挂载位置。
使用 Volume 时,需要给 Pod 指定为卷 (spec.volumes 字段)以及将它挂载到容器的位置 (spec.containers.volumeMounts 字段)
2.2 存储插件
在 Kubernetes 中使用存储插件提供 Volume 的支持。Kubernetes 中的存储插件分为:
- in-tree
in-tree 插件运行在 Kubernetes 核心组件中。当需要使用相应的 Volume 服务时,需要调用核心组件中的插件。
Kubernetes 原生支持的 Volume 类型:
GCEPersistentDisk、AWSElasticBlockStore、AzureFile、AzureDisk、FC (Fibre Channel)、FlexVolume、Flocker、NFS、iSCSI、CephFS、Cinder (OpenStack block storage)、Glusterfs、VsphereVolume、Quobyte Volumes 等。
- out-of-tree
out-of-tree 插件的代码和部署独立于 Kubernetes。通常用于补充 in-tree 不支持的存储类型,或者对存储功能进行定制、扩展。
从 1.8 版开始,Kubernetes Storage SIG 停止接受 in-tree 插件,并建议所有存储提供商使用 out-of-tree 插件。目前有两种推荐的实现方式:容器存储接口(CSI)和 Flexvolume 。
2.3 PV、PVC
PV 为 PersistentVolume 的缩写,PVC 为 PersistentVolumeClaim 的缩写。
PV 和 PVC 是 Kubernetes 提供的两种资源,用户可以通过 API 对其进行操作。
管理员只需要关注如何通过 PV 提供存储功能,而不需要关注用户如何使用。
用户只需要关注如何挂载 PVC 到容器中,而不需要关注存储卷如何实现。
在使用 Volume 时,通常分为如下几步:
- 创建 Persistent Volume
- 创建 Persistent Volume Claim
- 创建 Pod 并使用 PVC