Kubernetes 持久化存储
介绍
k8s-pvc.png对于管理计算资源,管理存储资源明显是一个另外的问题。 PersistentVolume
子系统为用户和管理提供了一个 API,该 API 将如何提供存储的细节抽象了出来。为此,我们引入了两个关于存储的新 API 资源:PersistentVolume
和 PersistentVolumeClaim
。
PersistentVolume
(PV) 是由集群管理员设置的,它是集群的一部分,就像集群中 node 资源一样。PV 是 Volume 之类的卷插件,但是具有独立于 Pod 的生命周期。此 API 对象包含存储细节的实现,即 NFS,iSCSI 或特定的云供应商提供的存储系统。
PersistentVolumeClaim
(PVC) 是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。声明的请求可以指定特定的大小,访问模式。
StorageClass
为管理员提供了描述存储类的方法。不同的 class 可能会映射到不同的服务质量等级或备份策略,或由群集管理员确定的任意策略。 Kubernetes 本身不清楚各种 class 代表的什么。这个概念在其他存储系统中有时被称为 "配置文件"。
配置
静态创建 PV
集群管理员创建一些 PV。它们带有可供集群用户使用的实际存储细节。PersistentVolume
类型以插件形式实现。Kubernetes 目前支持以下插件类型:
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- FC (Fibre Channel)**
- FlexVolume
- Flocker
- NFS
- iSCSI
- RBD (Ceph Block Device)
- CephFS
- Cinder (OpenStack block storage)
- Glusterfs
- VsphereVolume
- Quobyte Volumes
- HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
- VMware Photon
- Portworx Volumes
- ScaleIO Volumes
- StorageOS
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity: # 指定 PV 容量
storage: 5Gi
volumeMode: Filesystem # 卷模式,除了文件系统,还支持原始块,Filesystem/Block
accessModes:
- ReadWriteOnce # 访问模式,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载), ReadOnlyMany(该卷可以被多个节点以只读模式挂载),ReadWriteMany(该卷可以被多个节点以读/写模式挂载)
persistentVolumeReclaimPolicy: Recycle # 回收策略,Retain(保留,手动回收),Recycle(回收,基本擦除), Delete(关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除)
storageClassName: slow # 存储类名。指定类名的 PV 需要与指定类名的 PVC 绑定
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
动态创建 PV
当集群管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim
时。集群会基于 StorageClasse
PVC 存储类 来创建 PV,并与 PersistentVolumeClaim
一一绑定。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
StorageClass 存储类说明
StorageClass
为管理员提供了描述存储类的方法。不同的 class 可能会映射到不同的服务质量等级或备份策略,或由群集管理员确定的任意策略。 Kubernetes 本身不清楚各种 class 代表的什么。这个概念在其他存储系统中有时被称为 "配置文件"。
StorageClass 中包含 provisioner、parameters 和 reclaimPolicy 字段,当 class 需要动态分配 PersistentVolume 时会使用到。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
mountOptions:
- debug
provisioner: Storage class 有一个分配器,用来决定使用哪个卷插件分配 PV。该字段必须指定,详情请见:https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner
使用
在 Pod 中以 volume 的实行挂载。
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: dockerfile/nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim