上文中通过实现创建PV,然后与PVC进行绑定。实际上,可以用更简便的方法实现PVC的绑定,而不用提前声明PV,实现动态绑定。
动态绑定
在Kubernetes(K8s)中,要实现PVC(PersistentVolumeClaim)动态绑定PV(PersistentVolume),通常涉及以下几个步骤和要点:
- 理解PVC和PV:
- PVC:是K8s中用户对于存储资源的请求。用户可以通过PVC请求特定的大小和访问模式(如ReadWriteOnce、ReadOnlyMany等)。
- PV:是K8s集群中的一块网络存储,可以被Pod用作持久化卷。PV是由管理员创建和配置的,然后集群中的用户可以请求该存储资源。
- 使用StorageClass:
- 要实现PVC的动态绑定,通常会使用StorageClass。StorageClass是一个API资源,它定义了如何动态地为PVC提供存储卷。StorageClass中指定了提供者(如NFS、EBS等)、参数和回收策略等信息。
- 当PVC创建时,如果它没有指定具体的PV来绑定,而是指定了一个StorageClass,那么K8s会基于这个StorageClass来动态地创建一个PV,并将其绑定到PVC上。
- 动态卷供应:
- 当PVC请求了StorageClass,并且集群中不存在满足条件的PV时,K8s会触发动态卷供应流程。
- 这个流程通常由存储类中的provisioner(供应者)来完成。Provisioner是负责实现动态供应逻辑的组件,它可以根据StorageClass中的定义来动态地创建PV。
- 绑定过程:
- 一旦PV被动态创建,K8s会将其与PVC进行绑定。绑定是基于PVC的请求和PV的属性(如存储大小、访问模式等)来完成的。
- 如果多个PVC可以绑定到同一个PV(这通常是不推荐的,因为PV通常是为特定PVC定制的),那么K8s会基于一些策略(如创建时间、请求大小等)来选择最合适的PVC进行绑定。
- 实现步骤:
- 创建StorageClass:定义一个StorageClass,指定提供者、参数和回收策略等。
- 创建PVC:在PVC的spec中指定storageClassName字段,其值为之前创建的StorageClass的名称。
- 触发动态供应:当PVC创建时,如果集群中没有合适的PV可供绑定,K8s会触发动态供应流程,根据StorageClass的定义来动态创建一个PV。
- PVC与PV绑定:一旦PV被创建,K8s会将其与PVC进行绑定。
- 注意事项:
- 确保StorageClass的provisioner是可用的,并且与你的存储系统兼容。
- PVC的请求属性(如存储大小和访问模式)必须与StorageClass中定义的PV的属性相匹配,否则无法成功绑定。
- 监控PVC和PV的状态,以确保它们已成功绑定并处于可用状态。
stroageClass
StorageClass是Kubernetes中的一个重要概念,主要用于动态创建和管理存储卷(PersistentVolume,简称PV)。以下是关于StorageClass的详细解释:
- 定义:
- StorageClass是Kubernetes资源类型的一种,由管理员为管理PV而按需创建的类别(逻辑组)。
- 它允许管理员根据存储系统的性能、综合服务质量级别、备份策略等标准进行分类,甚至按照自定义标准进行分类。
- 作用:
- 动态存储卷分配:根据StorageClass中定义的属性,Kubernetes可以动态地创建存储卷,无需手动创建和管理PV。
- 存储卷的属性管理:StorageClass定义了PV的属性,如存储类型、存储容量、访问模式等,以满足不同应用程序的存储需求。
- 存储资源管理:通过StorageClass,存储资源可以被分类管理,使开发者能够更轻松地根据应用程序的需求选择适当的存储。
- 组成部分:
- PV的属性:StorageClass定义了PV的属性,例如存储的大小、类型等。
- 存储插件:StorageClass还指定了创建这种PV需要使用到的存储插件,例如Ceph、NFS等。这些插件决定了PV的具体实现方式。
- 使用示例:
- 当用户提交一个PersistentVolumeClaim(PVC)请求时,Kubernetes会根据该PVC请求的属性和指定的StorageClass来查找匹配的StorageClass。
- 一旦找到匹配的StorageClass,Kubernetes就会调用该StorageClass声明的存储插件来创建出需要的PV,并将其绑定到PVC上。
- 关键字段:
- Provisioner:决定使用哪个卷插件制备PV。这是一个必须指定的字段,Kubernetes官方提供了多种内置的Provisioner,如AWSElasticBlockStore、AzureDisk、GCEPersistentDisk等。
- Parameters:用于定义存储插件所需的参数,例如NFS的服务器地址和共享目录等。
- Reclaim Policy:指定创建的PV的回收策略,可以是Delete(删除)或Retain(保留)。
- 示例:
- 例如使用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
使用这个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。
运行成功如图