k8s 中 PV 和 PVC 的生命周期
Kubernetes 对于有状态的容器应用或者对数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者 emptyDir 临时存储卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。
不过,存储资源和计算资源(CPU/内存)的管理方式完全不同。为了能够屏蔽底层存储实现的细节,让用户方便使用,同时让管理员方便管理,Kubernetes 从 1.0 版本就引入 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)两个资源对象来实现对存储的管理子系统。
PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。
某个 PV 在生命周期中可能处于以下 4 个阶段之一。
(1)Available:可用状态,还未与某个 PVC 绑定。
(2)Bound:已与某个 PVC 绑定。
(3)Released:绑定的 PVC 已经删除,资源已释放,但没有被集群回收。
(4)Failed:自动资源回收失败。
PVC 作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、PV 选择条件和存储类别等信息的设置。
1.PV 和 PVC 的生命周期一
可以将 PV 看作可用的存储资源,PVC 则是对存储资源的需求。
(1)资源供应 Kubernetes 支持两种资源的供应模式:静态模式(Static)和动态模式(Dynamic)。资源供应的结果就是创建好的 PV。
(2)静态模式。集群管理员手动创建许多 PV,在定义 PV 时需要将后端存储的特性进行设置。
(3)动态模式。集群管理员无须手动创建 PV,而是通过 StorageClass 的设置对后端存储进行描述,标记为某种类型。此时要求 PVC 对存储的类型进行声明,系统将自动完成 PV 的创建及与 PVC 的绑定。PVC 可以声明 Class 为"",说明该 PVC 禁止使用动态模式。
2.PV 和 PVC 的生命周期二
1)资源绑定
在用户定义好 PVC 后,系统将根据 PVC 对存储资源的请求(存储空间和访问模式)在已存在的 PV 中选择一个满足 PVC 要求的 PV,一旦找到,就将该 PV 与用户定义的 PVC 进行绑定,用户的应用就可以使用这个 PVC 了。
如果在系统中没有满足 PVC 要求的 PV,PVC 则会无限期处于 Pending 状态,直到系统管理员创建了一个符合其要求的 PV。PV 一旦绑定到某个 PVC 上,就会被这个 PVC 独占,不能再与其他 PVC 进行绑定了。
在这种情况下,当 PVC 申请的存储空间比 PV 的少时,整个 PV 的空间就都能够为 PVC 所用,可能会造成资源的浪费。如果资源供应使用的是动态模式,则系统在为 PVC 找到合适的 StorageClass 后,将自动创建一个 PV 并完成与 PVC 的绑定。
2)资源使用
Pod 使用 Volume 的定义,将 PVC 挂载到容器内的某个路径进行使用。Volume 的类型为 persistentVolumeClaim,在容器应用挂载了一个 PVC 后,就能被持续独占使用。不过,多个 Pod 可以挂载同一个 PVC,应用程序需要考虑多个实例共同访问一块存储空间的问题。
3)资源释放
当用户对存储资源使用完毕后,可以删除 PVC,与该 PVC 绑定的 PV 将会被标记为“已释放”,但还不能立刻与其他 PVC 进行绑定。通过之前 PVC 写入的数据可能还被留在存储设备上,只有在清除之后该 PV 才能再次使用。
4)资源回收
对于 PV,管理员可以设定回收策略,用于设置与之绑定的 PVC 释放资源之后如何处理遗留数据的问题。只有 PV 的存储空间完成回收,才能供新的 PVC 绑定和使用。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/08514dbbe0ea53303d79a85d2】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论