K8S的PV和PVC


PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”。
PV由管理员创建和配置
PVC则是用户对存储资源的一个“申请”。
就像Pod消费Node的资源一样,PVC能够“消费”PV资源
PVC可以申请特定的存储空间和访问模式

PV和PVC的生命周期

PV的状态:

  • Avaliable(可用):表示可用状态,还未被任何PVC绑定
  • Bound(可绑定):表示PV已经被PVC绑定
  • Released(已释放):PVC被删除,但是资源还未被集群重新声明
  • Failed(失败):表示该PV的自动回收失败

image-20240925171151497

image-20240925171136515

PVC和PV是一一对应的,PV和PVC之间的相互作用遵循以下生命周期:

  • 资源供应:管理员手动创建底层存储和PV
  • 资源绑定:用户创建PVC,kubernetes负责根据PVC的声明去寻找PV,并绑定 在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV中选择一个满足条件的
  • 一旦找到,就将该PV与用户定义的PVC进行绑定,用户的应用就可以使用这个PVC了
  • 如果找不到,PVC则会无限期处于Pending状态,直到等到系统管理员创建了一个符合其要求的PV PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC进行绑定了
  • 资源使用:用户可在pod中像volume一样使用pvc Pod使用Volume的定义,将PVC挂载到容器内的某个路径进行使用。
  • 资源释放:用户删除pvc来释放pv 当存储资源使用完毕后,用户可以删除PVC,与该PVC绑定的PV将会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被留在存储设备上,只有在清除之后该PV才能再次使用。
  • 资源回收:kubernetes根据pv设置的回收策略进行资源的回收 对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用

PVC绑定PV的条件

创建PVC之后,k8s就会去查找满足我们声明要求的PV,比如 storageClassName , accessModes 以及容量这些是否满足要求,如果满足要求就将PV和PVC绑定在一起

- 1. storageClassName  (名称)
- 2. accessModes 	(类型)
- 3. size (大小)

需要注意的是目前PV和PVC之间是一对一绑定的关系,也就是说一个PV只能被一个PVC绑定。

image-20240925171629740



PV 资源清单

capacity: PV存储的容量
accessModes: 访问模式,k8s支持的访问模式如下
------------------------------------------------------
ReadWriteOnce(RWO): 读写权限,并且只能被单个Node挂载
ReadOnlyMany(ROX): 只读权限,允许被多个Node挂载
ReadWriteMany(RWX): 读写权限,允许被多个Node挂载
------------------------------------------------------
persistentVolumeReclaimPolicy: 回收策略
------------------------------------------------------
Retain: 保留数据,需要手工处理
Recycle: 简单清除文件的操作(例如运行rm -rf /dada/* 命令)
Delete: 与PV相连的后端存储完成Volume的删除操作
目前只有NFS和HostPath两种类型的PV支持Recycle策略。
------------------------------------------------------

storageClassName: 存储类别
具有特定类别的PV只能与请求了该类别的PVC绑定。未指定类型的PV则只能对与不请求任何类别的PVC绑定。
## 资源清单
apiVersion: v1                            # API 版本,指定使用的 Kubernetes API 版本
kind: PersistentVolume                    # 资源类型为 PersistentVolume
metadata:                                 # 元数据部分
  name: pv01                              # PV 的名称

spec:                                     # 规范部分
  capacity:                               # 存储容量部分
    storage: 5Gi                          # PV 的存储容量为 5 GiB
  accessModes:                            # 访问模式部分
    - ReadWriteOnce                       # PV 的挂载类型,表示可以被单个节点以读写方式挂载

  persistentVolumeReclaimPolicy: Recycle  # PV 的回收策略,表示在删除 PVC 后,将 PV 回收并重新可用
  storageClassName: cs-nfs                # 存储类名称,用于绑定 PVC 的存储类

  nfs:                                    # NFS 配置部分
    path: /data			                 # NFS 服务器上存储的路径
    server: 172.16.1.31                   # NFS 服务器的 IP 地址


apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01
spec:
  capacity:
    storage: 5Gi 
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  
  storageClassName: cs-nfs
  nfs:
    path: /data
    server: 172.16.1.31
## 运行
[root@master pvc]# kubectl apply -f pv001.yaml 
persistentvolume/pv01 created

image-20240925172621192

#### 创建多个pv
[root@master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv01   3Gi        ROX            Recycle          Available           kjt-nfs                 6m2s
pv02   5Gi        RWO            Recycle          Available           kjt-nfs                 2m12s
pv03   3Gi        RWO            Recycle          Available           kkk-nfs                 2m9s
pv04   2Gi        RWO            Recycle          Available           kjt-nfs                 2m6s



PVC 资源清单

apiVersion: v1                            # API 版本,指定使用的 Kubernetes API 版本
kind: PersistentVolumeClaim               # 资源类型为 PersistentVolumeClaim
metadata:                                 # 元数据部分
  name: kjt-pvc                           # PVC 的名称

spec:                                     # 规范部分
  accessModes:                            # 访问模式部分
    - ReadWriteOnce                       # 请求的挂载类型,表示可以被单个节点以读写方式挂载

  resources:                               # 资源请求部分
    requests:                              # 请求资源的具体配置
      storage: 3Gi                         # 请求的存储容量为 3 GiB

  storageClassName: kjt-nfs                # 指定 PVC 绑定的存储类名称


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: kjt-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: kjt-nfs
PVC的选PV模式
第一梯队 :名称  类型
第二梯队 :大小

image-20240925173915917



POD管理PVC

spec:                                   # 规范部分
  volumes:                              # 定义 Pod 中使用的卷
  - name: mysql-pvc                     # 卷的名称,方便在容器中引用
    persistentVolumeClaim:              # 声明该卷为 PersistentVolumeClaim 类型 PVC类型
      claimName: kjt-pvc                # 绑定的 PVC 名称,用于指定所需的存储


#### 资源清单
apiVersion: v1
kind: Pod
metadata:
  name: mysql57
spec:
  volumes:
  - name: mysql-pvc
    persistentVolumeClaim: 
      claimName: kjt-pvc
  containers:
  - name: mysql57
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: '123'
    volumeMounts:
    - name: mysql-pvc
      mountPath: /var/lib/mysql
挂载之后 删除pvc 后 pv为自由的   
不要挂载mysql!!!!!  问题没解决  无权限写入 

image-20240925175239279

image-20240925182844899

image-20240925183110580