前面我们讲解了 hostPath 或者 emptyDir 的方式来持久化数据,但是他们也有各自的缺点,是否有更加可靠的存储来保存应用的持久化数据,这样容器在重建后,依然可以使用之前的数据?而且显示情况会出现存储资源和 CPU 资源以及内存资源有很大不同,为了屏蔽底层的技术实现细节,让用户更加方便的使用,Kubernetes 便引入了 PV 和 PVC 两个重要的资源对象来实现对存储的管理。这也是本章节需要和大家讲解的核心:PV 和 PVC。
一、什么是PV/PVC?
1. PersistentVolume (PV)
PV 是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。
2. PersistentVolumeClaim (PVC)
PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。
3. PV 与 PVC 的关系
Admin[管理员创建 PV/StorageClass] --> PV
User[用户创建 PVC] -->|匹配条件| PVC
PVC -->|动态绑定| PV((动态生成的 PV))
Pod -->|挂载| PVC
二、配置示例
为了演示方便,采用 NFS 这种存储资源作为后端存储,在k8s-node01(172.21.176.4)这个节点上安装NFS
需要注意的是,虽然只是在k8s-node01一台服务器上挂载NFS,但是所有的节点都是需要安装NFS服务的。也就是需要(apt-get install nfs-kernel-server)
# 安装 NFS 服务端 这一步需要所有服务器运行
sudo apt-get install nfs-kernel-server
# 创建共享目录
sudo mkdir -p /data/nfs_share
sudo chmod 777 /data/nfs_share
# 配置导出规则(/etc/exports)
echo "/data/nfs_share *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
# 应用配置
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
1. 静态供给示例
创建 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/nfs_share
server: 172.21.176.4
readOnly: false
创建 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
Pod 挂载 PVC:
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: nginx
image: m.daocloud.io/docker.io/nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: nfs-pvc
查看演示结果:
① 创建pv
② 创建pvc
③ 创建pod挂载pvc
④ 查看pv,pvc 这里面包含一些pv,pvc的属性参数具体查看下文
⑤ 查看创建成功的pod
三、关键配置参数
1. PV 配置参数
参数 | 说明 |
---|---|
capacity.storage | 存储容量(如 10Gi ) |
访问模式
|
|
| |
RWX 存储卷可被多个节点上的多个 Pod 以读写模式挂载 多 Pod 并发读写(如日志共享目录) | |
回收策略
|
保留 PV 和底层存储数据,需手动清理。PV 状态变为 |
随着pod的删除而自动删除 PV 对象及底层存储资源(如云存储卷、磁盘) | |
Recycle (新版本废弃) | |
storageClassName | 关联的 StorageClass 名称 |
volumeMode | 存储类型:Filesystem (文件系统)、Block (块设备) |
2. PVC 配置参数
参数 | 说明 |
---|---|
resources.requests.storage | 请求的存储容量 |
accessModes | 必须与 PV 的访问模式兼容,具体pvc参数讲解 |
storageClassName | 指定动态供给时使用的 StorageClass |
selector | 筛选符合条件的 PV(如匹配标签) |
四、其他类型的后端
上面举例是最常用的NFS类型,除了NFS以外,pv/pvc还支持多种类型的后端卷,例如云存储(各大平台云盘、文件存储 NAS、对象存储 OSS等)、分布式存储(Ceph、GlusterFS)等,操作都大同小异,这里不单独举例。