[关闭]
@zhangyy 2020-12-14T11:52:52.000000Z 字数 6602 阅读 283

kubernetes 的pv/pvc存储

kubernetes系列


  • 一: kubernetes的PV/PVC存储

一: kubernetes的PV/PVC存储

1.1 pv

  1. PersistentVolume PV
  2. 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV
  3. Volume 之类的卷插件,但具有独立于使用 PV Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS
  4. iSCSI 或特定于云供应商的存储系统

1.2 pvc

  1. PersistentVolumeClaim PVC
  2. 是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源
  3. CPU 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)

image_1e451l2vv1o2c18lj64veol9uc9.png-43.6kB


1.3 静态 pv

  1. 集群管理员创建一些 PV。它们带有可供群集用户使用的实际存储的细节。它们存在于 Kubernetes API 中,可用
  2. 于消费

1.4 动态

  1. 当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群可能会尝试动态地为 PVC 创建卷。此
  2. 配置基于 StorageClasses PVC 必须请求 [存储类],并且管理员必须创建并配置该类才能进行动态创建。声明该
  3. 类为 "" 可以有效地禁用其动态配置
  4. 要启用基于存储级别的动态存储配置,集群管理员需要启用 API server 上的 DefaultStorageClass [准入控制器]
  5. 。例如,通过确保 DefaultStorageClass 位于 API server 组件的 --admission-control 标志,使用逗号分隔的
  6. 有序值列表中,可以完成此操作

1.5 绑定

  1. master 中的控制环路监视新的 PVC,寻找匹配的 PV(如果可能),并将它们绑定在一起。如果为新的 PVC 动态
  2. 调配 PV,则该环路将始终将该 PV 绑定到 PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求
  3. 的数量。一旦 PV PVC 绑定后, PersistentVolumeClaim 绑定是排他性的,不管它们是如何绑定的。 PVC
  4. PV 绑定是一对一的映射

二 持久化卷声明的保护

  1. PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果被移除的话可能会导致数据丢失
  2. 当启用PVC 保护 alpha 功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC
  3. 删除将被推迟,直到 PVC 不再被任何 pod 使用

2.1 持久化卷类型

  1. PersistentVolume 类型以插件形式实现。Kubernetes 目前支持以下插件类型:
  2. GCEPersistentDisk AWSElasticBlockStore AzureFile AzureDisk FC (Fibre Channel)
  3. FlexVolume Flocker NFS iSCSI RBD (Ceph Block Device) CephFS
  4. Cinder (OpenStack block storage) Glusterfs VsphereVolume Quobyte Volumes
  5. HostPath VMware Photon Portworx Volumes ScaleIO Volumes StorageOS

2.2 持久卷演示代码

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv0003
  5. spec:
  6. capacity:
  7. storage: 5Gi
  8. volumeMode: Filesystem
  9. accessModes:
  10. - ReadWriteOnce
  11. persistentVolumeReclaimPolicy: Recycle
  12. storageClassName: slow
  13. mountOptions:
  14. - hard
  15. - nfsvers=4.1
  16. nfs:
  17. path: /tmp
  18. server: 172.17.0.2

2.3 PV 访问模式

  1. PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个
  2. PV 的访问模式都将被设置为该卷支持的特定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能
  3. 以只读方式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式

  1. ReadWriteOnce——该卷可以被单个节点以读/写模式挂载
  2. ReadOnlyMany——该卷可以被多个节点以只读模式挂载
  3. ReadWriteMany——该卷可以被多个节点以读/写模式挂载在命
  4. 在命令行中,访问模式缩写为:
  5. RWO - ReadWriteOnce
  6. ROX - ReadOnlyMany
  7. RWX - ReadWriteMany

image_1e452cmirlsg7b1fog1fselskm.png-138kB


