pv/pvc理解及实践

一、pv/pvc简述

Pv 是指 Persistent Volume,中文含义是持久化存储卷是对底层的共享存储的一种抽象,pv由管理员进行配置和创建,只要包含存储能力,访问模式,存储类型,回收策略,后段存储类型等主要信息。它和具体的底层的存储技术实现有关,比如NFS, Hostpath等,Pvc是一种用户对存储的需求声明,声明中包括了存储大小、存储类型、以及k8s中选择器的属性等,另一个角度来看PVC和Pod类似,Pod是消耗节点node资源,PVC消耗的是PV资源,Pod可以请求CPU的内存,而PVC可以请求特定的存储空间和访问模式。

二、pv/pvc使用场景

在这里插入图片描述

存储工程师吧岑不是存储系统上的总空间划分成一个个小的存储块,k8s集群的管理员将存储快和pv进行一一对应,用户通过pvc 对存储进行申请,比如可以指定具体大小容量的存储,访问模式和存储类型,用户这样不用关心底层存储实现的细节,只需要直接申请使用pvc 即可,若申请的pvc 对应的 pv 不能满足用户的要求,则不会生效,pvc 会自动完成与pv 的绑定

三、创建并使用 pv

PV支持多种不同类型的存储,如:NFS、hostpath、RBD、ICCSI,文中将使用NFS为例介绍如何创建pv.

  • 第一步: 搭建一个NFS共享服务器,共享目录为 /data/share
  • 创建pv ,并添加NFS共享服务器地址和目录
apiVersion: v1
kind: PersistentVolume     									# 指定为PV类型
metadata:
  name:  zhaobei  												  # 指定PV的名称
  labels:                  									# 指定PV的标签
    release: zhaobei
spec:
  capacity: 
    storage: 1Gi					  								# 指定PV的容量
  accessModes:
  - ReadWriteOnce						                # 指定PV的访问模式,简写为RWO,只支持挂在1个Pod的读和写
  persistentVolumeReclaimPolicy: Delete 		# 指定PV的回收策略,Recycle表示支持回收,回收完成后支持再次利用
  nfs:											  							# 指定PV的存储类型,本文是以nfs为例
    path: /data/share/test-pv								# 共享的地址
    server: 10.9.175.79											# 服务器地址

说明:

accessModes支持多种访问模式

1)ReadWriteOnce(RWO):读写权限,但是只支持挂载在1个Node

2)ReadOnlyMany(ROX):只读权限,支持挂载在多个Node

3)ReadWriteMany(RW):读写权限,支持挂载在多个Node

persistentVolumeReclaimPolicy的策略,指的是如果PVC被释放掉后,PV的处理,这里所说的释放,指的是用户删除PVC后,与PVC对应的PV会被释放掉,PVC个PV是一一对应的关系

1)Retain,PV的数据不会清理,会保留volume,如果需要清理,需要手动进行

2)Recycle,会将数据进行清理,即 rm -rf /thevolume/*(只有 NFS 和 HostPath 支持),清理完成后,PV会呈available状态,支持再次的bound

3)Delete,删除存储资源,会删除PV及后端的存储资源,比如删除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)

  • 检查pv
kubectl get pv

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XiXJXQYB-1621826739919)(/Users/zhaobei/Library/Application Support/typora-user-images/image-20210524111720220.png)]

观察可发现,pv创建好了后状态的 Available,此时如果此 pv 刚好条件服务刚刚刚创建pvc 则会自动绑定。

四、创建pvc

  • 编写yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc				      						 # 指定PVC的名称
spec:
  resources:
    requests:
      storage: 1Gi  									 # 指定PVC 容量
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce				 						 # 指定PVC访问模式

1)PVC声明了accessModes访问类型为ReadWriteOnce,创建后,系统会自动去找能够支持ReadWriteOnce访问类型的PV,若无符合条件的PV,则不会进行绑定,

2)PVC声明了storage的大小为0.05Gi,创建后,系统会自动去找能够支持此容量的PV,通常PV的容量至少要大于或者等于0.05Gi才会去进行绑定

从这里来看,对于用户来说,即只需要声明访问类型、容量、另外还可通过StorageClass声明具体的PV类型即可完成对持久化存储卷的申请,而不需要去维护和关注后端存储

  • 查看创建结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4QlAYh2-1621826739921)(/Users/zhaobei/Library/Application Support/typora-user-images/image-20210524111955856.png)]

我发现pvc创建好了的状态的就是 Bound,这是因为在创建并声明自己要什么样子的存储的时候。我们刚刚创建的p v刚好符合条件,则自动绑定,状态变更,此时pv的状态也应该发生了变更。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVTUCqcC-1621826739922)(/Users/zhaobei/Library/Application Support/typora-user-images/image-20210524112147909.png)]

五、pod 使用pvc

  • 编写yaml
apiVersion: v1
kind: Pod
metadata:
  name: cqh
spec:
  containers:
    - name: cqh-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage
  volumes:
    - name: pv-storage
      persistentVolumeClaim:				# 挂在的是 pvc
        claimName: mypvc
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