PV概述

PersistentVolume (PV)是集群中由管理员提供或使用存储类动态提供的一块存储。它是集群中的资源,就像节点是集群资源一样。

PV是与Volumes类似的卷插件,但其生命周期与使用PV的任何单个Pod无关。由此API对象捕获存储的实现细节,不管是NFS、iSCSI还是特定于云提供商的存储系统。

PVC概述

PersistentVolumeClaim (PVC) 是用户对存储的请求。它类似于Pod;Pods消耗节点资源,而PVC消耗PV资源。Pods可以请求特定级别的资源(CPU和内存)。Claim可以请求特定的存储大小和访问模式(例如,它们可以挂载一次读写或多次只读)。

虽然PersistentVolumeClaims (PVC) 允许用户使用抽象的存储资源,但是用户通常需要具有不同属性(比如性能)的PersistentVolumes (PV) 来解决不同的问题。集群管理员需要能够提供各种不同的PersistentVolumes,这些卷在大小和访问模式之外还有很多不同之处,也不向用户公开这些卷是如何实现的细节。对于这些需求,有一个StorageClass资源。

volume 和 claim的生命周期

PV是集群中的资源。PVC是对这些资源的请求,并且还充当对资源的声明检查。PV和PVC之间的交互遵循以下生命周期:

回收策略

当用户处理完他们的卷时,他们可以从允许回收资源的API中删除PVC对象。PersistentVolume的回收策略告诉集群在释放卷的声明后该如何处理它。目前,卷可以被保留、回收或删除。

Retain (保留)

保留回收策略允许手动回收资源。当PersistentVolumeClaim被删除时,PersistentVolume仍然存在,并且该卷被认为是“释放”的。但是,由于之前声明的数据仍然存在,因此另一个声明尚无法得到。管理员可以手动回收卷。

Delete (删除)

对于支持Delete回收策略的卷插件,删除操作会同时从Kubernetes中删除PersistentVolume对象以及外部基础架构中的关联存储资产,例如AWS EBS,GCE PD,Azure Disk或Cinder卷。动态配置的卷将继承其StorageClass的回收策略,默认为Delete。管理员应根据用户的期望配置StorageClass。

Recycle (回收)

如果基础卷插件支持,Recycle回收策略将rm -rf /thevolume/*对该卷执行基本的擦除并使其可用于新的声明。

PV卷状态

卷将处于以下某种状态:

Available:尚未绑定到声明(claim)的空闲资源 Bound:卷已被声明绑定 Released:声明已被删除,但群集尚未回收该资源 Failed:该卷自动回收失败

accessModes访问方式设置

ReadWriteOnce-该卷可以被单个节点以读写方式挂载 ReadOnlyMany-该卷可以被许多节点以只读方式挂载 ReadWriteMany-该卷可以被多个节点以读写方式挂载

1.安装NFS

[root@xxxx]# yum install nfs-utils -y
[root@xxxx]# cat /etc/exports
/data/k8s  *(rw,async,no_root_squash,no_all_squash)
[root@xxxx]# mkdir /data/k8s -p
[root@xxxx]# systemctl restart rpcbind
[root@xxxx]# systemctl restart nfs


2.创建PV

[root@xxxx]# cat test-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test
  labels:
    type: test
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path:  "/data/k8s"
    server: 172.19.41.222
    readOnly: false

3.创建PVC


[root@xxxx]# cat test-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs2
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

4.创建Pod 测试使用PVC

[root@xxxx]#  cat test-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: helloworld-service
spec:
  replicas: 1
  template:
    metadata:
      labels:
        weblogic-app: "helloworld"
        version: "0.1"
    spec:
      containers:
      - name: weblogichelloworld
        image: nginx
        volumeMounts:
        - mountPath: "/data/"
          name: mypd
        ports:
        - containerPort: 80
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: nfs2

5.测试

[root@xxxx]#  kubectl create -f .
[root@xxxx]#  kubectl get pv
[root@xxxx]#  kubectl get pvc 

# 进入pod 在挂载目录写入文件
[root@xxxx]#  kubectl exec -it  yourPodName bash
[root@pod]#  echo "hello" > /data/1.txt
#退出pod 在nfs 服务器查看目录 已经创建成功
[root@xxxx]#  cat /data/k8s/1.txt 
hello