【kubernetes】持久化存储 —— PV / PVC

一,理论

概念

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

PersistentVolumeClaim(简称PVC)是一个持久化存储卷,在创建pod时可以定义这个类型的存储卷。

它类似于一个pod。 Pod消耗节点Node资源,PVC消耗PV资源。

原理

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

(1)pv的供应方式

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

静态的:
集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。

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

(2)绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了。

(3)回收策略

当删除pod时候,pvc和pv绑定就会解除,pv卷里的数据的回收策略persistentVolumeReclaimPolicy有3种处理方式:

保留:Retain

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

删除:Delete

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

回收:Recycle (不推荐使用,1.15可能被废弃了)

(4)使用

a)准备一个存储服务器,把它划分成多个存储空间,并定义成多个pv;
b)先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;
c)在定义pod时,就可以使用这个pvc的存储卷;
d)在确保有可以绑定的pv的情况下,再创建pvc。如果没有合适的pv,那么pvc就会被创建,并处于pending状态。

二,应用

本案例以nfs为存储类

1、创建nfs共享目录
# 在宿主机创建NFS需要的共享目录
mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p


#配置nfs共享宿主机上的/data/volume_test/v1..v10目录 新增一下配置:
vim /etc/exports
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)

#重新加载配置,使配置成效
[root@xianchaomaster1 ~]# exportfs -arv
2、编写pv的常用字段
# 看定义pv需要的字段
# kubectl explain pv

apiVersion	  <string>
kind	      <string>
metadata	  <Object>
spec	      <Object>

# 看定义pv需要的字段
# kubectl explain pv.spec

accessModes   <[]string>   
# 访问模式:ReadWriteOnce,ReadOnlyMany,ReadWriteMany,ReadWriteOncePod
persistentVolumeReclaimPolicy   <string>  # 回收模式:Retain,Delete,Recycle
capacity	  <map[string]string>  # 指定容量大小
# capacity:
#   storage: 1Gi


# 查看定义nfs类型的pv需要的字段
# kubectl explain pv.spec.nfs
path	      <string> -required-
readOnly	  <boolean>
server	      <string> -required-
3、创建pv

创建3个存储卷。

# vim pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: v1
  labels:                        # 定义pv标签
    app: v1
spec:
  nfs:
    path: /data/volume_test/v1
    server: 192.168.40.180
  accessModes: ["ReadWriteOnce"] # 定义访问模式
  capacity:                      # 定义资源大小
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v2
  labels:
    app: v2
spec:
  nfs:
    path: /data/volume_test/v2
    server: 192.168.40.180
  accessModes: ["ReadOnlyMany"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v3
  labels:
    app: v3
spec:
  nfs:
    path: /data/volume_test/v3
    server: 192.168.40.180
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 3Gi
kubectl apply -f pv.yaml 

persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   108s
v2     2Gi        ROX            Retain           Available                                   108s
v3     3Gi        RWX            Retain           Available                                   108s

【注解】
RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问。
ROX: readonlymany: 多路只读,允许不通node节点的pod以只读方式访问。
RWX: readwritemany: 多路读写,允许不同的node节点的pod以读写方式访问。

4、创建pvc,绑定符合条件的pv

创建3个pvc,访问模式,标签,资源大小均有上面符合的pv,即可!

# cat pvc.yaml 


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v1
spec:
  accessModes: ["ReadWriteOnce"]   # 访问模式 一致
  selector:                        # 筛选pv的标签 一致
    matchLabels:
      app: v1
  resources:                       # 资源大小 一致
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: v2
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: v3
  resources:
    requests:
      storage: 3Gi
kubectl apply -f pvc.yaml 

persistentvolumeclaim/pvc-v1 created
persistentvolumeclaim/pvc-v2 created
persistentvolumeclaim/pvc-v3 created
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           86s
pvc-v2   Bound    v2       2Gi        ROX                           86s
pvc-v3   Bound    v3       3Gi        RWX                           86s

【注解】
STATUS : 状态为Bound 表示与对应pv绑定成功。

5、创建pod [deployment],挂载pvc

照常创建deploy资源,仅仅是volume挂载不同。

# vim pod-pvc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc
  template: 
    metadata:
      labels:
         cunchu: pvc
    spec:
      containers:
      - name: test-pvc
        image: xianchao/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:                # 挂载
        - name: nginx-html           # 必须和volumes名字一致
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:       # 挂载 pvc
          claimName: pvc-v1          # 指定 pvc的名称
        name: nginx-html             # volumes 名字

在这里插入图片描述

至此,新建的3个pod的目录‘/usr/share/nginx/html’ 与 宿主机的pv1 目录‘/data/volume_test/v1/’ 共享。

6、删除pvc的步骤:
  • 先删除使用pvc的pod
  • 再删除pvc,
  • pv视情况而定,删除与保留。
### KubernetesPVPVC 的数据持久化机制 #### 1. 持久卷 (Persistent Volume, PV) PV 是集群中的一块存储资源,由管理员预先创建或者通过动态供应的方式自动生成。它是独立于 Pod 生命周期的抽象对象,用于描述可用的存储容量及其特性[^1]。 - **静态供应**: 系统管理员手动创建多个 PV 对象,并将其挂载到实际的物理存储设备上。这些 PV 提供给用户使用,无需额外干预即可完成绑定操作。 - **动态供应**: 当用户的需求无法匹配现有的静态 PV 时,可以通过 `StorageClass` 定义规则来触发动态供应过程。此时,Kubernetes 自动调用底层存储插件(如 AWS EBS、GCE PD 或 CephFS)生成新的 PV 实例并绑定至相应的 PVC 请求[^2]。 #### 2. 持久卷申领 (PersistentVolumeClaim, PVC) PVC 是用户向集群提出的存储需求声明。它类似于容器中的资源请求(CPU/Memory),允许开发者指定所需的最小存储量以及期望的访问权限模式(ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany)。一旦某个符合条件的 PV 被发现,则两者之间形成绑定关系,此后该 PVC 即可安全地供关联的应用程序读写文件系统内容[^4]。 #### 3. 绑定流程 当一个新的 PVC 创建完成后,控制系统尝试寻找满足条件的最佳候选者——即未被占用且参数相匹配的一个或多个现有 PV 条目之一;如果找不到任何合适选项但启用了自动扩展功能的话,则依据预设好的 Storage Class 描述启动新实例构建动作直至达成目标为止。 #### 4. 删除行为与回收策略 即使在销毁掉对应的服务之后,默认情况下原始磁盘并不会立即消失而是进入释放状态 (`Released`) ,这意味着只要原主人不再需要它们就可以重新分配出去给别的项目利用起来而不必担心丢失重要资料的问题发生 。不过需要注意的是具体表现形式取决于最初设定时候所采用的方法论不同可能会有所差异 :例如有些可能直接擦除所有记录然后再交付别人接管;另一些则仅仅改变标签标记而已以便后续清理工作更加方便快捷高效执行下去[^5]。 ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 设置为保留模式 hostPath: path: "/mnt/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi ``` 上述 YAML 文件展示了如何定义一个简单的 PVPVC 示例。其中设置了 `persistentVolumeReclaimPolicy` 参数为 `Retain`,这表明即便将来此 PVC 被移除后,其背后的实际存储也不会立刻清除,从而便于进一步处理或恢复用途。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直奔跑在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值