2.4 回收策略

  1. Retain(保留)——手动回收
  2. Recycle(回收)——基本擦除( rm -rf /thevolume/* )
  3. Delete(删除)——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)
  4. 将被删除
  5. 当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略

2.5 状态

  1. 卷可以处于以下的某种状态:
  2. Available(可用)——一块空闲资源还没有被任何声明绑定
  3. Bound(已绑定)——卷已经被声明绑定
  4. Released(已释放)——声明被删除,但是资源还未被集群重新声明
  5. Failed(失败)——该卷的自动回收失败
  6. 命令行会显示绑定到 PV PVC 的名称

2.6 持久化nfs 部署 配置

  1. login node04.flyfish 配置nfs 服务
  2. ----
  3. yum install -y nfs* nfs-utils rpcbind
  4. mkdir /nfs
  5. chmod 777 /nfs
  6. chown nfsnobody /nfs
  7. cat /etc/exports
  8. /nfs *(rw,no_root_squash,no_all_squash,sync)
  9. systemctl start rpcbind
  10. systemctl start nfs

image_1e453g52f1r9a1c7ki451dukjrp13.png-173kB


  1. k8s 所有节点安装nfs 客户端的挂载包
  2. login : node01.flyfish
  3. yum install rpcbind nfs-utils
  4. mkdir /test
  5. showmount -e 192.168.100.14
  6. mount -t nfs 192.168.100.14:/nfs /test

image_1e453o21j1fg83kh74lk3m1nkg1g.png-97.8kB

image_1e453qtqq1lbk1qa1108kt9ianv2d.png-154.8kB

image_1e453r9ujfeeaci1mdsi54146c2q.png-25.6kB

image_1e453s1pcf7u4tv1hmp4oq11v137.png-64.3kB


  1. 配置pv
  2. vim pv.yaml
  3. ---
  4. apiVersion: v1
  5. kind: PersistentVolume
  6. metadata:
  7. name: nfspv1
  8. spec:
  9. capacity:
  10. storage: 10Gi
  11. accessModes:
  12. - ReadWriteOnce
  13. persistentVolumeReclaimPolicy: Retain
  14. storageClassName: nfs
  15. nfs:
  16. path: /nfs
  17. server: 192.168.100.14
  18. ---
  19. kubectl apply -f pv.yaml
  20. kubectl get pv

image_1e4547o5g1p3615211e63981nq23k.png-31.2kB

image_1e45485851vrv1l2qv7128l1glk41.png-46.4kB


  1. 多创建几个nfs pv
  2. ----
  3. login: node04.flyfish
  4. mkdir /nfs1 /nfs2 /nfs3
  5. chmod 777 /nfs1 /nfs2 /nfs3
  6. vim /etc/exportfs
  7. ---
  8. /nfs *(rw,no_root_squash,no_all_squash,sync)
  9. /nfs1 *(rw,no_root_squash,no_all_squash,sync)
  10. /nfs2 *(rw,no_root_squash,no_all_squash,sync)
  11. /nfs3 *(rw,no_root_squash,no_all_squash,sync)
  12. ---
  13. service rpcbind restart
  14. service nfs restart
  15. exportfs -V

image_1e455ektacg11qmludk2j179a4e.png-229.6kB
image_1e455fbft6se1lopiih15j8qsg4r.png-37.9kB


  1. vim pv1.yaml
  2. ------
  3. apiVersion: v1
  4. kind: PersistentVolume
  5. metadata:
  6. name: nfspv2
  7. spec:
  8. capacity:
  9. storage: 20Gi
  10. accessModes:
  11. - ReadOnlyMany
  12. persistentVolumeReclaimPolicy: Retain
  13. storageClassName: nfs
  14. nfs:
  15. path: /nfs1
  16. server: 192.168.100.14
  17. ---
  18. apiVersion: v1
  19. kind: PersistentVolume
  20. metadata:
  21. name: nfspv3
  22. spec:
  23. capacity:
  24. storage: 5Gi
  25. accessModes:
  26. - ReadWriteOnce
  27. persistentVolumeReclaimPolicy: Retain
  28. storageClassName: slow
  29. nfs:
  30. path: /nfs2
  31. server: 192.168.100.14
  32. ---
  33. apiVersion: v1
  34. kind: PersistentVolume
  35. metadata:
  36. name: nfspv4
  37. spec:
  38. capacity:
  39. storage: 10Gi
  40. accessModes:
  41. - ReadWriteMany
  42. persistentVolumeReclaimPolicy: Retain
  43. storageClassName: nfs
  44. nfs:
  45. path: /nfs3
  46. server: 192.168.100.14
  47. -----
  48. kubectl apply -f pv1.yaml
  49. kubectl get pv

image_1e455qo723p91qc6hhc1dcl1lqj58.png-105.1kB


  1. 创建PVC 应用
  2. ------
  3. vim pvc.yaml
  4. ---
  5. apiVersion: v1
  6. kind: Service
  7. metadata:
  8. name: nginx
  9. labels:
  10. app: nginx
  11. spec:
  12. ports:
  13. - port: 80
  14. name: web
  15. clusterIP: None
  16. selector:
  17. app: nginx
  18. ---
  19. apiVersion: apps/v1
  20. kind: StatefulSet
  21. metadata:
  22. name: web
  23. spec:
  24. selector:
  25. matchLabels:
  26. app: nginx
  27. serviceName: "nginx"
  28. replicas: 3
  29. template:
  30. metadata:
  31. labels:
  32. app: nginx
  33. spec:
  34. containers:
  35. - name: nginx
  36. image: wangyanglinux/myapp:v1
  37. ports:
  38. - containerPort: 80
  39. name: web
  40. volumeMounts:
  41. - name: www
  42. mountPath: /usr/share/nginx/html
  43. volumeClaimTemplates:
  44. - metadata:
  45. name: www
  46. spec:
  47. accessModes: [ "ReadWriteOnce" ]
  48. storageClassName: "nfs"
  49. resources:
  50. requests:
  51. storage: 1Gi
  52. ---
  53. kubectl apply -f pvc.yaml
  54. ---------
  55. kubectl get pod
  56. kubectl get pv
  57. kubectl get pvc

image_1e456cucv14nim58c4t1qep98b6l.png-50.6kB

image_1e456dve0bui1vb919i515as1idk72.png-78.4kB

image_1e456fcu21ibs185ciamcp81vqs7f.png-53.1kB


  1. 以上可以看出 这个 pvc pod 并没用创建 成功 要求的 副本数是3 只创建了一个 pod 因为 如果要在 创建pod 必须满足 accessModes: [ "ReadWriteOnce" ] storageClassName: "nfs" 这两个条件 ,但是 所创建的 pv 只有 nfsv1 同时满足 这样的条件 所以 只能创建 一个 pod
  2. kubectl get pod
  3. kubectl describe pod web-1

image_1e456nl761c157fh1t031ufjofo7s.png-79.4kB


  1. 如果想 创建成功 必须给 改变pv的类型 与控制权限
  2. 首先删掉nfspv3 nfspv4
  3. kubectl delete pv nfspv3
  4. kubectl delete pv nfspv4

image_1e4576f08j2bnkg5msmnpudl9p.png-140.9kB

  1. vim pv2.yaml
  2. ------
  3. apiVersion: v1
  4. kind: PersistentVolume
  5. metadata:
  6. name: nfspv3
  7. spec:
  8. capacity:
  9. storage: 30Gi
  10. accessModes:
  11. - ReadWriteOnce
  12. persistentVolumeReclaimPolicy: Retain
  13. storageClassName: nfs
  14. nfs:
  15. path: /nfs2
  16. server: 192.168.100.14
  17. ---
  18. apiVersion: v1
  19. kind: PersistentVolume
  20. metadata:
  21. name: nfspv4
  22. spec:
  23. capacity:
  24. storage: 10Gi
  25. accessModes:
  26. - ReadWriteOnce
  27. persistentVolumeReclaimPolicy: Retain
  28. storageClassName: nfs
  29. nfs:
  30. path: /nfs3
  31. server: 192.168.100.14
  32. ------
  33. kubectl apply -f pv2.yaml
  34. kubectl get pv

image_1e4577oth6qfsna1ajs13qjtkha6.png-102.7kB

  1. kubectl get pod

image_1e4578o3q14eu14101lf0152k1rneaj.png-60.7kB

  1. kubectl get pv
  2. kubectl get pvc

image_1e457ah427nm1l9b1abb13ocd1ib0.png-142.5kB


  1. kubectl describe pv nfspv1
  2. kubectl describe pv nfspv2
  3. kubectl descirbe pv nfspv3
  4. kubectl descirbe pv nfspv4

image_1e457f21p8e01a71duav5c4n6bd.png-148.4kB


image_1e457g5m21e14711jmn1cgv682bq.png-131.3kB

image_1e457h21f97o1nqq1pa517ooar3c7.png-151kB

image_1e457i3vj1711i8vb8n1o9m1n08ck.png-143.3kB


  1. kubectl get pv
  2. kubectl get pod -o wide

image_1e458801h3mp1ki61i4n1d5rc9de.png-126kB

  1. login node04.flyfish
  2. cd /nfs
  3. echo aaaaa > index.html
  4. cd /nfs2
  5. echo bbbb >> index.html
  6. cd /nfs3
  7. echo "web2 web2" >> index.html

  1. curl 10.244.1.6
  2. curl 10.244.2.8
  3. curl 10.244.2.7

image_1e458e6bj1cnhbc1159gp3r2idr.png-42.1kB


  1. kubectl delete pod web-0

image_1e458n30g19m7ocj14rp1la3ou9e8.png-151.1kB


三 关于 StatefulSet

3.1 StatfulSet的理解

  1. 3.1匹配 Pod name ( 网络标识 ) 的模式为:$(statefulset名称)-$(序号),比如上面的示例:web-0web-1
  2. web-2
  3. 3.2 StatefulSet 为每个 Pod 副本创建了一个 DNS 域名,这个域名的格式为: $(podname).(headless server
  4. name),也就意味着服务间是通过Pod域名来通信而非 Pod IP,因为当Pod所在Node发生故障时, Pod
  5. 被飘移到其它 Node 上,Pod IP 会发生变化,但是 Pod 域名不会有变化
  6. 3.3 StatefulSet 使用 Headless 服务来控制 Pod 的域名,这个域名的 FQDN 为:$(service
  7. name).$(namespace).svc.cluster.local,其中,“cluster.local 指的是集群的域名
  8. 3.4 根据 volumeClaimTemplates,为每个 Pod 创建一个 pvcpvc 的命名规则匹配模式:
  9. (volumeClaimTemplates.name)-(pod_name),比如上面的 volumeMounts.name=www Pod
  10. name=web-[0-2],因此创建出来的 PVC www-web-0www-web-1www-web-2
  11. 3.5删除 Pod 不会删除其 pvc,手动删除 pvc 将自动释放 pv

image_1e45ffuqr1o4a15t3fhu1n2r1q56el.png-72.9kB

image_1e45fibud18i4u6g1tg31rnj1a46fs.png-52.9kB

image_1e45fgjibjkv1di764hpjk1h4pf2.png-102.1kB

image_1e45fh51bg09f9o1bte8crnfff.png-150.9kB

image_1e45hghega7m20q18jg1d6712kv9.png-180.6kB

3.2 statfulset

  1. 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建(从0N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是RunningReady状态。
  2. 有序删除:当Pod被删除时,它们被终止的顺序是从N-10
  3. 有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于RunningReady状态。
  1. 有序删除:

image_1e45jafd3532179a2d71unu15hpm.png-177.3kB


3.3 StatefulSet使用场景:

  1. 1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。
  2. 2.稳定的网络标识符,即 Pod 重新调度后其 PodName HostName 不变。
  3. 有序部署,有序扩展,基于 init containers 来实现。
  4. 3.有序收缩。

image_1e45onpmm19bp1at89h4qli13nq34.png-150.5kB

3.4 statefulset 整体删除步骤

  1. 先删除 pod
  2. kubectl delete pod --all
  3. 在删除svc
  4. kubectl delete svc --all
  5. 在删除deployment
  6. kubectl delete deploy --all
  7. 在删除statefulset
  8. kubectl delete statefulset --all
  9. 在删除 pvc
  10. kubectl delete pvc --all
  11. 删除 pv
  12. kubectl delete pv --all
  13. 然后 在删掉 nfs挂载里面的文件

image_1e45odh81se9b0jgbo1vdfct29.png-29.6kB

image_1e45oec14umc4gp1fk61j7rc5im.png-25.8kB

image_1e45olaac1f2f1u0k12mk1oqn1pg02n.png-34.7kB

image_1e45of3avd53ccl6k11doi178513.png-51.3kB

image_1e45ogtgidogc9dvjsjme16dt1t.png-31.7kB

image_1e45og6kcpm21fc15h11f2g5n41g.png-40.2kB

image_1e45oikld1qik3121gojjfe1hfe2a.png-135.7kB


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注