Google Kubernetes设计文档之Volumes

摘要:Kubernetes是Google开源的容器集群管理系统,构建于Docker之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等功能。本文描述了Kubernetes中Volumes的使用情况,Volume是一个能够被容器访问的目录。

Volumes

本文描述了Kubernetes中Volumes的使用情况,建议在阅读本文前,首先熟悉pods。

Volume是一个能够被容器访问的目录,它可能还会包含一些数据。Kubernetes Volumes与Docker Volumes类似,但并不完全相同。

一个Pod会在它的ContainerManifest 属性中指明其容器需要哪些Volumes。

容器中的进程可见的文件系统视图由两个源组成:一个单独的Docker image和零个或多个Volumes。Docker image位于文件层次结构的根部。所有的Volumes都挂载在Docker image的节点上。Volumes不能挂载在其他的Volumes上,也没有连接其他Volumes的硬链接。Pod中的每个容器都单独地指明了其image挂载的Volume。这会通过VolumeMount属性来确定。

资源

Volume的存储介质(如硬盘、固态硬盘或内存)是由保存kubelet根目录(一般为/var/lib/kubelet)的文件系统的存储介质决定的。一个EmptyDir或者PersistentDir类型的Volume可以使用多少空间是没有限制的,同时在容器或者pods间也不存在隔离。

将来,我们预计一个Volume将能够通过使用资源规范来请求一个确定大小的空间;同时,对于包含多种存储介质的集群,将可以选择Volume使用的介质类型。

Volumes的类型

Kubernetes现在支持三种类型的Volumes,但将来会支持更多的类型。

EmptyDir

一个EmptyDir Volume是在Pod绑定到Node时创建的。当第一条容器命令启动时,它的初始状态为空。在同一个Pod上的容器可以读写EmptyDir中的相同文件。当一个Pod被解绑,在EmptyDir中的数据将永久性删除。

EmptyDir的一些用途如下:

  • 暂存空间,例如用于基于磁盘的归并排序或者长计算的检查点;
  • 一个目录,由一个内容管理容器填充数据,同时由一个网络服务器容器供应数据。

目前,用户无法控制EmptyDir使用的介质种类。如果Kubelet的配置是使用硬盘,那么所有的EmptyDirectories都将创建在该硬盘上。将来,可以预料的是Pods将可以控制EmptyDir是位于硬盘、固态硬盘还是基于内存的tmpfs上。

HostDir

一个HostDir的Volume将可以访问当前宿主机节点上的文件。

HostDir的一些用途如下:

  • 运行一个需要访问Docker内部结构的容器;可以访问/var/lib/docker这个HostDir
  • ;在容器中运行cAdvisor;可以访问/dev/cgroups这个HostDir。

当使用该类型的Volume时,需要格外小心,因为:

  • 具有相同配置的pods(例如由同一个podTemplate创建的pods)可能在不同宿主节点上由于宿主机上的目录和文件不同而有着不同的访问结果;
  • 当Kubernetes增加资源敏感调度,按其计划,它将不能考虑到HostDir使用的资源。

GCEPersistentDisk

重要提示:必须创建并格式化一个永久磁盘(PD)才能使用GCEPersistentDisk。

拥有GCEPersistentDisk的Volume可以访问谷歌计算引擎(Google Compute Engine, GCE)的永久磁盘上的文件。

使用GCEPersistentDisk时,有一些限制条件:

  • 节点(运行kubelet的节点)需要是GCE虚拟机;
  • 这些虚拟机需要在相同的GCE项目中,同时被划作PD;
  • 避免使用相同Volume来创建多个pods
    • 如果多个pods引用相同的Volume,并且都部署在同一台机器上,不论它们是只读还是可读写的,那么第二个pod的部署都将失败;
    • 只有使用只读加载的文件系统的pod才能创建复制控制器。

创建一个PD

在你能够在pod上使用GCE PD前,你需要先创建并格式化它。

我们正在积极努力得使这个过程更加精简容易。

GCE PD的配置实例:

Kubernetes的Volumes使用实例-Walkthrough

对于永久存储,首先,我们知道容器的文件系统与容器有着同等的生命周期,所以,我们还需要有永久存储。为了实现这个目的,你需要声明一个Volume,把它作为Pod的一部分,同时将它挂载到一个容器上。

那么,我们该如何做呢?我们为Pod增加一个Volume:

然后,我们为该Volume在容器中增加一个对应的挂载路径:

在Kubernetes中, EmptyDir Volumes在Pod的生命周期内一直可用,该周期比任何一个容器的生命周期都长,所以即使容器失效并重启,我们的永久存储将仍然可用。

如果你希望挂载一个已经存在于文件系统的目录(例如/var/logs),你可以直接使用HostDir。

原文链接:Kubernetes Volumes(编译/仇臣 审校/张磊)

译者介绍:仇臣,浙江大学SEL实验室硕士研究生,目前在云平台团队从事科研和开发工作。浙大团队对PaaS,Docker,大数据和主流开源云计算技术有深入的研究和二次开发经验,团队现将部分技术文章贡献出来,希望能对读者有所帮助。

浙江大学SEL实验室是本网站上所有页面设计、页面内容的著作权人,对该网站所载的作品,包括但不限于网站所载的文字、数据、图形、照片、有声文件、动画文件、音视频资料等拥有完整的版权,受著作权法保护。严禁任何媒体、网站、个人或组织以任何形式或出于任何目的在未经本实验室书面授权的情況下抄袭、转载、摘编、修改本网站內容,或链接、转帖或以其他方式复制用于商业目的或发行,或稍作修改后在其它网站上使用,前述行为均将构成对本网站版权之侵犯,本网站將依法追究其法律责任。
本网站与他人另有协议授权下载的或法律另有规定的,在下载使用时必须注明“稿件来源:浙江大学SEL实验室”。

One thought on “Google Kubernetes设计文档之Volumes”

  1. 一下评论仅个人而言,有可能是自己太水,提出的如果大神知晓,还望不吝赐教。资源控制这里说的很是模糊,cpu,内存的控制也只是个粗略的并没有详情控制,比如说docker run时会选择cpu的具体绑在那个线程上,内存也可以限制死。也就是如何在yaml文件中体现出来,
    还有就是volume ,我还是没有理解,如何将本地目录挂载到容器中,这在yaml文件中怎么体现出来。

Leave a Reply

Your email address will not be published. Required fields are marked *