K8S持久化存储--- PVC和PV的存储

这篇具有很好参考价值的文章主要介绍了K8S持久化存储--- PVC和PV的存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. k8s PV 是什么?

PersistentVolume ( PV )是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像 pod 是 k8s 集群资源一样。 PV是容量插件,如 Volumes ,其生命周期独立于使用 PV 的任何单个 pod 。

2. k8s PVC 是什么?

PersistentVolumeClaim ( PVC )是一个持久化存储卷,我们在创建 pod 时可以定义这个类型的存储卷。 它类似于一个pod 。 Pod 消耗节点资源,PVC 消耗 PV 资源。 Pod 可以请求特定级别的资源(CPU 和
内存)。 pvc 在申请 pv 的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

3. k8s PVC 和 和 PV 工作原理

PV 是群集中的资源。 PVC 是对这些资源的请求。
PV 和 PVC 之间的相互作用遵循以下生命周期:

3.1 pv 的供应方式

可以通过两种方式配置 PV :静态或动态。

静态的

集群管理员创建了许多 PV 。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API 中,可供使用。**

动态的

当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,群集可能会尝试为 PVC 专门动态配置卷。此配置基于 StorageClasses , PVC 必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。**

3.2 绑定

用户创建 c pvc 并指定需要的资源和访问模式。在找到可用 pv 之前,pvc 会保持未绑定状态.

3.3 使用

3.3.1 需要找一个存储服务器,把它划分成多个存储空间;
3.3.2 k8s 管理员可以把这些存储空间定义成多个 pv ;
3.3.3 在 pod 中使用 pvc 类型的存储卷之前需要先创建 pvc ,通过定义需要使用的 pv 的大小和对应的访问模式,找到合适的 pv ;
3.3.4 pvc 被创建之后,就可以当成存储卷来使用了,我们在定义 pod 时就可以使用这个 c pvc 的存储卷;
3.3.5 pvc 和 和 pv 它们是一 一对应的关系, pv 如果被 pvc 绑定了,就不能被其他 pvc 使用了;
3.3.6 我们在创建 pvc 的时候,应该确保和底下的 pv 能绑定,如果没有合适的 pv ,那么 pvc 就会处于 pending 状态。

3.4 回收策略

当我们创建 pod 时如果使用 pvc 做为存储卷,那么它会和 pv 绑定,当删除 pod ,pvc 和 pv 绑定就会解除,解除之后和 pvc 绑定的 pv 卷里的数据需要怎么处理,目前,卷可以保留(Retain),回收(Recycle,被废弃了)或删除(Delete)。

3.4.1 Retain

当删除 pvc 的时候, pv 仍然存在,处于 released 状态,但是它不能被其他 pvc 绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略.

3.4.2 Delete

删除 pvc 时即会从 Kubernetes 中移除 PV ,也会从相关的外部设施中删除存储资产.

第一:创建 nfs 共享目录

[root@k8s-master ~]# mkdir  -p  /data/pv/v{1,2,3,4,5,6,7,8,9,10} 
[root@k8s-master ~]# cat >> /etc/exports <<EOF
/data/pv/v1  *(rw,no_root_squash) 
/data/pv/v2  *(rw,no_root_squash)
/data/pv/v3  *(rw,no_root_squash) 
/data/pv/v4  *(rw,no_root_squash) 
/data/pv/v5  *(rw,no_root_squash) 
/data/pv/v6  *(rw,no_root_squash) 
/data/pv/v7  *(rw,no_root_squash) 
/data/pv/v8  *(rw,no_root_squash) 
/data/pv/v9  *(rw,no_root_squash)
/data/pv/v10 *(rw,no_root_squash)
EOF
[root@k8s-master ~]# exportfs -arv #使配置生效

第二:创建 pv 的资源清单文件


cat > pv.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v1
spec:
  capacity:
    storage: 1Gi  #pv的存储空间容量
  accessModes: ["ReadWriteOnce"]
  nfs:
    path: /data/volume_test/v1 #把nfs的存储空间创建成pv
    server: 192.168.243.180     #nfs服务器的地址
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v2
spec:
  persistentVolumeReclaimPolicy: Delete
  capacity:
      storage: 2Gi
  accessModes: ["ReadWriteMany"]
  nfs:
    path: /data/volume_test/v2
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v3
spec:
  capacity:
      storage: 3Gi
  accessModes: ["ReadOnlyMany"]
  nfs:
    path: /data/volume_test/v3
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v4
spec:
  capacity:
      storage: 4Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v4
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v5
spec:
  capacity:
      storage: 5Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v5
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v6
spec:
  capacity:
      storage: 6Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v6
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v7
spec:
  capacity:
      storage: 7Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v7
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v8
spec:
  capacity:
      storage: 8Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v8
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v9
spec:
  capacity:
      storage: 9Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v9
    server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  v10
