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