k8s pvc详解

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

一、概述

PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

PVC作为用户对存储资源的需求申请,主要涉及存储空间请求访问模式PV选择条件存储类别等信息的设置。

二、参数解释

创建pvc,如下:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs
  volumeMode: Filesystem 
  • accessModes:访问模式

    PVC也可以设置访问模式,用于描述用户应用对存储资源的访问权限,其设置参数和pv一致

  • resources:资源请求

    描述对存储的请求数量,通过 resources.requests.storage字段设置需要的存储空间大小。

  • volumeMode:存储卷格式,用于描述用户使用的PV存储卷模式,包括文件系统(Filesystem)和块设备 (Block),与pv一致。

  • storageClassName:存储类型

    在创建pvc时需要指定后端存储类型,以减少对后端存储详细信息的依赖。

    • 如果系统中存在一个DefaultStorageClass,可以在创建pvc的时候不指定storageclassname,系统会自动使用默认的存储类型。

    • 如果将多个StorageClass都定义为default,则由于不唯一,系统将无法创建PVC。

三、pod使用pvc

编辑配置文件,如下:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs
  volumeMode: Filesystem 
 
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myfrontend
    image: docker.io/library/centos:7
    command: ["init"]
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /data                                                                         name: test-path
  volumes:
  - name: test-path
    persistentVolumeClaim:
      claimName: test-pvc
      
      
执行创建命令如下:
kubectl apply -f pod.yaml
[root@node1 yaml]# kubectl get po -o wide 
NAME                                      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
mypod                                     1/1     Running   0          4s    10.233.96.10   node2   <none>           <none>

进入pod查看挂载的目录,如下:
[root@node1 yaml]# kubectl exec -it mypod bash 
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@mypod /]# ls
anaconda-post.log  bin  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@mypod /]# ll 
total 12
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxrwxrwx   2 root root     6 Jun  5 06:27 data    ####目录被自动挂载
drwxr-xr-x   5 root root   360 Jun  5 06:34 dev
drwxr-xr-x   1 root root    41 Jun  5 06:34 etc
drwxr-xr-x   2 root root     6 Apr 11  2018 home

四、pv、pvc状态变化

不同情况下,PV和PVC的状态变化如下:
k8s pvc,k8s,k8s
具体操作如下:文章来源地址https://www.toymoban.com/news/detail-612013.html

#############################
1:创建pv
---
apiVersion: v1                         
kind: PersistentVolume                 
metadata:                              
  name: pv-nfs                         
spec:                                  
  accessModes:                         
  - ReadWriteOnce                      
  capacity:                            
    storage: 2Gi                       
  nfs:                                 
    path: /data/                       
    server: 192.168.5.79               
  persistentVolumeReclaimPolicy: Retain                                                                                                                                    
  storageClassName: nfs                
  volumeMode: Filesystem
  
[root@node1 yaml]# kubectl apply -f  nfs-pv.yaml 
persistentvolume/pv-nfs created
[root@node1 yaml]# 
[root@node1 yaml]# kubectl get pv  | grep pv-nfs
pv-nfs                                     2Gi        RWO            Retain           Available                                            nfs                     23s
[root@node1 yaml]#
此时查看pv的状态为Available


##############################
2:创建pvc,如下:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs
  volumeMode: Filesystem
  
[root@node1 yaml]# kubectl apply -f  pvc.yaml 
persistentvolumeclaim/pvc-nfs created
[root@node1 yaml]# kubectl get pvc       ###正常是状态先为pending,然后是Bound
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs      Bound    pv-nfs                                     2Gi        RWO            nfs            7s

############################
3:删除pv,查看pvc的状态
[root@node1 yaml]# kubectl delete pv pv-nfs
persistentvolume "pv-nfs" delete      ####会一直卡在这里