spec:
  capacity:     
      storage: 10Gi
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  nfs:
    path: /data/volume_test/v10  
    server: 192.168.243.180
EOF
kubectl apply -f pv.yaml #创建pv资源
[root@k8s-master mqq]# kubectl get pv #查看pv资源,#STATUS 是Available ,表示pv 是可用的
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   5s
v10    10Gi       RWO,RWX        Retain           Available                                   5s
v2     2Gi        RWX            Delete           Available                                   5s
v3     3Gi        ROX            Retain           Available                                   5s
v4     4Gi        RWO,RWX        Retain           Available                                   5s
v5     5Gi        RWO,RWX        Retain           Available                                   5s
v6     6Gi        RWO,RWX        Retain           Available                                   5s
v7     7Gi        RWO,RWX        Retain           Available                                   5s
v8     8Gi        RWO,RWX        Retain           Available                                   5s
v9     9Gi        RWO,RWX        Retain           Available                                   5s

第三:创建 pvc,和符合条件的 pv 绑定

cat > pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
EOF

kubectl apply -f pvc.yaml
[root@k8s-master mqq]# kubectl get pvc ##和v2绑定了
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc   Bound    v2       2Gi        RWX                           19s
[root@k8s-master mqq]# 
[root@k8s-master mqq]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                            5m25s
v10    10Gi       RWO,RWX        Retain           Available                                            5m25s
v2     2Gi        RWX            Delete           Bound       default/my-pvc                           5m25s
v3     3Gi        ROX            Retain           Available                                            5m25s
v4     4Gi        RWO,RWX        Retain           Available                                            5m25s
v5     5Gi        RWO,RWX        Retain           Available                                            5m25s
v6     6Gi        RWO,RWX        Retain           Available                                            5m25s
v7     7Gi        RWO,RWX        Retain           Available                                            5m25s
v8     8Gi        RWO,RWX        Retain           Available                                            5m25s
v9     9Gi        RWO,RWX        Retain           Available                                            5m25s
[root@k8s-master mqq]# kubectl get pvc #pvc 的名字- 绑定到 pv 绑定的是v2这个pv-pvc 可使用的容量是 2G
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc   Bound    v2       2Gi        RWX                           59s
[root@k8s-master mqq]# 

第四:创建 pod ,挂载 pvc

cat > pod_pvc.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: nginx-html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nginx-html
    persistentVolumeClaim:
      claimName: my-pvc
EOF

kubectl apply -f pod_pvc.yaml
[root@k8s-master mqq]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
pod-pvc   1/1     Running   0          34s
[root@k8s-master mqq]# 

第五: 验证结果

[root@k8s-master mqq]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
pod-pvc   1/1     Running   0          4m48s
[root@k8s-master mqq]# kubectl exec -it pod-pvc -- /bin/bash #进入pod
root@pod-pvc:/# cd /usr/share/nginx/html/
root@pod-pvc:/usr/share/nginx/html# ls
root@pod-pvc:/usr/share/nginx/html# echo "hello weixin mqq759035366" > index.html #写入一个网页信息
root@pod-pvc:/usr/share/nginx/html# ls
index.html
root@pod-pvc:/usr/share/nginx/html# cat index.html 
hello weixin mqq759035366
root@pod-pvc:/usr/share/nginx/html# 
[root@k8s-master pv]# cd /data/pv/v2 #因为pvc绑定的是pv是v2目录
[root@k8s-master v2]# ls
index.html
[root@k8s-master v2]# pwd
/data/pv/v2
[root@k8s-master v2]# cat index.html 
hello weixin mqq759035366
[root@k8s-master v2]# 
#删除pod,pvc和pv后,查看数据文件是否存在
[root@k8s-master mqq]# ll
total 12
-rw-r--r-- 1 root root  301 Apr  9 22:18 pod_pvc.yaml
-rw-r--r-- 1 root root  153 Apr  9 22:17 pvc.yaml
-rw-r--r-- 1 root root 2152 Apr  9 22:17 pv.yaml
[root@k8s-master mqq]# kubectl delete -f pod_pvc.yaml 
pod "pod-pvc" deleted
[root@k8s-master mqq]# kubectl delete -f pvc.yaml 
persistentvolumeclaim "my-pvc" deleted
[root@k8s-master mqq]# kubectl delete -f pv.yaml 
persistentvolume "v1" deleted
persistentvolume "v2" deleted
persistentvolume "v3" deleted
persistentvolume "v4" deleted
persistentvolume "v5" deleted
persistentvolume "v6" deleted
persistentvolume "v7" deleted
persistentvolume "v8" deleted
persistentvolume "v9" deleted
persistentvolume "v10" deleted
[root@k8s-master mqq]# 
[root@k8s-master v2]# pwd
/data/pv/v2
[root@k8s-master v2]# ls
index.html
[root@k8s-master v2]# cat index.html  #数据依然存在
hello weixin mqq759035366
[root@k8s-master v2]# 

