kubernetes数据持久化PV-PVC详解(一) [复制链接]
发表于 2022-11-28 02:51:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
官方文档地址: https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
1. 什么是PV,PVC?

1.1 什么是PV

PresistentVolume(PV)是指集群管理员配置提供的某存储系统上的一段存储空间,它是对底层共享存储的抽象,将共享存储作为一种可由用户申请使用的资源,实现"存储消费"机制,通过存储插件,PV支持使用多种网络存储等多种后端存储系统,例如,NFS、CephFS、RBD。PV是集群级别的资源,不属于任何名称空间,用户对PV资源的使用需要通过PersistentVolumeClaim(PVC)提供的使用申请来完成绑定,PVC是PV资源的消费者,它向PV申请特定大小的空间及访问模式(rw或ro)从而创建出PVC存储卷。然后再由Pod资源通过PersistentVolumeClaim存储卷关联使用。
1.2 什么是PVC?

PersistentVolumeClaim,PVC是存储卷类型的资源,它通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关心其底层实现细节,申请时,用户只需要指定目标空间的大小,访问模式,PV标签选择器和StorageClass等相关信息即可。
2. PV资源实践;

2.1 PV配置字段详解

PresistentVolume Spec支持如下几个通用字段,用于定义PV的容量,访问模式和回收策。
1.Capacity: PV的容量
2.volumeMode: 卷类型,用于指定此卷可被用作文件系统还是裸格式的块设备,默认为Filesystem。
3.accessMode: PV的访问模式参考官方

  • 1.ReadWriteOnce: 仅可被单个节点读写挂载;命令行中简写RWO。
  • 2.ReadOnlyMany: 仅可被多个节点同时只读挂在;命令行简写ROX。
  • 3.ReadyWriteMany: 可被多个节点同时读写挂载;命令行中简写RWX。
