上文中通过实现创建PV,然后与PVC进行绑定。实际上,可以用更简便的方法实现PVC的绑定,而不用提前声明PV,实现动态绑定。

动态绑定

在Kubernetes(K8s)中,要实现PVC(PersistentVolumeClaim)动态绑定PV(PersistentVolume),通常涉及以下几个步骤和要点:

  1. 理解PVC和PV
  • PVC:是K8s中用户对于存储资源的请求。用户可以通过PVC请求特定的大小和访问模式(如ReadWriteOnce、ReadOnlyMany等)。
  • PV:是K8s集群中的一块网络存储,可以被Pod用作持久化卷。PV是由管理员创建和配置的,然后集群中的用户可以请求该存储资源。
  1. 使用StorageClass
  • 要实现PVC的动态绑定,通常会使用StorageClass。StorageClass是一个API资源,它定义了如何动态地为PVC提供存储卷。StorageClass中指定了提供者(如NFS、EBS等)、参数和回收策略等信息。
  • 当PVC创建时,如果它没有指定具体的PV来绑定,而是指定了一个StorageClass,那么K8s会基于这个StorageClass来动态地创建一个PV,并将其绑定到PVC上。
  1. 动态卷供应
  • 当PVC请求了StorageClass,并且集群中不存在满足条件的PV时,K8s会触发动态卷供应流程。
  • 这个流程通常由存储类中的provisioner(供应者)来完成。Provisioner是负责实现动态供应逻辑的组件,它可以根据StorageClass中的定义来动态地创建PV。
  1. 绑定过程
  • 一旦PV被动态创建,K8s会将其与PVC进行绑定。绑定是基于PVC的请求和PV的属性(如存储大小、访问模式等)来完成的。
  • 如果多个PVC可以绑定到同一个PV(这通常是不推荐的,因为PV通常是为特定PVC定制的),那么K8s会基于一些策略(如创建时间、请求大小等)来选择最合适的PVC进行绑定。
  1. 实现步骤
  • 创建StorageClass:定义一个StorageClass,指定提供者、参数和回收策略等。
  • 创建PVC:在PVC的spec中指定storageClassName字段,其值为之前创建的StorageClass的名称。
  • 触发动态供应:当PVC创建时,如果集群中没有合适的PV可供绑定,K8s会触发动态供应流程,根据StorageClass的定义来动态创建一个PV。
  • PVC与PV绑定:一旦PV被创建,K8s会将其与PVC进行绑定。
  1. 注意事项
  • 确保StorageClass的provisioner是可用的,并且与你的存储系统兼容。
  • PVC的请求属性(如存储大小和访问模式)必须与StorageClass中定义的PV的属性相匹配,否则无法成功绑定。
  • 监控PVC和PV的状态,以确保它们已成功绑定并处于可用状态。

stroageClass

StorageClass是Kubernetes中的一个重要概念,主要用于动态创建和管理存储卷(PersistentVolume,简称PV)。以下是关于StorageClass的详细解释:

  1. 定义
  • StorageClass是Kubernetes资源类型的一种,由管理员为管理PV而按需创建的类别(逻辑组)。
  • 它允许管理员根据存储系统的性能、综合服务质量级别、备份策略等标准进行分类,甚至按照自定义标准进行分类。
  1. 作用
  • 动态存储卷分配:根据StorageClass中定义的属性,Kubernetes可以动态地创建存储卷,无需手动创建和管理PV。
  • 存储卷的属性管理:StorageClass定义了PV的属性,如存储类型、存储容量、访问模式等,以满足不同应用程序的存储需求。
  • 存储资源管理:通过StorageClass,存储资源可以被分类管理,使开发者能够更轻松地根据应用程序的需求选择适当的存储。
  1. 组成部分
  • PV的属性:StorageClass定义了PV的属性,例如存储的大小、类型等。
  • 存储插件:StorageClass还指定了创建这种PV需要使用到的存储插件,例如Ceph、NFS等。这些插件决定了PV的具体实现方式。
  1. 使用示例
  • 当用户提交一个PersistentVolumeClaim(PVC)请求时,Kubernetes会根据该PVC请求的属性和指定的StorageClass来查找匹配的StorageClass。
  • 一旦找到匹配的StorageClass,Kubernetes就会调用该StorageClass声明的存储插件来创建出需要的PV,并将其绑定到PVC上。
  1. 关键字段
  • Provisioner:决定使用哪个卷插件制备PV。这是一个必须指定的字段,Kubernetes官方提供了多种内置的Provisioner,如AWSElasticBlockStore、AzureDisk、GCEPersistentDisk等。
  • Parameters:用于定义存储插件所需的参数,例如NFS的服务器地址和共享目录等。
  • Reclaim Policy:指定创建的PV的回收策略,可以是Delete(删除)或Retain(保留)。
  1. 示例
  • 例如使用NFS作为存储后端,需要部署一个nfs-client的自动装载程序(Provisioner)。这个程序会使用已经配置好的NFS服务器自动创建持久卷(PV)。

Provisoner示例

这里使用NFS Ganesha Server and Volume Provisioner.作为Provisioner

文档中提供了多种安装方式,这里就不在赘述。

提示,如果在安装过程中出现镜像拉取异常,可以考虑替换为国内镜像

registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 替换为

registry.cn-hangzhou.aliyuncs.com/iuxt/nfs-subdir-external-provisioner:v4.0.2

如果使用helm安装可以这样修改参数

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm install harbor-nfs-porvisoner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
 --set nfs.server=192.168.0.190  \
 --set nfs.path=/opt/nfs/data \
 --set image.repository=registry.cn-hangzhou.aliyuncs.com/iuxt/nfs-subdir-external-provisioner

其他参数详见README

创建好后会创建好一个storageClass  nfs-client

从0开始搞K8S:PV动态绑定与storageClass_pvc

使用这个storageClass可以尝试创建PVC,然后观察如何动态创建PV

创建PVC

这里采用storageClass方式创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default # 根据需要更改命名空间
spec:
  accessModes:
    - ReadWriteOnce # 根据需要选择访问模式
  storageClassName: nfs-client # 引用你的StorageClass
  resources:
    requests:
      storage: 10Mi # 请求的存储容量大小

如果出现pending,需要使用kubectl describe来具体查看问题原因。

如果是nfs权限文件,建议将nfs服务器对应目录权限修改为nobody。

运行成功如图

从0开始搞K8S:PV动态绑定与storageClass_stroageclass_02