存储(Storage)是运行有状态容器的关键要素,Kubernetes提供了强大的原语来管理存储。动态卷配置(Dynamic provisioning)是Kubernetes的独有功能,它可以根据需要动态的创建存储卷。在动态配置之前,集群管理员必须手动调用云/存储服 务提供商的接口来配置新的存储卷,然后创建PersistentVolume对象以在Kubernetes中表示和使用他们。通过动态配置,可以实现两个步骤的自动化,无须集群管理员预先配置存储资源,而是使用StorageClass对象制定的供应商来动态配置存储资源,具体请参考用户指南)。StorageClass本质上是为底层存储提供者描绘了蓝图,以及各种参数,例如磁盘类型(例如固态和标准磁盘)。
StorageClasses使用特定的存储平台或者云提供商为Kubernetes提供物理介质。多个存储配置以in-tree的形式(用户手册),但现在也支持out-of-tree配置器(请参阅kubernetes-incubator)。
在Kubernetes 1.6正式版中,动态配置被提升至稳定版(Kubernetes 1.4是Beta)。这是完成Kubernetes存储自动化愿景的一大重要进步,它允许集群管理员控制资源的配置,也能够让用户更好地专注应用开发。这些所有的有点,在使用Kubernetes 1.6之前,这些面向用户的变化都是非常重要的。
1、怎么使用Storage Classes
StorageClass是Dynamic Provisioning(动态配置)的基础,允许集群管理员位底层存储平台做定义抽象。用户只需在PersistentVolumeClaim(PVC)通过名字引用StorageClass即可。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc namespace: testns spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gold
为了促进Dynamic Provisioning的使用,此功能允许集群管理指定默认的StorageClass。当Dynamic Provisioning存在时,用户可以创建一个PVC而不需要制定一个StorageClassName,进一步减少了用户用于关注底层存储提供者所需的精力。当使用默认的StorageClasses时,创建PersistentVolumeClaims(PV),这一点尤为重要:
- 在Kubernetes 1.6中,已经跟PVCs绑定的PVs依然保持绑定:
- 除非用户手动添加他们,否则,他们将不具有与他们相关联的StorageClass。
- 如果PV变为“可用”,如果删除的PVC和对应的PV被回收,则它要接受如下约束:
- 如果PVC中未指定StorageClassName,则默认的StorageClass将用于动态配置(Dynamic Provisioning)。
- 如果存在并且“可用”,没有StorageClass标签的PV将不被考虑用于绑定到PVC。
- 如果在PVC中将StorageClassName设置为空字符串(“”),则不会使用存储类。(即:此PVC禁止使用动态配置)
- 如果存在并且“可用”,PVs(没有指定StorageClassName),将被考虑用于绑定到PVC。
- 如果StorageClassName设置为特定值,则将使用与之匹配的存储类。
- 如果存在并且“可用”,匹配到StorageClassName的PV将被考虑用于绑定到PVC。
- 如果不存在对应的存储类,PVC将失败。
为了减轻集群中默认StorageClasses的负担,从Kubernetes 1.6开始,Kubernetes为多个云提供商安装(通过add-on管理器)默认的StorageClasses。要使用这些默认的StorageClasses,用户不需要按名称引用他们,也就是说,不需要在PVC中指定StorageClassName,便可直接使用。
下面的表格显示不同的云提供商预安装的默认StorageClasses:
云提供商 | 默认StorageClasses Name | 默认存储 |
---|---|---|
Amazon Web Services | gp2 | aws-ebs |
Microsoft Auzer | standard | azure-disk |
Google Cloud Platform | standard | gcd-pd |
OpenStack | standard | cinder |
VMware vSphere | thin | vsphere-volume |
对于大多数用户来说,选择使用每个云提供商默认的提供的存储是“理智的”,如果想指定自己使用的默认存储方式,请参考用户手册。
2、动态配置卷和回收策略
所有的PVs都有一个与之关联的回收策略,规定PV一旦从声明中解除后会发生什么(请参考用户指南)。由于自动化存储资源的生命周期管理,因此动态配置卷(Dynamic Provisioning Volume)的默认回收策略为“删除”。这意味着当PersistentVolumeClaim(PVC)被释放时,动态配置卷会被相应的删除,并且可能数据无法恢复。如果这不是所预期的行为,则在设置卷后,用户必须在相应的PersistentVolume(PV)对象上更改回收策略。
如何设置回收策略?
您可以通过修改PV对象中的persistentVolumeReclaimPolicy字段的值来修改PV的回收策略。更多的细节和不同的回收策略请参考用户手册。
3、FAQs
A、如何使用默认的StorageClass?
如果您的集群有一个默认的StorageClass能够满足您的需求,那么您剩下所有需要做的就是创建PersistentVolumeClaim(PVC),剩下的都有默认的动态配置搞定,包括您无需去指定storageClassName:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc namespace: testns spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi
B、能添加自己的StorageClass吗?
当然可以。在添加自己的StorageClass之前,需要先确定动态配置能否在集群上工作。然后,创建一个StorageClass对象并通过设置参数来定制它。对很多用户来说,最简单的创建对象的方式就是通过编写一个yaml文件并通过kubectl create -f来创建。
下面的创建StorageClass的例子使用了Google Cloud Platform,创建了一个pd-ssd,名称为gold:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: gold provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd
由于集群中可以存在多个类,因此管理员可以为大多数工作负载保存默认值(因为它使用pd-standard),为需要额外的工作负载保留gold类。
C、是否已经安装了默认的StorageClass?
您可以使用kubectl命令检查StorageClass对象。在下面的例子中有两个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>
D、能过删除/关闭默认的StorageClass?
您不能删除默认的StorageClass,因为它是作为集群的add-on安装的,如果它被删除,会被重新安装。
当然,您可以停掉默认的StorageClass行为,通过删除annotation:storageclass.beta.kubernetes.io/is-default-class。
如果没有StorageClass对象标记默认的annotation,那么PersistentVolumeClaim对象(在不指定StorageClass情况下)将不自动触发动态配置。相反,它们将回到绑定可用的*PersistentVolume(PV)*的状态。
E、能否将PVs与一个特殊的StorageClass绑定?
可以。通过改变PV对象的storageClassName字段,可以将一个StorageClass与这个PV绑定。
F、当删除PersistentVolumeClaim(PVC)会发生什么?
如果一个卷是动态配置的卷,则默认的回收策略为“删除”。这意味着,在默认的情况下,当PVC被删除时,基础的PV和对应的存储也会被删除。如果需要保留存储在卷上的数据,则必须在PV被设置之后将回收策略从delete更改为retain。
本文转自中文社区-Kubernetes 1.6新特性系列 | 动态配置和存储类