本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。
Kubernetes 中的动态配置和存储类
编者注:此文章是关于 Kubernetes 1.6 中新增功能的系列深入文章的一部分
存储是运行有状态容器的关键部分,Kubernetes 提供了强大的原语来管理它。动态卷配置是 Kubernetes 特有的功能,允许按需创建存储卷。在动态配置之前,集群管理员必须手动调用其云或存储提供商来配置新的存储卷,然后在 Kubernetes 中创建 PersistentVolume 对象来表示它们。通过动态配置,这两个步骤是自动化的,从而无需集群管理员预先配置存储。相反,可以使用 StorageClass 对象指定的配置器动态配置存储资源(请参阅用户指南)。StorageClass 本质上是抽象底层存储提供商以及其他参数(如磁盘类型(例如;固态磁盘与标准磁盘))的蓝图。
StorageClass 使用特定于存储平台或云提供商的配置器,以使 Kubernetes 可以访问正在使用的物理介质。在树内提供了多个存储配置器(请参阅用户指南),但现在还支持树外的配置器(请参阅kubernetes-incubator)。
在Kubernetes 1.6 版本中,动态配置已升级为稳定版(在 1.4 中进入测试版)。这是完成 Kubernetes 存储自动化愿景的一大进步,使集群管理员可以控制资源的配置方式,并使用户能够更专注于其应用程序。尽管有所有这些好处,但在使用 Kubernetes 1.6 之前,有一些重要的面向用户的更改(如下所述)需要了解。
StorageClass 及其使用方法
StorageClass 是动态配置的基础,允许集群管理员定义底层存储平台的抽象。用户只需使用“storageClassName”参数在 PersistentVolumeClaim (PVC) 中按名称引用 StorageClass。
在以下示例中,PVC 引用名为“gold”的特定存储类。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: testns
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: gold
为了促进动态配置的使用,此功能允许集群管理员指定一个默认 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 名称 | 默认配置器 |
---|---|---|
亚马逊网络服务 | gp2 | aws-ebs |
Microsoft Azure | standard | azure-disk |
Google 云平台 | standard | gce-pd |
OpenStack | standard | cinder |
VMware vSphere | thin | vsphere-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 云平台的一个名为“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 后将回收策略从“删除”更改为“保留”。
- 在 Stack Overflow 上提出问题(或回答问题)
- 加入 K8sPort 上的倡导者社区门户
- 在 GitHub 上参与 Kubernetes 项目
- 在 Twitter 上关注我们 @Kubernetesio,获取最新更新
- 在 Slack 上与社区联系
- 下载 Kubernetes