我们正在用swag升级FutureStack注册,只到4月30日。适用条款和条件。 现在注册

这是由五部分组成的系列文章的最后一部分Kubernetes基本面

使用容器来运行应用程序有许多优点。然而,易于存储肯定不是其中之一。要完成它的工作,容器必须有一个临时文件系统。但是当容器关闭时,对其文件系统所做的任何更改都会丢失。易于替换的容器的一个副作用是它们缺乏持久性的固有概念。

而Docker已经解决了这个问题的挂载点从主机,在Kubernetes在这一过程中,我们面临着更多的困难。Kubernetes中最小的可部署计算单元是圆荚体.Pod的多个实例可能托管在多个物理机器上。更糟糕的是,不同的容器可能运行在相同的Pod中,但访问相同的存储。

在本文中,我们将讨论Kubernetes提供的两种帮助解决存储问题的工具:卷和持久卷。我们将介绍如何以及为什么使用它们。

关于Kubernetes卷

提供Pod中所有容器共享的存储空间。这允许您可靠地使用同一个挂载的文件系统,在同一个Pod中运行多个服务。然而,这并不是自动的。希望使用卷的容器必须指定要使用的卷,以及将其挂载到容器的文件系统中的位置。

此外,卷具有明确定义的寿命。它们与它们所属的花苞的生命周期绑定在一起。只要Pod还在活动,音量也在那里。但是,当您重新启动Pod时,卷将被重置。如果这不是您想要的,那么您应该使用持久卷(下一节将讨论),或者更改应用程序的逻辑以适当地适应这种行为。

虽然Kubernetes只关心卷的正式定义,但您还需要在某处分配一个真实的(物理的)文件系统。这就是Kubernetes超越Docker的地方。Docker只映射从主机到容器的路径,而Kubernetes基本上允许任何东西,只要有一个合适的存储提供者。

您可以使用云选项,例如Amazon Elastic Block Store (EBS)Azure Blob存储,或开源解决方案,如亚博直播平台Ceph.也可以使用与NFS一样简单和通用的方法。如果你想使用类似于Docker的挂载路径,你可以回退到hostPath卷类型。

那么如何创建这些卷呢?您可以在Pod定义中这样做。

使用卷

例如,考虑使用两个容器创建一个名为sharedvolumeexample的新Pod——两个容器都处于休眠状态。使用volumes键,可以描述要在容器中使用的卷。

:豆荚apiVersion: v1元数据:名称:sharedvolumeexample规范:容器:-名称:c1形象:centos: 7命令:“bin / bash”——“c”——“睡眠10000”volumeMounts: -名称:换mountPath:“/ tmp /交换”——名称:c2形象:centos: 7命令:“bin / bash”——“c”——“睡眠10000”volumeMounts: -名称:换mountPath:“/ tmp /数据”卷:名称:换emptyDir: {}

要在容器中使用卷,您需要指定volumeMounts如上所示。的mountPath“Key”表示卷的访问路径。

为了演示如何在两个容器之间共享容量,让我们运行一个小测试。首先,您应该根据规范创建Pod(例如,sharedvolumeexample.yml):

Kubectl应用-f sharedvolumeexample.yml

然后,您可以使用kubectl访问第一个容器c1上的终端:

Kubectl执行它sharedvolumeexample -c c1——bash

下一步,将一些数据写入换/ tmp /挂载点:

> /tmp/xchange/file.txt

让我们打开另一个终端,连接到名为c2的容器。

Kubectl执行它sharedvolumeexample -c c2——bash

不同之处在于,这一次您从挂载的存储读取/ tmp /数据

猫/ tmp /数据/ file.txt

正如预期的那样,这会产生“一些数据”。现在你可以移除Pod:

kubectl删除/ sharedvolumeexample仓

使用持久卷

当(常规)卷不能满足您的需要时,您可以切换到a持久的卷

