Please enable Javascript to view the contents

Kubernetes 之 Volumes

 ·  ☕ 3 分钟

1. Docker 的存储卷

1.2 Docker 中的 Volume

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

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

查看本地 Volume :

1
2
3
4
5
6
7
8
9
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 :

1
docker volume create volume_name

查看所有的 Volume :

1
docker volume ls

查看 Volume 的详情 :

1
docker volume inspect volume_name

删除 Volume :

1
docker volume rm volume_name

挂载 Volume 到容器 :

1
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. 参考


微信公众号
作者
微信公众号