特性
动态卷供给是kubernetes独有的功能,这一功能允许按需创建存储建。在此之前,集群管理员需要事先在集群外由存储提供者或者云提供商创建存储卷,
成功之后再创建PersistentVolume对象,才能够在kubernetes中使用。动态卷供给能让集群管理员不必进行预先创建存储卷,而是随着用户需求进行创建
。在1.5版本提高了动态卷的弹性和可用性。
在此前1.4版本中加入了一个 新的 API 对象 StorageClass,可以定义多个 StorageClass 对象,并可以分别指定存储插件、设置参数,用于提供不同的
存储卷。这样的设计让集群管理员能够在同一个集群内,定义和提供不同类型的、不同参数的卷(相同或者不同的存储系统)。这样的设计还确保了最终
用户在无需了解太多的情况下,有能力选择不同的存储选项。
aws ebs使用示例
需要满足以下条件方可使用EBS作为存储提供者:
- Pod运行的节点必须为AWS EC2实例
- 这些示例需要和EBS在同一个区域和可用区域
- EBS只支持一个EC2挂载一个卷
- Node节点需要有EBS挂载/卸载权限。
1. 定义1个StorageClass对象(SSD盘)
vim fast-storage-class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
zone: cn-north-1a
iopsPerGB: "10"
这里我们创建了一个名为"fast"的StorageClass。用于提供类似SSD的持久存储。
- type: EBS卷类型。io1, gp2, sc1, st1. See AWS docs for details. Default: gp2
- zone: Aws区域,如果未指定,则选择与kubernetes集群节点相同的随机区。
- iopsPerGB: 仅适用于io1类型的卷。IOPS/GB。
- encrypted: EBS卷是否应该被加密。有效值为"true" or "false"
- kmsKeyId: 可选.加密卷时要使用的秘钥的完整Amazon资源名称。如果没有提供秘钥,AWS将生成秘钥。
2.用户请求,定义1个pvc
用户在pvc中可以包含一个StorageClass申请动态提供存储。需要额外使用annotations注解来指定特定的ClassStorage:volume.beta.kubernetes.io/storage-class.其值必须符合之前配置StorageClass名称(比如fast)。
vim fast-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
annotations:
volume.beta.kubernetes.io/storage-class: "fast"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
accessModes:
当pvc请求特定访问模式的存储时,声明使用与pv卷相同的约定。Resources:
类型Pod,可以请求特定数额的资源。-
Selector:
支持标签选择器进一步筛选卷的集合,只有与标签选择器匹配的卷才能绑定到pvc,选择器由如下2个字段组成: - metchLabels 卷必须带有匹配的标签,才能被绑定 - matchExpressions 支持标签筛选扩展属性,通过指定键、值以及与键值相关的运算符所得结果的匹配列表。
通过我们pvc的描述,名为fast的StorageClass会提供一个等效于SSD的持久盘,当这个PVC被删除,这个卷也随之销毁。
缺省StorageClass(DefaultStorageClass)
所有的 PVC 都可以在不使用 StorageClass 注解的情况下,直接使用某个动态存储。把一个StorageClass 对象标记为 “default” 就可以了。StorageClass 用注解storageclass.beta.kubernetes.io/is-default-class: "true" 就可以成为缺省存储。
有了缺省的 StorageClass,用户创建 PVC 就不用 storage-class 的注解了,1.4 起新加入的DefaultStorageClass 准入控制器会自动把这个标注指向缺省存储类。需要在准入控制插件添加缺省存储插件:
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota
测试:
动态卷:
1. 创建pvc,挂载到单个Pod,迁移Pod,日志会提示卷已被挂载到运行pod之前的ec2上,但几分钟依然会迁移成功,并且挂载卷成功.
2. 创建pvc,挂载到多个个Pod. 仅支持单个副本集。
3. 正常使用下,删除Pod,挂载pvc到新的Pod. 功能正常
4.正常使用下,删除pvc,pv 回收策略为Delete(EBS的回收策略只支持Delete),状态为Released,Pod挂载的卷功能依然不受影响。然后,删除PV,Pod挂载的卷功能依然不受影响,此时AWS ebs卷改为available.此时若要继续使用此卷,需要静态PV指定EBS 卷ID。
5. 创建pvc之后。删除pv卷,此时pvc状态为Lost,同时aws ebs卷依然为In-use,未被卸载。
6. 当删除pvc时,pv reclaim 策略默认为delete。所以这个卷也随之销毁(自动删除pv,自动删除EBS这个卷),这个得注意.
PV自动扩容,目前不支持。
删除说明
ebs->pv->pvc->pod
- 删除pod,ebs->pv->pvc依然存活
- 删除pod,删除pvc,将直接自动删除pv及ebs存储卷
- 删除pv或者删除pvc,pod未删除,ebs状态:in-use且不会被删除,功能正常。其次删除pod,ebs状态:available。