持久卷是位于集群级别的存储对象。因此,它的生命周期不是与单个Pod的生命周期绑定的,而是与集群本身绑定的。持久卷可以在Pods之间共享数据。

持久卷的一个优点是,它不仅可以在单个Pod的容器之间共享,还可以在多个Pod之间共享。这意味着持久性卷可以通过扩展其大小来进行伸缩。然而,缩小尺寸是不可能的。

持久卷提供了与常规卷相同的选择物理提供者的选项。然而,准备金略有不同。

提供持久卷有两种方法:

  • 静态:你已经在存储端分配了所有的东西。没什么可做的。后面的物理存储总是相同的。
  • 动态:当需求增长时,您可能希望扩展可用存储空间。需求通过数量索赔资源来解决,我们稍后会讨论。要启用动态存储配置,您必须在Kubernetes API服务器上启用DefaultStorageClass许可控制器。

对于由可伸缩资源支持的需求增加的不断增长的系统,动态配置更有意义。否则,我们建议使用更简单的静态配置。

让我们尝试创建一个持久化卷hostPath支持存储。注意,我们不是将kind配置为Pod,而是将其配置为PersistentVolume

kind: PersistentVolume apiVersion: v1 metadata: name: persvolumeexample labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/tmp/data"

与Pods相同,这些资源是使用kubectl工具:

Kubectl应用-f persvolumeexample.yml

在上面的示例中,我们创建了一个名为persvolumeexample,最大存储容量为10gb。对于不同的访问模式,您可以指定ReadWriteOnceReadOnlyMany,ReadWriteMany,尽管并非所有这些模式都对每个存储提供者可用。例如,AWS EBS仅支持ReadWriteOnce

您可以通过其他资源使用创建的持久卷:PersistentVolumeClaim.该声明确保有足够的可用空间。即使在动态配置期间,Kubernetes主动尝试分配更多空间,这也可能会失败。

让我们创建一个配置3gb的声明:

kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim-1 spec: accessModes:—ReadWriteOnce resources: requests: storage: 3Gi

配置要求使用kubectl

Kubectl应用-f myclaim-1.yml

当您运行此命令时,Kubernetes将查找与声明匹配的持久卷。使用索赔很简单:

:豆荚apiVersion: v1元数据:名称:volumeexample规范:容器:-名称:c1形象:centos: 7命令:“bin / bash”——“c”——“睡眠10000”volumeMounts: -名称:换mountPath:“/ tmp /交换”——名称:c2形象:centos: 7命令:“bin / bash”——“c”——“睡眠10000”volumeMounts: -名称:换mountPath:“/ tmp /数据”卷:名称:xchange persistentvolumecclaim: claimName: myclaim-1

如果将这个示例与前一个示例进行比较,您将看到只有volumes部分发生了变化,其他部分没有变化。

索赔只管理了一小部分的数量。要释放这部分,你必须删除声明。持久性卷的回收策略告诉Kubernetes在释放其索赔后如何处理该卷。选项是保留回收(优先于动态配置),和删除

要设置回收策略,您需要定义persistentVolumeReclaimPolicy的规格部分中的选项PersistentVolume配置。例如,在前面的配置中如下所示:

kind: PersistentVolume apiVersion: v1 metadata: name: persvolumeexample labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: "/tmp/data"

结束

卷和持久卷都允许添加容器重新启动后仍然存在的数据存储。虽然卷被绑定到Pod的生命周期,但可以独立于特定Pod定义持久卷。它们可以在任何Pod中使用。

你的选择取决于你的需要。当包含的Pod关闭时,卷将被删除,但当您需要在Pod中运行的容器之间共享数据时,这是完美的。

由于持久卷的寿命比单个Pod长,所以当数据必须在Pod重启后存活或必须在Pod之间共享时,它们是理想的。

这两种类型的存储都很容易在集群中设置和使用。编排快乐!

准备好深入研究库伯内特的监控了吗?查看使用New Relic监控Kubernetes的完整介绍