打开新的终端,查看pv状态已经是Terminating
[root@node1 ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                                    STORAGECLASS   REASON   AGE
pv-nfs                                     2Gi        RWO            Retain           Terminating   default/pvc-nfs                          nfs                     11m

出现删除不掉问题的主要原因是pv已经和pvc绑定,pv内部有kubernetes.io/pv-protection这个参数进行保护,编辑pv,删除这个参数,kubectl edit  pv pv-nfs,如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2023-06-05T08:12:28Z"
  deletionGracePeriodSeconds: 0
  deletionTimestamp: "2023-06-05T08:23:27Z"
 # finalizers:    ####将此参数删除
 # - kubernetes.io/pv-protection
  name: pv-nfs
  resourceVersion: "9420641"
  uid: cb3b7c54-b8e9-4132-b273-16e9415ae643
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi

再次查看pv已经被删除了,此时pvc状态为Lost,如下:
[root@node1 yaml]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs      Lost     pv-nfs                                     0                         nfs            13m

解决方式,将删除的pv进行重新创建,pvc和pv的状态都会变成Bound
[root@node1 yaml]# kubectl apply -f  nfs-pv.yaml 
persistentvolume/pv-nfs created
[root@node1 yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                    STORAGECLASS   REASON   AGE
pv-nfs                                     2Gi        RWO            Retain           Bound    default/pvc-nfs                          nfs                     4s
[root@node1 yaml]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs      Bound    pv-nfs                                     2Gi        RWO            nfs            15m

############################
4:删除pvc,查看pv状态变化,如下:
[root@node1 yaml]# kubectl delete pvc pvc-nfs
persistentvolumeclaim "pvc-nfs" deleted
[root@node1 yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                    STORAGECLASS   REASON   AGE
pv-nfs                                     2Gi        RWO            Retain           Released   default/pvc-nfs                          nfs                     84s

此时的pv状态已经是released,但如果此时在创建新的pvc,能够进行pv和pvc的绑定呢,大答案是不行的,因为pvc只能和Available状态的pv进行绑定。
在pv变成released的时候,查看claimRef属性,其中依然保留着PVC的绑定信息,如下:
[root@node1 yaml]# kubectl get pv pv-nfs  -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2023-06-05T08:29:29Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: pv-nfs
  resourceVersion: "9421489"
  uid: 09c62907-7fa3-491f-bb48-656003581c8f
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:       ####查看此处,保留了pvc的绑定信息
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: pvc-nfs
    namespace: default
    resourceVersion: "9421099"
    uid: 15935386-4b7b-4b97-88b3-2bece1ed6ea9
  nfs:
    path: /data/
    server: 192.168.5.79
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  volumeMode: Filesystem
status:
  phase: Released
[root@node1 yaml]# 

解决方式是导出pv的信息进行备份,然后删除claimRef出的内容,如下:
[root@node1 yaml]# kubectl get pv pv-nfs  -o yaml > pv.yaml
[root@node1 yaml]# kubectl edit pv pv-nfs
---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
    pv.kubernetes.io/bound-by-controller: "yes"
  creationTimestamp: "2023-06-05T08:29:29Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: pv-nfs
  resourceVersion: "9421489"
  uid: 09c62907-7fa3-491f-bb48-656003581c8f
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  nfs:
    path: /data/
    server: 192.168.5.79
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  volumeMode: Filesystem
status:
  phase: Released
persistentvolume/pv-nfs edited
[root@node1 yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                    STORAGECLASS   REASON   AGE
pv-nfs                                     2Gi        RWO            Retain           Available                                            nfs                     10m
再次查看pv状态变为Available,此在创建pvc,pv/pvc状态都为Bound,如下:
[root@node1 yaml]# kubectl apply -f   pvc.yaml 
persistentvolumeclaim/pvc-nfs created
[root@node1 yaml]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                    STORAGECLASS   REASON   AGE
pv-nfs                                     2Gi        RWO            Retain           Bound    default/pvc-nfs                          nfs                     12m
[root@node1 yaml]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs      Bound    pv-nfs                                     2Gi        RWO            nfs            7s

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

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

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

相关文章

  • 【K8S 存储卷】K8S的存储卷+PV/PVC

    目录 一、K8S的存储卷 1、概念: 2、挂载的方式: 2.1、emptyDir: 2.2、hostPath: 2.3、NFS共享存储: 二、PV和PVC: 1、概念 2、请求方式 3、静态请求流程图: 4、PV和PVC的生命周期 5、PV的状态: 6、PV的读写挂载方式: 7、回收策略: 三、PV和PVC静态请求实验: 1、默认的Retain保留策

    2024年02月02日
    浏览(57)
  • 【K8S系列】深入解析K8S中PV 和PVC

    在 Kubernetes 中,PV(持久卷)和 PVC(持久卷声明)之间的关系是一种动态匹配和绑定关系,用于实现 Pod 与存储资源的解耦。 PV 是集群中的一块网络存储,它独立于 Pod 存在。PV 可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。 管理员负责创建 PV,并配置其

    2024年04月23日
    浏览(46)
  • k8s pv与pvc

    1.前言 PV 是 Kubernetes 集群中的一种资源对象,它代表着一块物理存储设备,例如磁盘、网络存储或云存储等。PV 可以被多个 Pod 共享,并且可以独立于 Pod 存在。PV 可以配置不同的访问模式 (Access Modes),例如 ReadWriteOnce 、 ReadOnlyMany 或 ReadWriteMany ,以确定 PV 可以被多少个 Pod 同

    2024年01月21日
    浏览(55)
  • PV & PVC in K8s

    在Kubernetes中,PV(Persistent Volume)和PVC(Persistent Volume Claim)是用于管理持久化存储的重要资源对象。PV表示存储的实际资源,而PVC表示对PV的声明性要求。当应用程序需要使用持久化存储时,它可以通过创建PVC来请求和使用PV。以下是使用PV和PVC时的一些注意事项: 定义存储类

    2024年02月09日
    浏览(31)
  • k8s ------存储卷(PV、PVC)

    目录 一:为什么需要存储卷? 二:emptyDir存储卷  ​三:hostPath存储卷  四:nfs共享存储卷   五:PVC 和 PV 1、PVC 和 PV介绍 2、PV和PVC之间的相互作用遵循的生命周期 3、PV 的4 种状态 4、一个PV从创建到销毁的具体流程 六:静态创建pv和pvc资源由pod运用过程 ​1、配置nfs存储 ​

    2024年02月13日
    浏览(47)
  • k8s--动态pvc和pv

    目录 前情回顾 动态pv 实验模拟 步骤一:在stor01节点上安装nfs,并配置nfs服务 接下来在matser01上配置 步骤二:创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则 步骤三:使用 Deployment 来创建 NFS Provisioner  部署nfs-provisioners插件: 步骤四:创建 St

    2024年01月24日
    浏览(52)
  • k8s里pv pvc configmap

    通过storageClassName 将PV 和PVC 关联起来。

    2024年02月11日
    浏览(33)
  • k8s 存储卷和pvc,pv

    存储卷---数据卷 容器内的目录和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的,deletek8s用控制器创建的pod,delete相当于重启,容器的状态也会回复到初始状态。 一旦回到初始状态,所有的后天编辑的文件的都会消失。 容器容器和节点之间创建一个可以持久化保

    2024年01月16日
    浏览(51)
  • k8s~动态生成pvc和pv

    有时,我们不想手动建立pv和pvc,这时,我们可以通过strongClass存储类来帮我们实现,动态建立pvc,并动态为它分配pv存储空间,我们以nfs为例,说一下动态分配在nfs存储截至上建立pv的方式。 StorageClass和PVC及PV 集群权限与绑定rbac.yaml 建立动态pvc的provisioner.yaml 建立strongClass的

    2024年02月03日
    浏览(48)
  • k8s中的PV和PVC存储介绍

    目录 一.PV介绍 1.含义 2.关键配置参数 二.PVC介绍 1.含义 2.关键参数配置 三.PV和PVC的生命周期问题 1.PV的生命周期会有4个阶段 2.用户申请空间PV的周期流程 3.PV和PVC的使用/释放/回收 四.案例演示 1.NFS配置 2.新建PV 3.新建PVC 4.新建Pod测试 5.模拟删除Pod后后端目录内数据不会受影响

    2024年03月15日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包