6.1 介绍卷
Kubernetes的卷是pod的一个组成部分,因此像容器一样在pod的规范中就定义了。它们不是独立的Kubernetes对象,也不能单独创建或删除。pod中的所有容器都可以使用卷,但必须先将它挂载在每个需要访问它的容器中。在每个容器中,都可以在其文件系统的任意位置挂载卷。
6.1.1 卷的应用示例
假设有一个带有三个容器的pod(如图6.1所示),一个容器运行了一个web服务器,该web服务器的HTML页面目录位于/var/htdocs,并将站点访问日志存储到/var/logs目录中。第二个容器运行了一个代理来创建HTML文件,并将它们存放在/var/html中,第三个容器处理在/var/logs目录中找到的日志(转换、压缩、分析它们或者做其他处理)。
每个容器都有一个很明确的用途,但是每个容器单独使用就没有多大用处了。在没有共享磁盘存储的情况下,用这三个容器创建一个pod没有任何意义。因为内容生成器(content generator)会在自己的容器中存放生成的HTML文件,而web服务器无法访问这些文件,因为它运行在一个隔离的独立容器内。正好相反,它会托管放置在容器镜像的/var/htdocs目录下的任意内容,或者是放置在容器镜像中/var/htdocs路径下的任意内容。同样,日志转换器(logrotator)也无事可做,因为它的/var/logs目录始终是空的,并没有日志写入。一个有这三个容器而没有挂载卷的pod基本上什么也做不了。
但是,如果将两个卷添加到pod中,并在三个容器的适当路径上挂载它们,如图6.2所示,就已经创建出一个比其各个部分之和更完善的系统。Linux允许在文件树中的任意位置挂载文件系统,当这样做的时候,挂载的文件系统内容在目录中是可以访问的。通过将相同的卷挂载到两个容器中,它们可以对相同的文件进行操作。在这个例子中,只需要在三个容器中挂载两个卷,这样三个容器将可以一起工作,并发挥作用。下面解释一下:
首先,pod有一个名为publicHtml的卷,这个卷被挂载在WebServer容器的/var/htdocs中,因为这是web服务器的服务目录。在ContentAgent容器中也挂载了相同的卷,但在/var/html中,因为代理将文件写入/var/html中。通过这种方式挂载这个卷,web服务器现在将为content agent生成的内容提供服务。
同样,pod还拥有一个名为logVol的卷,用于存放日志,此卷在WebServer和LogRotator容器中的/var/log中挂载,注意,它没有挂载在ContentAgent容器中,这个容器不能访问它的文件,即使容器和卷是同一个pod的一部分,在pod的规范中定义卷是不够的。如果我们希望容器能够访问它,还需要在容器的规范中定义一个VolumeMount。
在本例中,两个卷最初都是空的,因此可以使用一种名为emptyDir的卷。Kubernetes还支持其他类型的卷,这些卷要么是在从外部源初始化卷时填充的,要么是在卷内挂载现有目录。这个填充或装入卷的过程是在pod内的容器启动之前执行的。
卷被绑定到pod的lifecycle(生命周期)中,只有在pod存在时才会存在,但取决于卷的类型,即使在pod和卷消失之后,卷的文件也可能保持原样,并可以挂载到新的卷中。让我们来看看卷有哪些类型。
6.1.2 介绍可用的卷类型
有多种卷类型可供选择。其中一些是通用的,而另一些则相对于当前常用的存储技术有较大差别。如果从来没有听说过这些技术,也别太担心——其中至少一半笔者也没有听说过。你有可能只会用到那些自己熟悉和曾经用过的卷技术。以下是几种可用卷类型的列表:
- emptyDir——用于存储临时数据的简单空目录。
- hostPath ——用于将目录从工作节点的文件系统挂载到pod中。
- gitRepo——通过检出Git仓库的内容来初始化的卷。
- nfs——挂载到pod中的NFS共享卷。
gcePersistentDisk(Google高效能型存储磁盘卷)、awsElastic BlockStore(AmazonWeb服务弹性块存储卷)、azureDisk(Microsoft Azure磁盘卷)——用于挂载云服务商提供的特定存储类型。
cinder、cephfs、iscsi、flocker、glusterfs、quobyte、rbd、flexVolume、vsphere-Volume、photonPersistentDisk、scaleIO用于挂载其他类型的网络存储。
configMap、secret、downwardAPI——用于将Kubernetes部分资源和集群信息公开给pod的特殊类型的卷。
persistentVolumeClaim——一种使用预置或者动态配置的持久存储类型(我们将在本章的最后一节对此展开讨论)。
这些卷类型有各种用途。我们将在下面的部分中了解其中一些内容。特殊类型的卷(secret、downwardAPI、configMap)将在接下来的两章中讨论,因为它们不是用于存储数据,而是用于将Kubernetes元数据公开给运行在pod中的应用程序。
单个容器可以同时使用不同类型的多个卷,而且正如我们前面提到的,每个容器都可以装载或不装载卷。
网友评论