本文发布时间已超过一年。旧文章可能包含过时内容。请检查页面信息自发布以来是否仍然正确。
Kubernetes 中的动态供应和存储类
编者按:本文是关于 Kubernetes 1.6 新特性深度系列文章的一部分。
存储是运行有状态容器的关键部分,Kubernetes 提供了强大的原语来管理它。动态卷供应是 Kubernetes 独有的一个特性,它允许按需创建存储卷。在动态供应之前,集群管理员必须手动调用其云或存储提供商来供应新的存储卷,然后创建 PersistentVolume 对象来在 Kubernetes 中表示它们。通过动态供应,这两个步骤实现了自动化,消除了集群管理员预供应存储的需求。相反,可以使用 StorageClass 对象(参见用户指南)指定的供应器动态供应存储资源。StorageClass 本质上是抽象底层存储提供商以及其他参数(如磁盘类型,例如固态硬盘与标准磁盘)的蓝图。
StorageClass 使用特定于存储平台或云提供商的供应器,以便 Kubernetes 可以访问正在使用的物理介质。内核中提供了多种存储供应器(参见用户指南),此外现在也支持树外供应器(参见kubernetes-incubator)。
在Kubernetes 1.6 版本中,动态供应已升级到稳定版(在 1.4 中进入 Beta 阶段)。这是完成 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,用户在创建 PVC 时可以不指定 storageClassName,这进一步减轻了用户了解底层存储提供商的责任。使用默认 StorageClass 时,在创建 PersistentVolumeClaim (PVC) 时需要注意一些操作上的微妙之处。如果你已经有现有的 PersistentVolume (PV) 并希望重用它们,这一点尤其重要。
已与 PVC “Bound” 的 PV 在升级到 1.6 后将保持绑定状态。
- 除非用户手动添加,否则它们不会有关联的 StorageClass。
- 如果 PV 变为“Available”(即,如果你删除一个 PVC 并且相应的 PV 被回收),则它们会受到以下情况的影响:
如果在此 PVC 中未指定 storageClassName,将使用默认存储类进行供应。
- 现有“Available”的且没有默认存储类标签的 PV 将不会被考虑绑定到此 PVC。
如果在此 PVC 中将 storageClassName 设置为空字符串(‘’),将不使用任何存储类(即,此 PVC 的动态供应被禁用)。
- 现有“Available”的(未指定 storageClassName 的)PV 将被考虑绑定到此 PVC。
如果 storageClassName 设置为特定值,则将使用匹配的存储类。
- 现有“Available”的且具有匹配 storageClassName 的 PV 将被考虑绑定到此 PVC。
- 如果没有对应的存储类存在,PVC 将会创建失败。为了减轻在集群中设置默认 StorageClass 的负担,从 1.6 开始,Kubernetes(通过附加组件管理器)为几个云提供商安装了默认 StorageClass。要使用这些默认 StorageClass,用户不需要按名称引用它们——也就是说,在 PVC 中无需指定 storageClassName。
下表提供了由云提供商预安装的默认存储类以及这些默认设置使用的具体参数的更多详细信息。
云提供商 | 默认 StorageClass 名称 | 默认供应器 |
---|---|---|
Amazon Web Services | gp2 | aws-ebs |
Microsoft Azure | standard | azure-disk |
Google Cloud Platform | standard | gce-pd |
OpenStack | standard | cinder |
VMware vSphere | thin | vsphere-volume |
虽然这些预安装的默认存储类对于大多数存储用户来说是“合理”的选择,但本指南提供了如何指定你自己的默认设置的说明。
动态供应的卷和回收策略
所有 PV 都关联了一个回收策略,它决定了 PV 从声明中释放后会发生什么(参见用户指南)。由于动态供应的目标是完全自动化存储资源的生命周期,动态供应卷的默认回收策略是“delete”。这意味着当 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”应用它。以下是一个名为“gold”的 Google Cloud Platform 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),会发生什么?
如果卷是动态供应的,那么默认回收策略设置为“delete”。这意味着默认情况下,当 PVC 被删除时,底层 PV 和存储资产也会被删除。如果你想保留存储在卷上的数据,那么你必须在 PV 供应后将回收策略从“delete”更改为“retain”。
- 在Stack Overflow 上提问(或回答问题)
- 在K8sPort 上加入拥护者社区门户
- 在GitHub 上参与 Kubernetes 项目
- 在 Twitter 上关注我们 @Kubernetesio 获取最新动态
- 在Slack 上与社区联系
- 下载 Kubernetes