简述
Volume是pod层面数据存储的抽象, 生命周期通常与 Pod 绑定 , 依赖pod存在 , 类型: emptydir ; hostpath ; nfs ; persistentVolume,
PersistentVolume,简称PV,是集群层面的数据持久化数据 , 生命周期独立于Pod ,必须配合PVC使用, 支持类型更多
PersistentVolumeClaim,简称PVC,是对存储资源的“声明”,它不直接创建PV
PVC与PV
PVC是PV的声明,PVC与PV一一对应,如果某个PV没有被PVC绑定,出于安全与解耦,pod无法直接使用PV,必须使用PVC间接引用PV
PVC与PV之间的绑定有2中模式,静态绑定与动态绑定,其与StorageClass相关,这个配置用于配置PV的来源,例如本机磁盘,远程存储,云SSD等等
静态绑定
提前创建好PV,k8s再根据PVC的要求从已经创建的PV中选择合适的PV绑定
要点:
PV与PVC指定的storageClass必须相同
kind: PersistentVolume # spec.storageClassName: "" 不指定默认为空或指定为空 kind: PersistentVolumeClaim spec.storageClassName: "" # 这个不能省略,因为省略会使用默认的storageClass,无法匹配storageClassName为空的PVPV如果不指定storageClass则默认null,只能绑定storageClass=" "的PVC(经常用)
PVC如果不指定storageClass则会使用默认的StorageClass,只能绑定到相同storageClass的PV
ps:很显然,没有人想记默认的storageClass是什么,所以使用静态绑定都会指定storageClass为空来让k8s去选择
PVC声明的是最小容量
kind: PersistentVolume spec.capacity: storage: 10Gi kind: PersistentVolumeClaim spec.resources.requests: storage: 8Gi如果PVC声明需要8g的PV,但是k8s绑定了10g的PV给它,那么这个10g空间PVC都可以使用,不会剩余2g空闲,但是这也可能造成空间的浪费
PV与PVC指定的accessModes访问形式
kind: PersistentVolume spec.accessModes: ["ReadWriteOnce","ReadOnlyMany"] kind: PersistentVolumeClaim spec.accessModes: ["ReadWriteOnce"]PV指定的accessModes是允许的访问方式,可以通过列表指定多个
PVC指定的accessModes是真正的使用方式,必须被PV支持,否则无法绑定
PV的使用
PV是一种数据卷,使用方法与其相同,使用volumeMounts进行挂载
spec: containers: volumeMounts: - name: data mountPath: /usr/share/nginx/html volumes: - name: data persistentVolumeClaim: # 指定PVC而不是PV claimName: my-pvc
动态绑定
不需要提前创建PV,指定PVC的需要指定可用的storageClass,k8s会自动从该源中创建适合PVC要求的PV
storageClass源
需要专门创建StorageClass类型的资源,设定使用的存储源例如阿里云ceph文件存储,详细yaml文档略,具体使用时可直接参考相应云设备的文档没有浪费
动态创建,PVC指定需要多大容量就会创建多大容量,不会出现静态绑定时PV与PVC空间不符的情况
StatefulSet与PVC
StatefulSet控制器一个重要的功能就是持久化的数据存储,这是由PVC与PV提供的功能
但是无论pod如何重启,始终使用同一个PV,这是StatefulSet控制器通过确保pod与PVC一一对应,间接保证pod一直使用同一个PV