01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

在上一篇博客《k8s教程(Volume篇)-持久卷工作原理》,我们了解了持久卷的工作原理,本文继续深入学习PV。

02 PV详解

PV作为对存储资源的定义,主要涉及存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。

Kubernetes支持的PV类型如下:

类型描述
AWSElasticBlockStoreAWS公有云提供的Elastic Block Store
AzureFileAzure公有云提供的File
AzureDiskAzure公有云提供的Disk
CephFS一种开源共享存储系统
CinderOpenStack块存储系统
FC (Fibre Channel)光纤存储设备
FlexVolume一种插件式的存储机制
Flocker一种开源共享存储系统
GCEPersistentDiskGCE公有云提供的Persistent Disk
Glusterfs一种开源共享存储系统
HostPath宿主机目录,仅用于单机测试
iSCSIiSCSI存储设备
Local本地存储设备,从Kubernetes 1.7版本开始引入,到1.14版本时达到稳定版本,目前可以通过指定块设备(Block Device) 提供Local PV,或通过社区开发的sig-storage-local-static-provisioner插件管理Local PV的生命周期
NFS网络文件系统
Portworx VolumesPortworx提供的存储服务
Quobyte VolumesQuobyte提供的存储服务
RBD (Ceph Block Device)Ceph块存储
ScaleIO VolumesDellEMC的存储设备
StorageOSStorageOS提供的存储服务
VsphereVolumeVMWare提供的存储系统

2.1 示例配置详解

下面的示例声明的PV具有如下属性:5GiB存储空间,存储卷模式为 Filesystem,访问模式为ReadWriteOnce,存储类型为slow(要求在系统中己存在名称为“slow”的StorageClass),回收策略为Recycle,并且后端存储类型为nfs (设置了 NFS ServerIP地址和路径),同时设置了挂载选项 (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 策略。
  • DeletePV相连的后端存储完成Volume的删除操作,AWSElasticBlockStore、 GCEPersistentDis、 AzureDisk和Cinder类型的PV支持 Delete策略。

2.1.6 挂载选项 (Mount Options)

在将PV挂载到一个Node上时,根据后端存储的特点,可能需要设置额外的挂载选项的参数,这个可以在PV定义中的mountOptions字段进行设置。

下面的例子为对一个类型为gcePersistentDiskPV设置挂载选项的参数:

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的一些概念以及配置详解,希望能帮助到大家,谢谢大家的阅读,本文完!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