01 引言
声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记
在上一篇博客《k8s教程(Volume篇)-持久卷工作原理》,我们了解了持久卷的工作原理,本文继续深入学习PV。
02 PV详解
PV作为对存储资源的定义,主要涉及存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。
Kubernetes
支持的PV类型如下:
类型 | 描述 |
---|---|
AWSElasticBlockStore | AWS公有云提供的Elastic Block Store |
AzureFile | Azure公有云提供的File |
AzureDisk | Azure公有云提供的Disk |
CephFS | 一种开源共享存储系统 |
Cinder | OpenStack块存储系统 |
FC (Fibre Channel) | 光纤存储设备 |
FlexVolume | 一种插件式的存储机制 |
Flocker | 一种开源共享存储系统 |
GCEPersistentDisk | GCE公有云提供的Persistent Disk |
Glusterfs | 一种开源共享存储系统 |
HostPath | 宿主机目录,仅用于单机测试 |
iSCSI | iSCSI存储设备 |
Local | 本地存储设备,从Kubernetes 1.7版本开始引入,到1.14版本时达到稳定版本,目前可以通过指定块设备(Block Device) 提供Local PV,或通过社区开发的sig-storage-local-static-provisioner插件管理Local PV的生命周期 |
NFS | 网络文件系统 |
Portworx Volumes | Portworx提供的存储服务 |
Quobyte Volumes | Quobyte提供的存储服务 |
RBD (Ceph Block Device) | Ceph块存储 |
ScaleIO Volumes | DellEMC的存储设备 |
StorageOS | StorageOS提供的存储服务 |
VsphereVolume | VMWare提供的存储系统 |
2.1 示例配置详解
下面的示例声明的PV具有如下属性:5GiB
存储空间,存储卷模式为 Filesystem
,访问模式为ReadWriteOnce
,存储类型为slow
(要求在系统中己存在名称为“slow
”的StorageClass
),回收策略为Recycle
,并且后端存储类型为nfs
(设置了 NFS Server
的IP
地址和路径),同时设置了挂载选项 (mountOptions
)。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
Storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadwriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountoptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
PV资源对象需要设置的关键配置参数如下:
2.1.1 存储容量 (Capacity)
描述存储的容量,目前仅支持对存储空间的设置 (storage=xx),未来可能加入IOPS、吞吐率等设置。
2.1.2 存储卷模式 (Volume Modes)
可以设置的选项包括Filesystem(文件系统,默认值)和Block(块设备):
- 文件系统模式的PV将以目录(Directory)形式挂载到Pod内;
- 块设备,如果设备是空的,Kubernetes则会自动在块设备上创建一个文件系统。支持块设备的存储类型会以裸设备 (Raw Block Device) 的形式挂载到容器内,并且不会创建任何文件系统,适用于需要直接操作裸设备(速度最快)的应用程序。
目前有以下PV类型支持裸块设备类型:AWSElasticBlockStore AzureDisk、 FC ( Fibre Channel ) 、 GCEPersistentDisk isCsI Local volume、 OpenStack Cinder、 RBD (Ceph Block Device) VsphereVolume。
下面的示例使用了块设备的PV定义:
apiVersion: v1
kind: PersistentVolume
metadata:
name: block-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
volumeMode: Block
fd:
targetWWNs: ["50060e801049cfd1"]
lun: 0
readonly: false
2.1.3 访问模式 (Access Modes)
PV存储卷在挂载到宿主机系统上时,可以设置不同的访问模式 (Access Modes
)。PV支持哪些访问模式由存储提供商提供支持,例如NFS可以支持多个客户端同时读写(ReadWriteMany)模式,但一个特定的NFS PV也可以以只读(Read-only)模式导出到服务器上。
Kubernetes支持的访问模式如下:
- ReadWriteOnce (RWO):读写权限,并且只能被单个Node挂载;
- ReadOnlyMany (ROX):只读权限,允许被多个Node挂载;
- ReadWriteMany(RWX):读写权限,允许被多个Node挂载。
某些PV
可能支持多种访问模式,但PV
在挂载时只能使用一种访问模式,多种访问模式不能同时生效。
2.1.4 存储类别(Class)
PV可以设定其存储的类别,通过 storageClassName
参数指定一个 StorageClass
资源对象的名称。具有特定类别的PV
只能与请求了该类别的PVC
绑定。未设定类别的PV
则只能与不请求任何类别的PVC
绑定。
2.1.5 回收策略 (Reclaim Policy)
通过PV
定义中的persistentVolumeReclaimPolicy字段进行设置,可选项如下:
- Retain: 保留数据,需要手工处理;
- Recycle: 简单清除文件的操作(例如运行
rm -rf /thevolume/*
命令),只有 NFS 和 HostPath 两种类型的 PV支持 Recycle 策略。 - Delete: 与
PV
相连的后端存储完成Volume
的删除操作,AWSElasticBlockStore、 GCEPersistentDis、 AzureDisk和Cinder类型的PV支持 Delete策略。
2.1.6 挂载选项 (Mount Options)
在将PV
挂载到一个Node
上时,根据后端存储的特点,可能需要设置额外的挂载选项的参数,这个可以在PV
定义中的mountOptions
字段进行设置。
下面的例子为对一个类型为gcePersistentDisk的PV
设置挂载选项的参数:
apiVersion: "V1"
kind: "PersistentVolume"
metadata:
name: gce-disk-1
spec:
capacity:
storage: "10Gi"
accessModes:
- "ReadwriteOnce"
mountoptions:
- hard
- nolock
- nfsvers=3
gcePersistentDisk:
fsType: "ext4"
pdName: "gce-disk-1"
目前,以下PV类型支持设置挂载选项:AWSElasticBlockStore AzureDisk、 AzureFile、 CephFS、 Cinder ( OpenStack block storage) GCEPersistentDisk、 Glusterfs、 NFS、 Quobyte Volumes、 RBD ( Ceph Block Device)、 StorageOS、 VsphereVolume、 iSCSI。
注意:Kubernetes不会对挂载选项进行验证,如果设置了错误的挂载选项, 则挂载将会失败。
2.1.6 节点亲和性 (Node Affinity)
PV可以设置节点亲和性来限制只能通过某些Node访问Volume,可以在PV定义的nodeAffinity字段中进行设置。使用这些Volume的Pod将被调度到满足条件的 Node上。
公有云提供的存储卷(如:AWSElasticBlockStore、GCEPersistentDisk、 AzureDisk等)都由公有云自动完成节点亲和性设置,无须用户手工设置。
对于 Local类型的PV,需要手工设置,例如:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadwriteOnce
persistentVolumeReclaimPolicy: Delete
storageclassName: local-storage
1ocal:
path: /mnt/disks/ssal
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- my-node
某个PV
在生命周期中可能处于以下4个阶段(Phase
)之一:
- Available:可用状态,还未与某个PVC绑定;
- Bound:已与某个PVC绑定;
- Released:与之绑定的PVC已被删除,但未完成资源回收,不能被其他 PVC使用;
- Failed:自动资源回收失败。
在定义了PV
资源之后,就需要通过定义PVC
来使用PV
资源了。
03 文末
本文主要讲解了PV的一些概念以及配置详解,希望能帮助到大家,谢谢大家的阅读,本文完!