目录

    1. Docker 的存储卷

    1.2 Docker 中的 Volume

    Docker Volume 将宿主机目录,挂载到容器中。在容器中修改的文件内容,将会被持久化到宿主机中。即时容器被删除,宿主机中的文件也会被保留。

    Docker 使用 /var/lib/docker/volumes/ 存储容器的 Volume。

    查看本地 Volume :

    tree /var/lib/docker/volumes/ -L 3
    /var/lib/docker/volumes/
    |-- 714450f353b26b5aa57aa352766c201c0851685e0e28c2e67ae1631f29c465b4
    |   `-- _data
    |       |-- access.log -> /dev/stdout
    |       `-- error.log -> /dev/stderr
    |-- metadata.db
    `-- volume_name
        `-- _data
    

    当创建 Volume 时,Docker 会在 /var/lib/docker/volumes/ 目录下创建文件夹用于存储数据。在停止或销毁容器之后,Volume 中的数据依然持久存在。

    1.2 Docker Volume 的操作

    创建一个 Volume :

    docker volume create volume_name
    

    查看所有的 Volume :

    docker volume ls
    

    查看 Volume 的详情 :

    docker volume inspect volume_name
    

    删除 Volume :

    docker volume rm volume_name
    

    挂载 Volume 到容器 :

    docker run -it -v volume_name:/data centos /bin/bash
    

    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 时,通常分为如下几步:

    1. 创建 Persistent Volume
    2. 创建 Persistent Volume Claim
    3. 创建 Pod 并使用 PVC

    3. 参考