找回密码
 立即注册
首页 业界区 业界 k8s存储

k8s存储

磁呃泵 昨天 20:29
存储


  • pod运行存储,删除pod的时候,pod里面写入的数据就没有了
一、本地存储

1、emptydir类型


  • 在pod所在的物理主机上生成的一个随机目录,也就是临时目录
  • pod容器删除后,临时目录也会被删除
  1. [root@k-master volume]# cat pod1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: pod1
  8.   name: pod1
  9. spec:
  10.   containers:
  11.   - image: nginx
  12.     imagePullPolicy: IfNotPresent
  13.     name: pod1
  14.     resources: {}
  15.     volumeMounts:
  16.     - name: v1  # 挂载v1的目录
  17.       mountPath: /data1 # 挂载到容器里面的/data1目录,不存在,会自动创建
  18.   volumes:
  19.   - name: v1 # 临时目录的名字为v1
  20.     emptyDir: {} # 创建一个临时目录
  21.   dnsPolicy: ClusterFirst
  22.   restartPolicy: Always
  23. status: {}
  24. # 创建pod之后,查看pod调度在哪一个节点上面了
  25. [root@k-master volume]# kubectl get pod -o wide
  26. NAME   READY   STATUS    RESTARTS   AGE     IP              NODE      NOMINATED NODE   READINESS GATES
  27. pod1   1/1     Running   0          4m50s   10.244.82.181   k-node1   <none>           <none>
  28. # 然后在node1上面查看pod1容器的详细信息
  29. [root@k-node1 v1]# crictl inspect 1a04aed59dd91 |grep -i mount -C3
  30.       "io.kubernetes.container.terminationMessagePolicy": "File",
  31.       "io.kubernetes.pod.terminationGracePeriod": "30"
  32.     },
  33.     "mounts": [
  34.       {
  35.         "containerPath": "/data1",
  36.         "hostPath": "/var/lib/kubelet/pods/99036af5-21a9-4af9-ac1c-f04e9c23dbed/volumes/kubernetes.io~empty-dir/v1",  # node1上面创建的临时目录
  37. --
  38.           "value": "443"
  39.         }
  40.       ],
  41.       "mounts": [
  42.         {
  43.           "container_path": "/data1",
  44.           "host_path": "/var/lib/kubelet/pods/99036af5-21a9-4af9-ac1c-f04e9c23dbed/volumes/kubernetes.io~empty-dir/v1"
  45. --
  46.       "root": {
  47.         "path": "rootfs"
  48.       },
  49.       "mounts": [
  50.         {
  51.           "destination": "/proc",
  52.           "type": "proc",
  53. --
  54.             "path": "/proc/13150/ns/uts"
  55.           },
  56.           {
  57.             "type": "mount"
  58.           },
  59.           {
  60.             "type": "network",
  61. # 进入这个临时目录即可
  62. [root@k-node1 v1]# pwd
  63. /var/lib/kubelet/pods/99036af5-21a9-4af9-ac1c-f04e9c23dbed/volumes/kubernetes.io~empty-dir/v1
  64. [root@k-node1 v1]# ls
  65. test
  66. # pod删除后,临时目录也就被删除了
复制代码
2、hostPath


  • 有一个缺点,当删除了node1上面的pod后,node1上面有一个挂载目录,当再次创建pod后,调度在node2上面,因此就不行了,不能实现挂载,因为挂载目录在node1上面
  • 就是不能在各个节点上面进行同步
  1. [root@k-master volume]# cat pod1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: pod1
  8.   name: pod1
  9. spec:
  10.   containers:
  11.   - image: nginx
  12.     imagePullPolicy: IfNotPresent
  13.     name: pod1
  14.     resources: {}
  15.     volumeMounts:
  16.     - name: v1
  17.       mountPath: /data1
  18.   volumes:
  19.   - name: v1
  20.     hostPath:
  21.        path: /d1  # 宿主机上不存在的话,会自动创建
  22.   dnsPolicy: ClusterFirst
  23.   restartPolicy: Always
  24. status: {}
  25. [root@k-master volume]# kubectl get pod -o wide
  26. NAME   READY   STATUS    RESTARTS   AGE    IP              NODE      NOMINATED NODE   READINESS GATES
  27. pod1   1/1     Running   0          4m2s   10.244.82.182   k-node1   <none>           <none>
  28. # 这个宿主机目录是在节点上面创建,删除了pod这个目录依然存在
  29. [root@k-node1 /]# ls -d d1
  30. d1
复制代码
二、网络存储

1、NFS


  • 就是不管我的pod在哪一个节点上面运行,都能存储数据,因此NFS服务就可以实现了
1、搭建一个nfs服务器


  • 我是在master机器上面搭建的
  1. [root@k-master nfsdata]# systemctl enable nfs-server --now
  2. Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
  3. [root@k-master ~]# mkdir /nfsdata
  4. mkdir /test
  5. chmod o+w /test # 需要加上权限,才能写入进去
  6. # 编写一个配置文件
  7. [root@k-master nfsdata]# cat /etc/exports
  8. /nfsdata *(rw)
  9. # 重启服务
复制代码
2、客户端挂载nfs
  1. # 测试NFS服务器是否正常了
  2. [root@k-master ~]# mount 192.168.50.100:/nfsdata /test
  3. [root@k-master ~]# df -hT /test
  4. Filesystem              Type  Size  Used Avail Use% Mounted on
  5. 192.168.50.100:/nfsdata nfs4   50G  5.7G   44G  12% /test
复制代码
3、编写一个pod
  1. [root@k-master volume]# cat pod1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: pod1
  8.   name: pod1
  9. spec:
  10.   containers:
  11.   - image: nginx
  12.     imagePullPolicy: IfNotPresent
  13.     name: pod1
  14.     resources: {}
  15.     volumeMounts:
  16.     - name: v1
  17.       mountPath: /data1
  18.   volumes:
  19.   - name: v1
  20.     nfs:
  21.       path: /nfsdata  # nfs服务器挂载的目录,将这个目录挂载到容器里面了,
  22.       server: 192.168.50.100  # nfs服务器地址
  23.   dnsPolicy: ClusterFirst
  24.   restartPolicy: Always
  25. status: {}
复制代码
4、查看nfs挂载目录
  1. [root@k-master ~]# ls /nfsdata/
  2. 1.txt  2.txt  4.txt
复制代码
2、isccsi存储


  • 分一个区20G
  • 防火墙要关闭
  1. [root@k-master ~]# lsblk
  2. NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
  3. sr0                 11:0    1 12.8G  0 rom  
  4. nvme0n1            259:0    0   50G  0 disk
  5. ├─nvme0n1p1        259:1    0  500M  0 part /boot
  6. └─nvme0n1p2        259:2    0 49.5G  0 part
  7.   └─cs_docker-root 253:0    0 49.5G  0 lvm  /
  8. nvme0n2            259:3    0   20G  0 disk
  9. └─nvme0n2p1        259:4    0   20G  0 part
复制代码
2、安装target包
  1. [root@k-master ~]# yum -y install target*
  2. [root@k-master ~]# systemctl enable target --now
  3. Created symlink /etc/systemd/system/multi-user.target.wants/target.service → /usr/lib/systemd/system/target.service.
复制代码
3、配置iscsi
  1. # 刚分区的盘不需要做格式化
  2. [root@k-master ~]# targetcli
  3. Warning: Could not load preferences file /root/.targetcli/prefs.bin.
  4. targetcli shell version 2.1.53
  5. Copyright 2011-2013 by Datera, Inc and others.
  6. For help on commands, type 'help'.
  7. /> ls /
  8. o- / ......................................................... [...]
  9.   o- backstores .............................................. [...]
  10.   | o- block .................................. [Storage Objects: 0]
  11.   | o- fileio ................................. [Storage Objects: 0]
  12.   | o- pscsi .................................. [Storage Objects: 0]
  13.   | o- ramdisk ................................ [Storage Objects: 0]
  14.   o- iscsi ............................................ [Targets: 0]
  15.   o- loopback ......................................... [Targets: 0]
  16. # 创建一个block1
  17. /> /backstores/block  create block1 /dev/nvme0n2p1
  18. Created block storage object block1 using /dev/nvme0n2p1.
  19. /> ls /
  20. o- / ......................................................... [...]
  21.   o- backstores .............................................. [...]
  22.   | o- block .................................. [Storage Objects: 1]
  23.   | | o- block1 .. [/dev/nvme0n2p1 (20.0GiB) write-thru deactivated]
  24.   | |   o- alua ................................... [ALUA Groups: 1]
  25.   | |     o- default_tg_pt_gp ....... [ALUA state: Active/optimized]
  26.   | o- fileio ................................. [Storage Objects: 0]
  27.   | o- pscsi .................................. [Storage Objects: 0]
  28.   | o- ramdisk ................................ [Storage Objects: 0]
  29.   o- iscsi ............................................ [Targets: 0]
  30.   o- loopback ......................................... [Targets: 0]
  31. />
  32. # 添加一个iscsi驱动器,有严格的格式要求
  33. /> /iscsi  create iqn.2023-03.com.memeda:memeda
  34. Created target iqn.2023-03.com.memeda:memeda.
  35. Created TPG 1.
  36. Global pref auto_add_default_portal=true
  37. Created default portal listening on all IPs (0.0.0.0), port 3260.
  38. />
  39. /> cd iscsi/iqn.2023-03.com.memeda:memeda/tpg1/
  40. /iscsi/iqn.20...a:memeda/tpg1> ls
  41. o- tpg1 ..................................... [no-gen-acls, no-auth]
  42.   o- acls ................................................ [ACLs: 0]
  43.   o- luns ................................................ [LUNs: 0]
  44.   o- portals .......................................... [Portals: 1]
  45.     o- 0.0.0.0:3260 ........................................... [OK]
  46. /iscsi/iqn.20...a:memeda/tpg1>
  47. /iscsi/iqn.20...a:memeda/tpg1> luns/ create /backstores/block/block1
  48. Created LUN 0.
  49. /iscsi/iqn.20...a:memeda/tpg1> ls
  50. o- tpg1 ..................................... [no-gen-acls, no-auth]
  51.   o- acls ................................................ [ACLs: 0]
  52.   o- luns ................................................ [LUNs: 1]
  53.   | o- lun0 ..... [block/block1 (/dev/nvme0n2p1) (default_tg_pt_gp)]
  54.   o- portals .......................................... [Portals: 1]
  55.     o- 0.0.0.0:3260 ........................................... [OK]
  56. /iscsi/iqn.20...a:memeda/tpg1>
  57. /iscsi/iqn.20...a:memeda/tpg1> acls/ create iqn.2023-03.com.memeda:acl
  58. Created Node ACL for iqn.2023-03.com.memeda:acl
  59. Created mapped LUN 0.
  60. /iscsi/iqn.20...a:memeda/tpg1> ls
  61. o- tpg1 ..................................... [no-gen-acls, no-auth]
  62.   o- acls ................................................ [ACLs: 1]
  63.   | o- iqn.2023-03.com.memeda:acl ................. [Mapped LUNs: 1]
  64.   |   o- mapped_lun0 ...................... [lun0 block/block1 (rw)]
  65.   o- luns ................................................ [LUNs: 1]
  66.   | o- lun0 ..... [block/block1 (/dev/nvme0n2p1) (default_tg_pt_gp)]
  67.   o- portals .......................................... [Portals: 1]
  68.     o- 0.0.0.0:3260 ........................................... [OK]
  69. /iscsi/iqn.20...a:memeda/tpg1>
  70. /iscsi/iqn.20...a:memeda/tpg1> exit
  71. Global pref auto_save_on_exit=true
  72. Configuration saved to /etc/target/saveconfig.json
复制代码
4、客户端安装iscsi客户端
  1. [root@k-node1 ~]# yum -y install iscsi*
  2. [root@k-node1 ~]# cat /etc/iscsi/initiatorname.iscsi
  3. InitiatorName=iqn.1994-05.com.redhat:56a1ef745c4e
  4. # 修改这个iscsi号
  5. [root@k-node2 ~]# cat /etc/iscsi/initiatorname.iscsi
  6. InitiatorName=iqn.2023-03.com.memeda:acl
  7. # 重启iscsid服务
复制代码
5、编写pod配置文件
  1. [root@k-master volume]# cat pod1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: pod1
  8.   name: pod1
  9. spec:
  10.   containers:
  11.   - image: nginx
  12.     imagePullPolicy: IfNotPresent
  13.     name: pod1
  14.     resources: {}
  15.     volumeMounts:
  16.     - name: v1
  17.       mountPath: /data
  18.   volumes:
  19.   - name: v1
  20.     iscsi:
  21.       lun: 0
  22.       targetPortal: 192.168.50.100:3260
  23.       iqn: iqn.2023-03.com.memeda:memeda
  24.       readOnly: false
  25.   dnsPolicy: ClusterFirst
  26.   restartPolicy: Always
  27. status: {}
  28. # lun映射到node1上面的sad,然后映射到容器里面
  29. [root@k-node1 ~]# lsblk
  30. NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
  31. sda           8:0    0   20G  0 disk /var/lib/kubelet/pods/0a64972c-
  32. sr0          11:0    1 12.8G  0 rom  
  33. nvme0n1     259:0    0   50G  0 disk
  34. ├─nvme0n1p1 259:1    0  500M  0 part /boot
  35. └─nvme0n1p2 259:2    0 49.5G  0 part
  36.   └─cs_docker-root
  37.             253:0    0 49.5G  0 lvm  /
复制代码
三、持久化存储


  • pv和pvc
  • 底层用的还是传统存储
  • pv就是一个一个块,pvc就是使用这个块的
  • pvc与pv进行绑定
1.png

1、pv和pvc


  • pv底层还是使用的存储,nfs或者iscsi存储,或者其他的,把他做成了一个pv
  • pv做成了之后,是公共的,所有名称空间下都能看到,全局可见的
  • 在一个名称空间下面创建一个pvc绑定pv
  • 在一个名称空间下面创建一个pod绑定pvc就能使用了
2、pv和pvc实验(静态创建)


  • nfs充当底层存储
  • 首先搭建一个nfs服务
1、创建pv
  1. [root@k-master volume]# cat pv1.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv01
  6. spec:
  7.   capacity: # 指定这个pv的大小
  8.     storage: 5Gi
  9.   accessModes: # 模式
  10.   - ReadWriteOnce
  11.   nfs:
  12.     server: 192.168.50.100 # 这个pv使用的就是nfs的存储
  13.     path: /nfsdata
  14. [root@k-master volume]# kubectl get pv
  15. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  16. pv01   5Gi        RWO            Retain           Available                                   2m19s
  17. # Retain 是回收的策略
  18. # Available 可用的
  19. # RWO 权限
  20. # claim为空的,表示pvc还没有绑定
复制代码
1、pv的策略


  • persistentVolumeReclaimPolicy 字段控制
  • retain策略,保留策略
  • 删除pod,pvc,里面的数据是保留的,pv也是保留的
  • 静态的创建pv和pvc的话,策略默认是reatin
  1. # 首先删除pod,然后删除pvc,pv状态就变成了released状态了
  2. # 如果在创建一个pvc的话,就不能绑定了,因为状态必须是available
  3. # 如果还要再次使用这个pv的话,就删除这个pv,在创建一个pv,绑定底层的nfs数据
复制代码

  • delete策略

    • 删除了pod,pvc的话,pv也会被删除掉
    • 里面的数据也会被删除掉
    • delete策略,只能用动态配置,静态配置不能

  • recycle策略被弃用了
2、pv的状态

状态名含义常见触发场景Available尚未被任何 PVC 绑定,可被申领刚创建出来,或回收策略为 Retain 且已被解除绑定Bound已与某条 PVC 成功绑定kubectl get pv 最常见的状态Released绑定的 PVC 已被删除,但 PV 尚未被回收ReclaimPolicy=Retain 时,PVC 删除后 PV 进入此状态Failed自动回收(Recycle/Delete)操作失败例如底层存储删除卷时返回错误3、pv的访问模式


  • ReadWriteOnce   RWO  单节点读写
  • ReadOnlyMany  ROX  多节点只读
  • ReadWriteMany  RWX  多节点读写
  • ReadWriteOncePod  单节点pod读写
访问模式全称含义典型场景ReadWriteOnceRWO单节点读写大多数块存储(EBS、Ceph RBD、iSCSI);一个节点挂载,可读写。ReadOnlyManyROX多节点只读共享文件存储(NFS、CephFS、GlusterFS);多个节点可同时挂载读取。ReadWriteManyRWX多节点读写分布式文件系统(NFS、CephFS、Portworx);多个节点同时挂载读写。ReadWriteOncePodRWOP单节点单 Pod 读写1.22+ 引入,针对 CSI 卷;同一节点上只允许一个 Pod 挂载读写,适合 StatefulSet 精细化调度。2、创建pvc


  • 一个pv只能与一个pvc进行绑定
  1. [root@k-master volume]# cat pvc1.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc-1
  6. spec:
  7.   accessModes:
  8.   - ReadWriteOnce # 权限
  9.   resources:
  10.     requests:  # 需要的大小
  11.       storage: 5Gi
  12. # 通过权限和大小进行匹配pv
  13. # 多个相同的pvc的话,就是随机匹配pvc
  14. # 一个pv只能被一个pvc进行绑定
  15. # pvc的容量小于等于pv的容量才能匹配到
  16. # 如果有多个pvc的话,那就需要看谁创建的快,就先匹配
  17. [root@k-master volume]# kubectl get pvc
  18. NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  19. pvc-1   Bound    pv01     5Gi        RWO                           52s
  20. [root@k-master volume]# kubectl get pv
  21. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM           STORAGECLASS   REASON   AGE
  22. pv01   5Gi        RWO            Retain           Bound    default/pvc-1                           7m14s
复制代码
1、pvc的状态

状态名含义常见触发场景Pending尚未找到/绑定到合适的 PV集群里没有匹配容量、AccessMode、StorageClass 的 PV;或动态供给未就绪Bound已成功绑定到一个 PV正常使用的常态Lost所绑定的 PV 意外消失(对象被删除或后端存储不可用)手动删除 PV 或底层存储故障TerminatingPVC 正在删除中(对象处于 metadata.deletionTimestamp 非空)执行 kubectl delete pvc 后,等待回收或 finalizer 完成3、pv和pvc绑定


  • 受到权限和大小和storagename(存储类名称,标识)这个三个参数的影响
  • storagename是优先级最高的,即使满足权限和大小,pvc没有这个storageClassName的话,就不能绑定,只有pvc有这个storageClassName的才能绑定
  1. [root@k-master volume]# cat pv2.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv02
  6. spec:
  7.   storageClassName: abc  # 存储卷的名称为abc
  8.   capacity:
  9.     storage: 5Gi
  10.   accessModes:
  11.   - ReadWriteOnce
  12.   nfs:
  13.     server: 192.168.50.100
  14.     path: /nfsdata
  15. [root@k-master volume]# cat pvc2.yaml
  16. apiVersion: v1
  17. kind: PersistentVolumeClaim
  18. metadata:
  19.   name: pvc-2
  20. spec:
  21.   accessModes:
  22.   - ReadWriteOnce
  23.   resources:
  24.     requests:
  25.       storage: 5Gi
  26. [root@k-master volume]# kubectl get pv
  27. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  28. pv02   5Gi        RWO            Retain           Available           abc                     49s
  29. [root@k-master volume]# kubectl get pvc
  30. NAME    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  31. pvc-2   Pending                                                     25s
  32. # 只有这个pvc有storageClassName才能匹配到
复制代码
4、pod使用pvc
  1. [root@k-master volume]# cat pod2.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   labels:
  6.     run: pod2
  7.   name: pod2
  8. spec:
  9.   containers:
  10.   - image: nginx
  11.     imagePullPolicy: IfNotPresent
  12.     name: pod2
  13.     resources: {}
  14.     volumeMounts:
  15.     - name: mypv
  16.       mountPath: /var/www/html  # 挂载到容器里面的/var/www/html目录下
  17.   restartPolicy: Always
  18.   volumes:
  19.   - name: mypv  # 卷的名字
  20.     persistentVolumeClaim:  # 用pvc来做这个卷
  21.       claimName: pvc-1  # pvc的名字
  22. status: {}
  23. [root@k-master volume]# kubectl get pod
  24. NAME   READY   STATUS    RESTARTS   AGE
  25. pod2   1/1     Running   0          2m22s
  26. [root@k-master ~]# kubectl exec -ti pod2 -- /bin/bash
  27. # 查看挂载点
  28. root@pod2:/var/www/html# df -hT /var/www/html/
  29. Filesystem              Type  Size  Used Avail Use% Mounted on
  30. 192.168.50.100:/nfsdata nfs4   50G  5.7G   44G  12% /var/www/html
  31. # 写入数据
  32. root@pod2:/var/www/html# echo 1 > 1.txt
  33. # 发现,最底层的作为pv的nfs存储里面也有数据
  34. [root@k-master volume]# ls /nfsdata/
  35. 1.txt
  36. # 这个pod调度在node1节点上,也可以查看到挂载的情况
  37. # 这个pod的挂载目录也会创建出来的
  38. [root@k-node1 pv01]# df -hT  | grep -i nfs
  39. 192.168.50.100:/nfsdata    nfs4       50G  5.7G   44G  12% /var/lib/kubelet/pods/2ce30dc7-4076-482f-9d78-d5af92d03967/volumes/kubernetes.io~nfs/pv01
  40. [root@k-node1 pv01]# cd /var/lib/kubelet/pods/2ce30dc7-4076-482f-9d78-d5af92d03967/volumes/kubernetes.io~nfs/pv01
  41. [root@k-node1 pv01]# ls
  42. 1.txt  2.txt
复制代码
5、删除pod,pv的状态


  • 怎么处理
  1. [root@k-master volume]# kubectl delete -f pod2.yaml
  2. pod "pod2" deleted
  3. [root@k-master volume]# kubectl delete -f pvc1.yaml
  4. persistentvolumeclaim "pvc-1" deleted
  5. # pv的状态为released
  6. [root@k-master volume]# kubectl get pv
  7. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM           STORAGECLASS   REASON   AGE
  8. pv01   5Gi        RWO            Retain           Released   default/pvc-1                           81s
  9. # 删除relf下面的字段,就能重新变成available了
  10. [root@k-master volume]# kubectl edit pv pv01
  11. persistentvolume/pv01 edited
  12. [root@k-master volume]# kubectl get pv
  13. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
  14. pv01   5Gi        RWO            Retain           Available                                   2m26s
  15. # 或者删除pv,然后重新创建即可
复制代码
3、pv和pvc和pod


  • 首先pv是一个块,底层使用的是一个存储,用来做成pv,使用nfs也可以,或者其他的
  • pvc用来绑定一个pv,一个pv只能绑定一个pvc
  • pod的持久化存储的话,就是使用的pvc来实现的,pvc挂载到容器的目录下
  • 在这个目录下面写入数据的话,就写入到了最底层的存储里面了
  • 其实pv和pvc都是虚拟出来的,最底层的还是一个存储
  • pv和pvc方便集中管理
  • 最底层的nfs或者其他的也可以管理,也就是分权管理
  • 也就是多级映射关系,抽象出来的
  • 最底层的nfs,映射到pv,pv映射到pvc,最后以卷的形式挂载到pod里面即可
3、nfs配置动态卷的供应流程


  • 就是在定义pvc的时候,自动的创建出pv
  • 依靠的就是nfs驱动器
  • 默认的pv策略是delete,可以修改的为retain
  • 创建一个存储类,映射到nfs存储,然后创建一个pvc就会自动的创建一个pv
1、配置nfs服务器
  1. [root@k-master ~]# cat /etc/exports
  2. /nfsdata *(rw)
复制代码
2、配置nfs驱动
  1. # 先git clone 一些这个文件
  2. [root@k-master nfs-deploy]# git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
  3. # 进入到deploy目录下
  4. [root@k-master deploy]# pwd
  5. /root/volume/nfs-deploy/nfs-subdir-external-provisioner/deploy
  6. # 如果名称空间不是默认的default的话,需要修改名称空间,如果是默认的则无需操作
  7. [root@k-master deploy]# ls
  8. class.yaml       kustomization.yaml  rbac.yaml        test-pod.yaml
  9. deployment.yaml  objects             test-claim.yaml
  10. [root@k-master deploy]# kubectl apply -f rbac.yaml
  11. serviceaccount/nfs-client-provisioner created
  12. clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
  13. clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
  14. role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
  15. rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
  16. # 修改了deployment.yaml
  17.         - name: nfs-client-provisioner
  18.           image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
  19. # 如果可以拉取到这个镜像,就无需修改,不行的话,就需要更换镜像
  20. registry.cn-hangzhou.aliyuncs.com/cloudcs/nfs-subdir-external-provisioner:v4.0.2
  21. # 这个是别人的网络仓库
  22. # 修改驱动文件中的nfs的一些配置,修改deployment.yaml
  23.             - name: NFS_SERVER
  24.               value: 192.168.50.100
  25.             - name: NFS_PATH
  26.               value: /nfsdata
  27.       volumes:
  28.         - name: nfs-client-root
  29.           nfs:
  30.             server: 192.168.50.100
  31.             path: /nfsdata
  32. [root@k-master deploy]# kubectl apply -f deployment.yaml
  33. deployment.apps/nfs-client-provisioner created
  34. [root@k-master deploy]# kubectl get pod
  35. NAME                                    READY   STATUS    RESTARTS   AGE
  36. nfs-client-provisioner-9f74c968-2lm9k   1/1     Running   0          15s
  37. # 这个pod就跟nfs存储做了一个映射,当创建一个pvc(使用的存储类是nfs-client)的时候,就会自动的创建一个pv
复制代码
3、创建一个存储类
  1. [root@k-master ~]# cat class.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: nfs-client
  6. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  7. parameters:
  8.   archiverOnDelete: "false"
  9. [root@k-master ~]# kubectl get sc
  10. NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  11. nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  37s
  12. [root@k-master ~]#
复制代码
4、创建一个pvc


  • 创建一个pvc就会自动的创建一个pv
  1. [root@k-master volume]# cat pvc3.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc3
  6. spec:
  7.   accessModes:
  8.   - ReadWriteOnce
  9.   storageClassName: nfs-client  # 使用的存储类是nfs-client,就会自动的创建pv
  10.   resources:
  11.     requests:
  12.        storage: 5Gi
  13.    
  14. [root@k-master volume]# kubectl get pv
  15. NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
  16. pvc-37889731-cc0f-4485-8647-0bc46a435faf   5Gi        RWO            Delete           Bound    default/pvc3   nfs-client              9s
  17. [root@k-master volume]# kubectl get pvc
  18. NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  19. pvc3   Bound    pvc-37889731-cc0f-4485-8647-0bc46a435faf   5Gi        RWO            nfs-client     13s
复制代码
5、创建一个pod
  1. [root@k-master volume]# cat pod2.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   labels:
  6.     run: pod2
  7.   name: pod2
  8. spec:
  9.   containers:
  10.   - image: nginx
  11.     imagePullPolicy: IfNotPresent
  12.     name: pod2
  13.     resources: {}
  14.     volumeMounts:
  15.     - name: mypv
  16.       mountPath: /var/www/html
  17.   restartPolicy: Always
  18.   volumes:
  19.   - name: mypv
  20.     persistentVolumeClaim:
  21.       claimName: pvc3
  22. status: {}
  23. [root@k-master volume]# kubectl get pod
  24. NAME                                    READY   STATUS    RESTARTS   AGE
  25. nfs-client-provisioner-9f74c968-2lm9k   1/1     Running   0          20m
  26. pod2                                    1/1     Running   0          70s
  27. # 就会在nfsdata这个目录创建一个目录用来存储数据
  28. [root@k-master volume]# ls /nfsdata/
  29. 1.txt  2.txt  default-pvc3-pvc-37889731-cc0f-4485-8647-0bc46a435faf
  30. # 写入一些数据
  31. [root@k-master volume]# ls /nfsdata/default-pvc3-pvc-37889731-cc0f-4485-8647-0bc46a435faf/
  32. 11  22
  33. # 删除pod和pvc
  34. [root@k-master volume]# kubectl delete -f pod2.yaml
  35. pod "pod2" deleted
  36. [root@k-master volume]# kubectl delete -f pvc3.yaml
  37. persistentvolumeclaim "pvc3" deleted
  38. # 这个nfs的目录的名字就会修改
  39. [root@k-master volume]# ls /nfsdata/
  40. archived-default-pvc3-pvc-3cd12cad-47a5-43f3-93a0-8e9a9d4a490c
  41. # 因为这个是delete策略导致的,防止数据立即丢失
复制代码
四、总结


  • 本地存储的话,比较笨重
  • 静态逻辑

    • 先有一个最底层的nfs服务器,可以让别人挂载这个目录
    • 然后创建一个pv,pvc之间进行绑定
    • 创建一个pod绑定pvc,从而写数据,写的数据存储在nfs这个目录下

  • 动态的逻辑

    • 创建一个nfs服务器
    • 创建一个nfs的驱动器,映射到nfs存储,使用的还是nfs存储
    • 然后创建一个存储类,驱动器使用的是上面创建的
    • 创建一个pvc,存储类使用的nfs-client,这个驱动器就会自动的创建一个pv,也就是在nfs存储目录里面划分一个目录用于存储
    • 创建一个pod进行绑定pvc即可


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册