Kubernetes 1.6新特性系列 | 动态配置和存储类

简介: 存储(Storage)是运行有状态容器的关键要素,Kubernetes提供了强大的原语来管理存储。动态卷配置(Dynamic provisioning)是Kubernetes的独有功能,它可以根据需要动态的创建存储卷。

存储(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设置为特定值,则将使用与之匹配的存储类。
    • 如果存在并且“可用”,匹配到StorageClassNamePV将被考虑用于绑定到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新特性系列 | 动态配置和存储类

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
4月前
|
存储 Kubernetes 容器
Kubernetes 存储选项:持久化卷与存储类
【8月更文第29天】随着容器化的普及,越来越多的应用程序需要持久化数据以保持状态信息。Kubernetes 提供了一套完整的解决方案来管理和配置持久化存储,包括持久卷 (Persistent Volume, PV)、持久卷声明 (Persistent Volume Claim, PVC) 和存储类 (StorageClass)。本文将详细介绍这些概念,并通过实际示例来演示如何在 Kubernetes 中配置存储。
380 1
|
1月前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
4月前
|
存储 Kubernetes 容器
k8s创建NFS动态存储
k8s创建NFS动态存储
|
4月前
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
4月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
4月前
|
Prometheus Kubernetes 监控
在K8S中,DaemonSet类型的资源特性有哪些?
在K8S中,DaemonSet类型的资源特性有哪些?
|
4月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
4月前
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如果后端nfs存储的ip发生变化如何解决?
在K8S中,如果后端nfs存储的ip发生变化如何解决?
|
4月前
|
存储 缓存 Kubernetes
在K8S中,业务Pod数据如何存储?
在K8S中,业务Pod数据如何存储?