4.persistentVolumeReclaimPolicy: PV空间的处理机制,可用类型为Retain(默认)、Recycle或Delete。

  • 1.Retain: 保持不动,由管理员手动回收。
  • 2.Recycle: 空间回收,即删除存储卷下的所有文件(包括子目录和隐藏文件rm -rf /thevolume/*),目前仅NFS和hostpath支持此功能
  • 3.Delete: 删除存储卷,诸如 AWS EBS、GCE PD、Azure Disk 或 OpenStack Cinder 卷这类关联存储资产也被删除。
5.storageClassName: 当前PV所属的StorageClass的名称,默认为空,即不属于任何StorageClass。
6.mountOptions: 挂载选项组成的列表,如ro,soft和hard等。
2.2 HostPath PV示例
  1. [root@kn-server-master01-13 pv]# cat hostpath-pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv-volume-001   
  6. spec:
  7.   storageClassName: "host-storage"   资源类型的标识
  8.   persistentVolumeReclaimPolicy: "Retain"  回收策略默认为Retain
  9.   capacity:    定义空间
  10.     storage: 1Gi  定义空间大小
  11.   accessModes:    访问模式
  12.     - ReadWriteOnce  访问模式为仅被单个节点读写挂载,单路读写
  13.   hostPath:     临时存储在哪个地方
  14.     path: "/mnt/data"
  15. [root@kn-server-master01-13 pv]# kubectl get pv
  16. NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  17. pv-volume-001   1Gi        RWO            Retain           Available           host-storage            4m36s
复制代码
2.2 NFS PV示例
  1. [root@kn-server-master01-13 pv]# cat nfs-pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: nfs-pv
  6.   labels:     标签
  7.     release: nfs-redis
  8. spec:
  9.   storageClassName: "nfs-storage"  资源类型表示
  10.   persistentVolumeReclaimPolicy: "Recycle"  回收策略为Recycle相当rm -rf /
  11.   capacity:
  12.     storage: 0.5Gi
  13.   accessModes:
  14.   - ReadWriteMany
  15.   nfs:
  16.     server: 10.0.0.15
  17.     path: /data/redis
  18. [root@kn-server-master01-13 pv]# kubectl get pv
  19. NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
  20. nfs-pv          512Mi      RWX            Recycle          Available                     nfs-storage             62m
  21. pv-volume-001   1Gi        RWO            Retain           Bound       default/001-pvc   host-storage            160m
复制代码
3. PVC资源实践;

3.1 PVC配置清单详解。

PersistentVolumeClaim,PVC是存储卷类型的资源,它通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关心其底层实现细节, 申请时,用户只需要指定目标空间的大小,访问模式,PV标签选择器和StorageClass等相关信息即可。
PVC的Spec字段可嵌套字段如下,

  • accessMode: 当前PVC的访问模式,其可用模式与PV相同。
  • resource当前PVC存储卷需要占用的资源的最大和最小值。
  • selector绑定时对PV应用的标签选择器,matchlabels或者匹配表达式matchEx-pressions用于挑选要绑定的PV,如果同时指定来两种挑选机制,则必须同时满足两种选择机制的PV才能被选出。
  • storageClassName: 所依赖的存储卷的名称。
  • volumeName: 用于直接制定要绑定的PV的卷名。
3.2 hostPath-PVC示例
  1. [root@kn-server-master01-13 pv]# cat hostpath-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: 001-pvc
  6. spec:
  7.   storageClassName: "host-storage"  和PV的storageclassname须一致,否则无法识别。
  8.   accessModes:
  9.     - ReadWriteOnce
  10.   resources:     pvc的资源限定仅指其空间大小。
  11.     requests:
  12.       storage: 0.9Gi  大小为0.9Gi;
  13. [root@kn-server-master01-13 pv]#  kubectl apply -f hostpath-pvc.yaml
  14. Available: 可用状态的自由资源,尚未被绑定PVC。
  15. Bound: 已经绑定至某个PVC。
  16. Released: 绑定的PVC已经被删除,但资源尚被集群回收。
  17. Failed: 因自动回收资源失败而处于的故障状态。
  18. [root@kn-server-master01-13 pv]# kubectl get pv pv-volume-001
  19. NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
  20. pv-volume-001   1Gi        RWO            Retain           Bound    default/001-pvc   host-storage            33m
  21. [root@kn-server-master01-13 pv]# kubectl describe pv pv-volume-001
  22. Name:            pv-volume-001
  23. Labels:          <none>
  24. Annotations:     pv.kubernetes.io/bound-by-controller: yes
  25. Finalizers:      [kubernetes.io/pv-protection]
  26. StorageClass:    host-storage
  27. Status:          Bound
  28. Claim:           default/001-pvc
  29. Reclaim Policy:  Retain
  30. Access Modes:    RWO
  31. VolumeMode:      Filesystem
  32. Capacity:        1Gi
  33. Node Affinity:   <none>
  34. Message:         
  35. Source:
  36.     Type:          HostPath (bare host directory volume)
  37.     Path:          /mnt/data
  38.     HostPathType:  
  39. Events:            <none>
  40. [root@kn-server-master01-13 pv]# kubectl describe pvc 001-pvc
  41. Name:          001-pvc
  42. Namespace:     default
  43. StorageClass:  host-storage
  44. Status:        Bound   已绑定
  45. Volume:        pv-volume-001
  46. Labels:        <none>
  47. Annotations:   pv.kubernetes.io/bind-completed: yes
  48.                pv.kubernetes.io/bound-by-controller: yes
  49. Finalizers:    [kubernetes.io/pvc-protection]
  50. Capacity:      1Gi
  51. Access Modes:  RWO
  52. VolumeMode:    Filesystem
  53. Used By:       <none>
  54. Events:        <none>
复制代码
3.3 NFS-PV-PVC实践之准备NFS共享存储。

NFS即是网络文件系统,它是一种分布式文件系统协议,kubernetes中的NFS存储卷用于将某些事先存在的NFS服务器导出(export)的存储空间挂载到Pod中以供容器使用,与临时存储不同的是,NFS存储卷在Pod对象终止后仅仅是被卸载而非删除,NFS是文件系统级共享服务,它支持同时存在多路挂载,定义NFS存储卷时,常用如下字段。
server nfs服务器的地址或者主机名,必须字段。
pathnfs服务器导出(共享)的文件系统路径,必须字段。
readOnly是否以只读方式挂载,默认为false。
生产环境建议使用Ceph、azureDisk等公有云存储。
  1. [root@kn-server-node02-15 ~]# yum install nfs-utils -y
  2. [root@kn-server-node02-15 ~]# cat /etc/exports
  3. /nfs/data5/ 10.0.0.0/24(rw,no_root_squash)
  4. /data/redis 10.0.0.0/24
  5. 10.0.0.0/24  pod访问nfs服务会将源IP修改为节点IP,允许所有节点访问NFS服务
  6. (ro,no_root_squash)访问NFS-SERVER共享目录的用户如果是root,它对共享目录有root权限
  7. 准备数据共享目录
  8. [root@kn-server-node02-15 ~]# mkdir /data/redis -p
  9. [root@kn-server-node02-15 ~]# systemctl enable nfs-server
  10. Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
  11. 服务端配置
  12. 各个工作节点安装nfs-utils
  13. [root@kn-server-master01-13 pv]# showmount -e 10.0.0.15
  14. Export list for 10.0.0.15:
  15. /data/redis 10.0.0.0/24
  16. master节点和node节点都需要安装
  17. [root@kn-server-node01-14 ~]# showmount -e 10.0.0.15
  18. Export list for 10.0.0.15:
  19. /data/redis 10.0.0.0/24
复制代码
3.4 准备NFS-PVC
  1. [root@kn-server-master01-13 pv]# cat nfs-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: nfs-pvc
  6.   labels:    首先标签须匹配,不然无法匹配,也可以称为强行绑定。
  7.     release: nfs-redis
  8. spec:
  9.   storageClassName: "nfs-storage"  须同属一个
  10.   accessModes:
  11.   - ReadWriteMany
  12.   resources:
  13.     requests:
  14.       storage: 0.5Gi  指定大小。
  15. [root@kn-server-master01-13 pv]# kubectl apply -f nfs-pvc.yaml
  16. persistentvolumeclaim/nfs-pvc created
  17. 显示已为绑定状态。
  18. [root@kn-server-master01-13 pv]# kubectl get pv,pvc
  19. NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
  20. persistentvolume/nfs-pv          512Mi      RWX            Recycle          Bound    default/nfs-pvc   nfs-storage             78m
  21. persistentvolume/pv-volume-001   1Gi        RWO            Retain           Bound    default/001-pvc   host-storage            175m
  22. NAME                            STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  23. persistentvolumeclaim/001-pvc   Bound    pv-volume-001   1Gi        RWO            host-storage   143m
  24. persistentvolumeclaim/nfs-pvc   Bound    nfs-pv          512Mi      RWX            nfs-storage    6s
  25. 通过describe来查看
  26. [root@kn-server-master01-13 pv]# kubectl describe pv nfs-pv
  27. Name:            nfs-pv
  28. Labels:          release=nfs-redis   所属标签
  29. Annotations:     pv.kubernetes.io/bound-by-controller: yes
  30. Finalizers:      [kubernetes.io/pv-protection]
  31. StorageClass:    nfs-storage    storageclass名称
  32. Status:          Bound   绑定状态
  33. Claim:           default/nfs-pvc   名称空间
  34. Reclaim Policy:  Recycle  回收策略
  35. Access Modes:    RWX    访问模式
  36. VolumeMode:      Filesystem
  37. Capacity:        512Mi  大小
  38. Node Affinity:   <none>
  39. Message:         
  40. Source:
  41.     Type:      NFS (an NFS mount that lasts the lifetime of a pod)
  42.     Server:    10.0.0.15  来自那个nfs服务器
  43.     Path:      /data/redis   共享的数据目录
  44.     ReadOnly:  false
  45. Events:        <none>
复制代码
3.4.1准备Pod并使用PVC
  1. [root@kn-server-master01-13 pv]# cat pod-redis.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: redis
  6. spec:
  7.   containers:
  8.   - name: redis
  9.     image: redis
  10.     volumeMounts:
  11.     - name: redis-data
  12.       mountPath: /data
  13.   volumes:
  14.   - name: redis-data
  15.     persistentVolumeClaim:
  16.       claimName: nfs-pvc
  17.           
  18. [root@kn-server-master01-13 pv]# kubectl describe pods redis
  19. Containers:
  20.   redis:
  21.     Container ID:   docker://d82061a1a86f56432e9956fc46bc810e577a0d89b91894e266e883bef68f5d9d
  22.     Image:          redis
  23.     Image ID:       docker-pullable://redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
  24.     Port:           <none>
  25.     Host Port:      <none>
  26.     State:          Running
  27.       Started:      Sun, 27 Nov 2022 21:57:34 +0800
  28.     Ready:          True
  29.     Restart Count:  0
  30.     Environment:    <none>
  31.     Mounts:
  32.       /data from redis-data (rw)   已经挂载
  33.           
  34.           
  35. [root@kn-server-master01-13 pv]# kubectl describe pvc nfs-pvc
  36. Name:          nfs-pvc
  37. Namespace:     default
  38. StorageClass:  nfs-storage
  39. Status:        Bound
  40. Volume:        nfs-pv
  41. Labels:        release=nfs-redis
  42. Annotations:   pv.kubernetes.io/bind-completed: yes
  43.                pv.kubernetes.io/bound-by-controller: yes
  44. Finalizers:    [kubernetes.io/pvc-protection]
  45. Capacity:      512Mi
  46. Access Modes:  RWX
  47. VolumeMode:    Filesystem
  48. Used By:       redis  这里可以看到是redis这个Pod正在使用这个PVC
  49. Events:        <none>
复制代码
3.4.2 测试数据持久性。
  1. [root@kn-server-master01-13 pv]# redis-cli -h 192.168.1.86
  2. 192.168.1.86:6379> set key haitang
  3. OK
  4. 192.168.1.86:6379> get key
  5. "haitang"
  6. 192.168.1.86:6379> bgsave
  7. Background saving started
  8. 192.168.1.86:6379> exit
  9. 可以看到数据是写到nfs-server了
  10. [root@kn-server-node02-15 redis]# ll
  11. 总用量 4
  12. -rw-r--r-- 1 polkitd input 110 11月 27 22:14 dump.rdb
  13. 删除Pod后,数据是不会丢失的。
  14. [root@kn-server-master01-13 pv]# kubectl delete pods redis
  15. pod "redis" deleted
  16. 数据是还在的。
  17. [root@kn-server-node02-15 redis]# ll
  18. 总用量 4
  19. -rw-r--r-- 1 polkitd input 110 11月 27 22:20 dump.rdb
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表