k8s之PV、PVC

发布时间 2023-09-05 19:16:36作者: GaoYanbing

1. 前言

在k8s中,管理存储一直就是管理计算实例的问题。PersistentVolume系统为用户和集群管理人员提供了两个API,这两个API为用户屏蔽了底层存储的细节。这两个API对象就是PersistentVolume和PersistentVolumeClaim。

2. 介绍

PV是集群中的存储资源,由管理员提供或者通过 storage class 动态提供。PV是集群中的资源,就像集群中的node资源对象一样。PV的生命周期与使用PV的pod的生命周期没有任何关系。PV的实际存储可能是在NFS、iSCSI或者其他云存储系统中,它为用户屏蔽了实现存储的具体细节而对外抽象存储资源。

PVC是用户对于存储资源的请求。PVC和集群中的pod相似,pod消费node中的资源(cpu、memory等),而PVC则是消费PV中的资源。Pod可以指定特定数量的资源(cpu和内存),而PVC则可以请求指定大小的存储空间以及读写模式。

尽管PVC允许用户消费存储资源,但是用户通常需要多种属性的PV。因此,集群管理员需要在提供不同存储空间和读写模式的PV的同时为用户屏蔽实现细节。由于用户的需求多种多样,静态配置的PV难以满足用户的需求,因此就需要storge class根据用户的需求动态生成PV。

下面此图比较清晰的展示了PV和PVC的概念与关系

  • PV的具体存储由底层的NFS、CIFS、云存储集群等提供,数据均存储在这里。
  • 底层存储的具体实现细节会被管理员屏蔽,从而被抽象成为多个PV。这些PV有不同的属性,如存储空间大小不同、读写模式不同等属性
  • PV是管理员配置好的具有不同存储空间和读写权限的存储类型资源对象。就像是集群中的node资源一样,是待消费的资源。
  • PVC是用户对于存储类型资源的请求,是用户对于存储资源的需求
  • 当PVC创建后,k8s会从PV中选择一个和PVC进行匹配,用作此PVC的存储。

2. 生命周期

PV是k8s中集群中的资源;而PVC则是用户对于这些资源的请求。PV和PVC之间的关系如下图所示。

3. 动态和静态创建方式

Provisioning

有两种准备PV资源的方式:静态创建和动态创建

静态创建

集群管理员创建一系列PV,集群管理员需要负责这些PV的具体实现细节。这些创建的PV会存在于kubernetes集群中,就像是集群中的node资源一样,并且可以被PVC来消费。这里给出静态PV的资源清单并对重要的字段进行解释。

静态创建PV时主要包含以下三个步骤

  • 由集群管理员根据存储配置预分配PV对象;
  • 用户根据实际需求创建PVC对象。当用户创建PVC对象之后,集群会为PVC对象匹配合适的PV并进行绑定。将PV和PVC对象进行绑定后,PVC就可以作为存储资源来使用;
  • 用户将PVC作为存储对象挂载到Pod中进行使用。

 

 

动态创建

由于用户对于存储的需求多种多样,管理员维护的静态PV可能不能够完全匹配用户的PVC需求。此时,kubernetes集群可以尝试为PVC动态创建存储。动态存储依赖于storage class : 首先,需要管理员必须已经创建和设置了这个storage class以便于应对动态创建PV的情况,其次PVC必须请求这个storage class。而PVC中请求storage class的字段为空,就会使PVC失去动态请求storage class的能力。

为了开启PVC基于storage class来动态申请存储的功能,集群管理员需要在API server中开启 DefaultStorageClasss控制器。

动态创建过程主要包含如下三个步骤:

  • 集群管理员不再预分配PV对象,而是创建模板文件Storage Class。此模板文件是后面PVC对象申请存储资源时创建资源PV的模板;
  • 用户基于存储需求创建PVC对象,并在PVC的资源清单中指定创建存储的Storage Class名称。在提交完 PVC之后,K8s 集群中的相关组件就会根据 PVC 以及清单中对应的 StorageClass 动态生成 PV对象,并将PV和PVC 进行绑定;
  • 用户将PVC作为存储对象挂载到Pod中进行使用。

 

Binding

在k8s集群中,当请求指定存储空间和权限模式的PVC被创建之后,master中的控制循环(control loop)会基于list-watch机制监听到新创建的PVC,并且尽可能匹配对应的PV,如果匹配不到,就会基于定义来去确定是否动态创建PV以满足PVC,然后这个控制循环会将PV和PVC绑定在一起。用户得到的存储空间至少是用户申请的空间大小,也可能得到比他们申请的更多的空间

如果匹配不到对应的PV,PVC就会一直保持为未绑定,只有当PVC和PV绑定之后才可用。例如:集群提供了很多的50G的PV,那么申请100G的PVC就不会被绑定至PV。只有当集群中新增了100G的PV,PVC才会被绑定。

Using

pod将PVC作为存储来使用。