本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 中的动态制备和存储类

编者注:本文是关于 Kubernetes 1.6 新功能的一系列深度文章的一部分

存储是运行有状态容器的关键部分,Kubernetes 提供了强大的原语来管理它。动态卷供应是 Kubernetes 独有的功能,允许按需创建存储卷。在动态供应之前,集群管理员必须手动调用其云或存储提供商来供应新的存储卷,然后创建 PersistentVolume 对象以在 Kubernetes 中表示它们。通过动态供应,这两个步骤都是自动化的,从而消除了集群管理员预供应存储的需要。相反,存储资源可以使用 StorageClass 对象指定的供应器动态供应(请参阅用户指南)。StorageClass 本质上是抽象底层存储提供商以及其他参数(如磁盘类型(例如固态硬盘与标准硬盘))的蓝图。

StorageClass 使用特定于存储平台或云提供商的供应器,为 Kubernetes 提供对所使用的物理介质的访问。树内提供了多个存储供应器(请参阅用户指南),但现在也支持树外供应器(请参阅kubernetes-incubator)。

Kubernetes 1.6 版本中,动态存储供应已升级为稳定版(在 1.4 版本中进入测试版)。这是完成 Kubernetes 存储自动化愿景的一大步,它允许集群管理员控制资源的供应方式,并让用户能够更多地关注其应用程序。尽管有所有这些好处,但在使用 Kubernetes 1.6 之前,有一些重要的面向用户的更改(如下所述)需要了解

StorageClass 及其使用方法

StorageClass 是动态供应的基础,它允许集群管理员定义底层存储平台的抽象。用户只需在 PersistentVolumeClaim (PVC) 中使用“storageClassName”参数按名称引用 StorageClass 即可。

在以下示例中,PVC 引用了一个名为“gold”的特定存储类。

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

 storageClassName: gold

为了促进动态供应的使用,此功能允许集群管理员指定一个默认 StorageClass。当存在默认 StorageClass 时,用户可以在不指定 storageClassName 的情况下创建 PVC,进一步减少用户了解底层存储提供商的责任。在使用默认 StorageClass 时,在创建 PersistentVolumeClaim (PVC) 时需要注意一些操作上的细微之处。如果您已有想要重复使用的 PersistentVolume (PV),这一点尤其重要

  • 已“绑定”到 PVC 的 PV 在升级到 1.6 后将保持绑定

    • 除非用户手动添加,否则它们将没有关联的 StorageClass
    • 如果 PV 变为“可用”(即,如果您删除 PVC 并且相应的 PV 被回收),则它们将受到以下限制:
  • 如果在 PVC 中未指定 storageClassName,则默认存储类将用于供应

    • 没有默认存储类标签的现有“可用”PV 将不被考虑绑定到 PVC
  • 如果在 PVC 中将 storageClassName 设置为空字符串 (‘‘),则不会使用任何存储类(即,此 PVC 的动态供应已禁用)

    • 现有“可用”PV(未指定 storageClassName)将被考虑绑定到 PVC
  • 如果 storageClassName 设置为特定值,则将使用匹配的存储类

    • 具有匹配 storageClassName 的现有“可用”PV 将被考虑绑定到 PVC
    • 如果没有相应的存储类存在,PVC 将会失败。为了减少在集群中设置默认 StorageClass 的负担,从 1.6 版本开始,Kubernetes(通过附加组件管理器)为几个云提供商安装了默认存储类。要使用这些默认 StorageClass,用户不需要按名称引用它们——也就是说,不需要在 PVC 中指定 storageClassName。

下表提供了有关云提供商预安装的默认存储类以及这些默认设置所使用的特定参数的更多详细信息。

云提供商默认 StorageClass 名称默认供应器
亚马逊网络服务gp2aws-ebs
微软 Azure标准版azure-disk
谷歌云平台标准版gce-pd
OpenStack标准版cinder
VMware vSpherevsphere-volume

虽然这些预安装的默认存储类对于大多数存储用户来说是“合理”的选择,但本指南提供了如何指定您自己的默认值的说明。

动态供应的卷和回收策略

所有 PV 都具有关联的回收策略,该策略规定了 PV 从声明中释放后会发生什么(请参阅用户指南)。由于动态供应的目标是完全自动化存储资源的生命周期,因此动态供应卷的默认回收策略是“删除”。这意味着当 PersistentVolumeClaim (PVC) 被释放时,动态供应的卷将在存储提供商上被取消供应(删除),并且数据很可能无法检索。如果这不是所需行为,用户必须在卷供应后更改相应 PersistentVolume (PV) 对象的回收策略。

如何更改动态供应卷的回收策略?

您可以通过编辑 PV 对象并将“persistentVolumeReclaimPolicy”字段更改为所需值来更改回收策略。有关各种回收策略的更多信息,请参阅用户指南

常见问题

如何使用默认 StorageClass?

如果您的集群有一个满足您需求的默认 StorageClass,那么您所需要做的就是创建一个 PersistentVolumeClaim (PVC),默认供应器将处理其余的工作——无需指定 storageClassName

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

我可以添加自己的存储类吗?
可以。要添加您自己的存储类,首先确定哪些供应器将在您的集群中工作。然后,创建一个 StorageClass 对象,其参数可根据您的需求进行自定义(有关更多详细信息,请参阅用户指南)。对于许多用户来说,创建对象最简单的方法是编写一个 yaml 文件并使用“kubectl create -f”应用它。以下是 Google Cloud Platform 上名为“gold”的 StorageClass 示例,它创建了一个“pd-ssd”。由于一个集群中可以存在多个类,因此管理员可以为大多数工作负载启用默认值(因为它使用“pd-standard”),而“gold”类则保留给需要额外性能的工作负载。

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

 name: gold

provisioner: kubernetes.io/gce-pd

parameters:

 type: pd-ssd

如何检查是否已安装默认 StorageClass?

您可以使用 kubectl 检查 StorageClass 对象。在下面的示例中,有两个存储类:“gold”和“standard”。“gold”类是用户定义的,“standard”类是由 Kubernetes 安装的,是默认值。

$ kubectl get sc

NAME                 TYPE

gold                 kubernetes.io/gce-pd   

standard (default)   kubernetes.io/gce-pd
$ kubectl describe storageclass standard

Name:     standard

IsDefaultClass: Yes

Annotations: storageclass.beta.kubernetes.io/is-default-class=true

Provisioner: kubernetes.io/gce-pd

Parameters: type=pd-standard

Events:         \<none\>

我可以删除/禁用默认 StorageClass 吗?
您不能删除提供的默认存储类对象。由于它们作为集群附加组件安装,如果被删除,它们将被重新创建。

但是,您可以通过删除(或设置为 false)以下注解来禁用默认行为:storageclass.beta.kubernetes.io/is-default-class。

如果没有 StorageClass 对象标记有默认注解,则 PersistentVolumeClaim 对象(未指定 StorageClass)将不会触发动态供应。相反,它们将回退到绑定到可用 PersistentVolume 对象的旧行为。

我可以将现有的 PV 分配给特定的 StorageClass 吗?
可以,您可以通过编辑相应的 PV 对象并添加(或设置)所需的 storageClassName 字段来将 StorageClass 分配给现有 PV。

如果我删除了 PersistentVolumeClaim (PVC) 会发生什么?
如果卷是动态供应的,则默认回收策略设置为“删除”。这意味着,默认情况下,当 PVC 被删除时,底层 PV 和存储资产也将被删除。如果您想保留存储在卷上的数据,则必须在 PV 供应后将回收策略从“删除”更改为“保留”。