目录
一、环境安装
参考
二、PV 和 PVC介绍
PV(Persistent Volume)
持久化卷,是对底层的共享存储的一种抽象。一般情况下PV
由Kubernetes
管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
PVC(Persistent Volume Claim)
持久化卷声明,是用户对于存储需求的一种声明。换句话说,PVC
其实就是用户向Kubernetes
系统发出的一种资源需求申请。
特点:
屏蔽底层存储实现的细节,方便用户使用。
使用了PV
和PVC
之后,工作可以得到进一步的细分:
- 存储:存储工程师维护
PV
:Kubernetes
管理员维护PVC
:Kubernetes
用户维护
三、PV 和 PVC使用
yml 配置
PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
nfs: # 存储类型,与底层真正存储对应
capacity: # 存储能力,目前只支持存储空间的设置
storage: 2Gi
accessModes: # 访问模式
storageClassName: # 存储类别
persistentVolumeReclaimPolicy: # 回收策略
PV
的关键配置参数说明:
- 存储类型:底层实际存储的类型,
Kubernetes
支持多种存储类型,每种存储类型的配置都有所差异 - 存储能力(
capacity
):目前只支持存储空间的设置(storage=1Gi
),不过未来可能会加入IOPS、吞吐量等指标的配置 - 访问模式(
accessModes
):用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:ReadWriteOnce
(RWO
):读写权限,但是只能被单个节点挂载ReadOnlyMany
(ROX
):只读权限,可以被多个节点挂载ReadWriteMany
(RWX
):读写权限,可以被多个节点挂载- 需要注意的是,底层不同的存储类型可能支持的访问模式不同
- 回收策略(
persistentVolumeReclaimPolicy
):当PV
不再被使用了之后,对其的处理方式。目前支持三种策略:Retain
(保留):保留数据,需要管理员手工清理数据Recycle
(回收):清除PV
中的数据,效果相当于执行rm -rf /thevolume/*
Delete
(删除):与PV
相连的后端存储完成Volume
的删除操作,当然这常见于云服务商的存储服务- 需要注意的是,底层不同的存储类型可能支持的回收策略不同
- 存储类别:
PV
可以通过storageClassName
参数指定一个存储类别- 具有特定类别的
PV
只能与请求了该类别的PVC
进行绑定 - 未设定类别的
PV
则只能与不请求任何类别的PVC
进行绑定
- 具有特定类别的
- 状态(
status
):一个PV
的生命周期中,可能会处于4
中不同的阶段:Available
(可用):表示可用状态,还未被任何PVC
绑定Bound
(已绑定):表示PV
已经被PVC
绑定Released
(已释放):表示PVC
被删除,但是资源还未被集群重新声明Failed
(失败):表示该PV
的自动回收失败
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: dev
spec:
accessModes: # 访问模式
selector: # 采用标签对PV选择
storageClassName: # 存储类别
resources: # 请求空间
requests:
storage: 5Gi
PVC
的关键配置参数说明:
- 访问模式(
accessModes
):用于描述用户应用对存储资源的访问权限 - 选择条件(
selector
):通过Label Selector
的设置,可使PVC
对于系统中己存在的PV
进行筛选 - 存储类别(
storageClassName
):PVC
在定义时可以设定需要的后端存储的类别,只有设置了该class
的PV
才能被系统选出 - 资源请求(
resources
):描述对存储资源的请求
1 NFS准备工作
1)创建NFS
共享目录
mkdir -pv /root/data/{pv1,pv2,pv3}
2)vim /etc/exports
/root/data/pv1 172.30.1.0/24(rw,no_root_squash)
/root/data/pv2 172.30.1.0/24(rw,no_root_squash)
/root/data/pv3 172.30.1.0/24(rw,no_root_squash)
2 创建PV
vim pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv1
server: 172.30.1.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv2
server: 172.30.1.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv3
server: 172.30.1.100
创建pv
kubectl create -f pv.yml
3 创建PVC
vim pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
创建PVC
kubectl create -f pvc.yml
4 创建Pod
Pod yml
vim pod-pvc.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"]
volumeMounts:
- name: volume
mountPath: /root/
volumes:
- name: volume
persistentVolumeClaim:
claimName: pvc1
readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
namespace: dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"]
volumeMounts:
- name: volume
mountPath: /root/
volumes:
- name: volume
persistentVolumeClaim:
claimName: pvc2
readOnly: false
kubectl create -f pod-pvc.yml
5 查看PV
PV
是全局资源,所以不用指定namespace
kubectl get pv -o wide
6 查看PVC
kubectl get pvc -n dev -o wide
7 查看 Pod
kubectl get pods -n dev -o wide