第六:使用 pvc 和 pv 的注意事项

6.1 、 我们每次创建 pvc 的时候,需要事先有划分好的 pv , 这样可能不方便,那么可以在创建 pvc 的时候直接动态创建一个 pv 这个存储类, pv 事先是不存在的;
6.2 pvc 和 pv 绑定,如果使用默认的回收策略 retain ,那么删除 pvc 之后,pv 会处于 released 状态,我们想要继续使用这个 pv ,需要手动删除 pv ,删除 pv ,不会删除 pv里的数据,当我们重新创建 pvc 时还会和这个最匹配的 pv 绑定,数据还是原来数据,不会丢失 。
文章来源地址https://www.toymoban.com/news/detail-409434.html

到了这里,关于K8S持久化存储--- PVC和PV的存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s 持久化存储

    我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问节点的设备 这个时候,我们就可以让 hostP

    2024年02月16日
    浏览(33)
  • K8S之持久化存储

    在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,想要长久的保留这些数据就要用到pod数据持久化存储。 查看K8S支持哪些存储 常用的如下:

    2024年04月09日
    浏览(34)
  • 【k8s存储--使用OpenEBS做持久化存储】

    使用OpenEBS,你可以将有持久化数据的容器,像对待其他普通容器一样来对待。OpenEBS本身也是通过容器来部署的,支持Kubernetes、Swarm、Mesos、Rancher编排调度,存储服务可以分派给每个pod、应用程序、集群或者容器级别,包括: 跨节点的数据持久化 跨可用区和云厂商的数据同步

    2024年04月23日
    浏览(25)
  • (九)K8S数据持久化高级存储

    NFS(Network File System)是一种分布式文件系统协议,用于通过网络共享文件和目录。它允许客户端计算机通过网络访问和读取远程服务器上的文件,就像它们在本地文件系统中一样。NFS 是一种常见的网络文件共享协议,在许多环境中被广泛使用。 在 Kubernetes 中,NFS 可以作为一

    2024年02月06日
    浏览(54)
  • 飞天使-k8s基础组件分析-持久化存储

    emptyDir hostpath pv和pvc介绍 nfs作为静态pv案例 nfs作为动态pv案例 使用本地文件夹作为pv 改变默认存储类及回收策略 参考文档

    2024年02月11日
    浏览(35)
  • Kubernetes基础(二十三)-k8s持久化存储详解

    1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决。Pod只需要通

    2024年03月17日
    浏览(37)
  • 持续集成部署-k8s-数据持久化-基本存储方式

    关于k8s 数据持久化,可以先看下官方的介绍:

    2024年02月13日
    浏览(57)
  • 如何借助Kafka持久化存储K8S事件数据?

    大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时。     尽管这些信息十分有用,但它只是临时的,保留时间最长为30天。如果出于审计或是故障诊断等目的,你可能想要把这些信息保留得更久,比如保存在像 Kafka

    2024年02月05日
    浏览(38)
  • 持续集成部署-k8s-数据持久化-高级存储方式

    持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用

    2024年02月16日
    浏览(32)
  • 第18关 K8s数据安全无忧——持久化存储详解

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,本期课程将深入解析Kubernetes的持久化存储机制,包括PV、PVC、StorageClass等的工作原理、使用场景、最佳实践等,帮您构建稳定可靠的状态存储,确保应用和数据 100% 安全。 Volume 我们这里先来聊聊K8s的存储模型V

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包