本章将讨论 Kubernetes 如何管理存储资源。html
首先咱们会学习 Volume,以及 Kubernetes 如何经过 Volume 为集群中的容器提供存储;而后咱们会实践几种经常使用的 Volume 类型并理解它们各自的应用场景;最后,咱们会讨论 Kubernetes 如何经过 Persistent Volume 和 Persistent Volume Claim 分离集群管理员与集群用户的职责,并实践 Volume 的静态供给和动态供给。docker
本节咱们讨论 Kubernetes 的存储模型 Volume,学习如何将各类持久化存储映射到容器。学习
咱们常常会说:容器和 Pod 是短暂的。
其含义是它们的生命周期可能很短,会被频繁地销毁和建立。容器销毁时,保存在容器内部文件系统中的数据都会被清除。spa
为了持久化保存容器的数据,可使用 Kubernetes Volume。code
Volume 的生命周期独立于容器,Pod 中的容器可能被销毁和重建,但 Volume 会被保留。htm
本质上,Kubernetes Volume 是一个目录,这一点与 Docker Volume 相似。当 Volume 被 mount 到 Pod,Pod 中的全部容器均可以访问这个 Volume。Kubernetes Volume 也支持多种 backend 类型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等,完整列表可参考 https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumesblog
Volume 提供了对各类 backend 的抽象,容器在使用 Volume 读写数据的时候不须要关心数据究竟是存放在本地节点的文件系统中呢仍是云硬盘上。对它来讲,全部类型的 Volume 都只是一个目录。生命周期
咱们将从最简单的 emptyDir 开始学习 Kubernetes Volume。资源
emptyDir 是最基础的 Volume 类型。正如其名字所示,一个 emptyDir Volume 是 Host 上的一个空目录。get
emptyDir Volume 对于容器来讲是持久的,对于 Pod 则不是。当 Pod 从节点删除时,Volume 的内容也会被删除。但若是只是容器被销毁而 Pod 还在,则 Volume 不受影响。
也就是说:emptyDir Volume 的生命周期与 Pod 一致。
Pod 中的全部容器均可以共享 Volume,它们能够指定各自的 mount 路径。下面经过例子来实践 emptyDir,配置文件以下:
这里咱们模拟了一个 producer-consumer 场景。Pod 有两个容器 producer
和 consumer
,它们共享一个 Volume。producer
负责往 Volume 中写数据,consumer
则是从 Volume 读取数据。
① 文件最底部 volumes
定义了一个 emptyDir
类型的 Volume shared-volume
。
② producer
容器将 shared-volume
mount 到 /producer_dir
目录。
③ producer
经过 echo
将数据写到文件 hello
里。
④ consumer
容器将 shared-volume
mount 到 /consumer_dir
目录。
⑤ consumer
经过 cat
从文件 hello
读数据。
执行以下命令建立 Pod:
kubectl logs
显示容器 consumer
成功读到了 producer
写入的数据,验证了两个容器共享 emptyDir Volume。
由于 emptyDir 是 Docker Host 文件系统里的目录,其效果至关于执行了 docker run -v /producer_dir
和 docker run -v /consumer_dir
。经过 docker inspect
查看容器的详细配置信息,咱们发现两个容器都 mount 了同一个目录:
这里 /var/lib/kubelet/pods/3e6100eb-a97a-11e7-8f72-0800274451ad/volumes/kubernetes.io~empty-dir/shared-volume
就是 emptyDir 在 Host 上的真正路径。
emptyDir 是 Host 上建立的临时目录,其优势是可以方便地为 Pod 中的容器提供共享存储,不须要额外的配置。但它不具有持久性,若是 Pod 不存在了,emptyDir 也就没有了。根据这个特性,emptyDir 特别适合 Pod 中的容器须要临时共享存储空间的场景,好比前面的生产者消费者用例。
下一节咱们学习 hostPath Volume。
书籍:
1.《天天5分钟玩转Kubernetes》
https://item.jd.com/26225745440.html
2.《天天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
3.《天天5分钟玩转OpenStack》
https://item.jd.com/12086376.html