首页 > 技术文章 > k8s基础概念之六 pv/pvc

RRecal 2021-12-16 17:37 原文

pv/pvc概念

pv:存储卷、pv是集群中已由管理员配置的一段网络存储。集群中的资源就像一个节点是一个集群的资源,pv是诸如卷之类的卷插件,但是具有独立于使用pv的热河单个pod生命周期。该api对象不会存储的细节,
大白话:他是集群里面的一个磁盘,pod可以挂载使用


pvc:存储卷请求:是用户存储的请求,pvc使用逻辑,在pod中定义一个存储卷(类型为pvc),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义的pv去申请。二pv是由存储空间创建出来的,pv和pvc是kubernetes抽象出来的一种存储资源

pv没有命名空间隔离概念,而pvc有命名空间隔离概念

 

pv的访问模式

模式解释
ReadWriteOnce(RWO) 可读可写,但只支持被单个节点挂载
ReadOnlyMany(ROX) 只读,可被多个节点挂载
ReadWriteMany(RWX) 多路可读可写,这种存储可以以读写的方式被多个节点共享、不是每一种存储都支持者三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS,在pvc绑定pv时通常根据两个条件来判定,是存储的大小,另一个就是模式

注:只是起到标识作用,并不会控制他的读写

 

pv的回收策略

策略解释
Retain 不清除、保留volume(需要手动清除)
Recycle 删除数据,即rm -rf /thevolume/* (只有nfs和hostPath支持)
Delete 删除储存资源,比如删除aws ebs卷(只有aws EBS,GCE PD,Azure Disk和cinder支持)

 

 

创建一个简单的pv

kind: persistentVolume
apiVersion: v1
metadata:
  name: nfsva
spec:
  nfs: 
    path: /data/nfs/v1
    server: 192.168.159.14
  accessModes:
    - "ReadWriteMany"   #访问模式,起到标记作用并不控制读写权限
  persistentVolumeReclaimPolicy: Retain #回收策略
  capacity: 
    storage: 2Gi   #这个存储卷的大小
---
kind: persistentVolume
apiVersion: v1
metadata:
  name: nfsvb
spec:
  nfs: 
    path: /data/nfs/v2
    server: 192.168.159.14
  accessModes:
    - "ReadWriteOnce"
  persistentVolumeReclaimPolicy: Retain
  capacity: 
    storage: 2Gi   #这个存储卷的大小

 

写一个deployment测试

#创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfsva
spec:
  accessModes:
  - "ReadWriteMany"  #只是一个标识,并不会控制读写权限,底层存储该怎么做他就会怎么做
  resources:
    requests:
      storage: 2Gi
---
#测试的deployment
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfsvc-test
spec:
  selector:
    matchLabels:
      app: nfsva
  template:
    metadata:
      labels:
        app: nfsva
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - mountPath: /usr/share/nginx
          name: nfsva
      volumes:
      - name: nfsva
        persistentVolumeClaim:
          claimName: nfsva  #使用的pvc名字

 

 

 

一些问题

创建pvc之后一直绑定不上pv

pvc的空间申请大小大于pv的大小
pvc的storageclassName没有和pv的一致
pvc的accessModes和pv的不一致

 

创建挂载pvc之后一直处于pending状态

1.pvc没有创建成功或者被创建
2.pvc和pod不在同一个anmespace

 

删除pvc的时候需要先把正在使用pvc的deploy或者pod删掉或吧使用的pvc删掉,要不然会一直显示delete不动

 

删除pvc之后k8s会创建一个回收的pod----根据pv的回收策略回收,回收完了之后,pv的状态就会变成可被绑定的状态,也就是空闲状态,其他的pvc匹配到这个pv就会和这个pv绑定

 

推荐阅读