Kubernetes
目前支持的Volume
类型包括Kubernetes
的内部资源对象类型、开源共享存储类型、存储厂商提供的硬件存储设备和公有云提供的存储等。
将Kubernetes特定类型的资源对象映射为目录或文件,包括以下类型的资源对象:
类型 描述 ConfigMap 应用配置 Secret 加密数据 DownwardAPI Pod或Container的元数据信息 ServiceAccountToken Service Account中的token数据 Projected Volume 一种特殊的存储卷类型,用于将一个或多个上述资源对象一次性挂载到容器内的同一个目录下 Kubernetes管理的宿主机本地存储类型如下:
类型 描述 EmptyDir 临时存储 HostPath 宿主机目录 持久化存储(PV))和网络共享存储类型如下:
类型 描述 CephFS 一种开源共享存储系统 Cinder 一种开源共享存储系统 CSI 容器存储接口(由存储提供商提供驱动程序和存储管理程序) FC(Fibre Channel) 光纤存储设备 FlexVolume 一种基于插件式驱动的存储 Flocker 一种基于插件式驱动的存储 Flocker 一种开源共享存储系统 Glusterfs 一种开源共享存储系统 iSCSI iSCSI存储设备 Local 本地持久化存储 NFS 网络文件系统 PersistentVolumeClaim 简称PVC,持久化存储的申请空间 Portworx Volumes Portworx提供的存储服务 Quobyte Volumes Quobyte提供的存储服务 RBD(Ceph Block Device) Ceph块存储 存储厂商提供的存储卷类型如下:
类型 描述 ScalelO Volumes DellEMC的存储设备 StorageOS StorageOS提供的存储服务 VsphereVolume VMWare提供的存储系统 公有云提供的存储卷类型如下:
类型 描述 AWSElasticBlockStore AWS公有云提供的Elastic Block Store AzureDisk Azure公有云提供的Disk AzureFile Azure公有云提供的File GCEPersistentDisk GCE公有云提供的Persistent Disk
PV作为对存储资源的定义,主要涉及存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。
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
PVC
作为用户对存储资源的需求申请,主要涉及存储空间请求、访问模式、 PV选择条件和存储类别等信息的设置。示例:申请8GiB存储空间,访问模式为ReadWriteOnce,PV选择条件为包含release=stable标签并且包含条件为environment In[dev]的标签,存储类别为“slow”(要求在系统中已存在名为slow的StorageClass):
apiVersion: v1
kind: PersistentVolumeclaim
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作为对存储资源的抽象定义,对用户设置的
PVC
申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的工作,由系统自动完成PV的创建和绑定,实现动态的资源供应。基于StorageClass的动态资源供应模式将逐步成为云平台的标准存储管理模式。示例:定义了一个
StorageClass
,名称为standard
,provisioner
为aws-ebs
,type
为gp2
,回收策略为Retain
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
Kubernetes从1.9版本开始引入容器存储接口 Container Storage Interface (CSI)机制,用于在Kubernetes和外部存储系统之间建立一套标准的存储管理接口,通过该接口为容器提供存储服务。
CSI的核心组件和部署架构如下:
CSI Controller:主要功能是 提供存储服务视角对存储资源和存储卷进行管理和操作。在Kubernetes中建议将其部署为单实例
Pod
,可以使用StatefulSet
或Deployment
控制器进行部署,设置副本数量为1,保证一种存储插件只运行一个控制器实例。CSI Node:主要功能是对主机(Node )上的Volume进行管理和操作,在 Kubernetes中建议将其部署为DaemonSet,在需要提供存储资源的各个Node上都运行一个Pod。