k8s-day12-名词解释:Volume(共享存储)
2.9 Volume(共享存储)
Volume是pod中能够被多个容器访问的共享目录。在Docker中也有一个docker Volume的概念 ,Docker的Volume只是磁盘中的一个目录,生命周期不受管理。Kubernetes的volume与pod生命周期相同,但与容器的生命周期不相关。当容器终止或者重启时,Volume中的数据不会丢失。Kubernetes支持多种类型Volume,并且一个pod可以同时使用任意多个Volume。
2.9.1 Volume 类型
(1)emptyDir
emptyDir Volume在Pod分配到Node上时被创建,初始内容为空。只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除容器不影响emptyDir。
用处:主要用于:临时空间(如某些应用程序运行时的临时目录,无须永久保留);长时间任务的中间过程临时保存目录;一个容器需要从另一个容器中获取数据的目录(多容器共享目录)等。
示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
mountPath: /cache#容器内部挂载点
name: cache-volume
volumes:
name: cache-volume#volume名称
emptyDir: {}#volume类型
(2)hostPath
hostPath:在Pod上挂载宿主机(node主机)上的文件或者目录;hostPath允许挂载Node上的文件系统到Pod里面去。
用处:容器应用程序生产的日志文件需要永久保存,可以使用宿主机高速文件系统进行存储;需要访问宿主机(node主机)上Docker引擎内部数据结构的容器应用,可通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问docker文件系统。
示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
mountPath: /test-pd#容器内部挂载点
name: test-volume
volumes:
name: test-volume
hostPath:
# directory location on host
path: /data#使用宿主机目录
(3)gcePersistentDisk
gcePersistentDisk可以挂载GCE(谷歌计算引擎Google Computer Engine)上的永久磁盘(永久磁盘PersistenDisk,PD)到容器,需要Kubernetes运行在GCE的VM中。与emptyDir不同,Pod删除时,gcePersistentDisk被删除,但Persistent Disk 的内容任然存在。这就意味着gcePersistentDisk能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
使用条件:Node需要GCE虚拟机,这些虚拟机需要与PD存在于相同的GCE项目或者Zone中。使用gcePersistentDisk,必须用gcloud或使用GCE API或UI 创建PD。
创建PD:使用GCE PD与pod之前,需要创建它
gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk
示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
mountPath: /test-pd
name: test-volume
volumes:
name: test-volume
# This GCE PD must already exist.
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
(4)awsElasticBlockStore
awsElasticBlockStore与GCE相似,可以挂载AWS上的EBS盘到容器,需要Kubernetes运行在AWS的EC2上。与emptyDir Pod被删除情况不同,Volume仅被卸载,内容将被保留。这就意味着awsElasticBlockStore能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。(使用的是Amazon提供的Amazon Web Service(AWS)的EBS Volume)
提示:必须使用aws ec2 create-volumeAWS API 创建EBS Volume,然后才能使用。
创建EBS Volume:在使用EBS Volume与pod之前,需要创建它。
aws ec2 create-volume --availability-zone eu-west-1a --size 10 --volume-type gp2
AWS EBS配置示例
apiVersion: v1
kind: Pod
metadata:
name: test-ebs
spec:
containers:
image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
mountPath: /test-ebs
name: test-volume
volumes:
name: test-volume
# This AWS EBS volume must already exist.
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
(5)nfs
使用NFS(网络文件系统)提供的共享目录挂载到Pod中,在系统中需要一个运行的NFS系统。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递。
(6)iSCSI
使用iscsi存储上的目录挂载到pod中。删除pod时,volume只是被卸载,内容被保留。
(7)flocker
Flocker是一个开源的容器集群数据卷管理器。它提供各种存储后端支持的数据卷的管理和编排。
(8)glusterfs
使用开源glusterfs网络文件系统的目录挂载到pod。删除pod时,volume只是被卸载,内容被保留。
(9)RBD
使用linux块设备共享存储(rados block device)挂载到pod中。删除pod时,volume只是被卸载,内容被保留。
(10)cephfs
cephfs Volume可以将已经存在的CephFS Volume挂载到pod中。删除pod时,volume只是被卸载,内容被保留。
(11)gitRepo
gitRepo volume将git代码下拉到指定的容器路径中。通过挂载一个空目录,并从git库clone一个git repository 供pod使用。
(12)secret
secret volume用于将敏感信息(如密码)传递给pod。可以将secrets存储在Kubernetes API中,使用的时候以文件的形式挂载到pod中,而不用连接api。secret volume由tmpfs(RAM支持的文件系统)支持。
(13)persistentVolumeClaim
persistentVolumeClaim用来挂载持久化磁盘的。PersistentVolumes是用户在不知道特定云环境的细节的情况下,实现持久化存储(如GCE PersistentDisk或iSCSI卷)的一种方式。
(14)downwardAPI
通过环境变量的方式告诉容器Pod的信息。
(15)projected
Projected volume将多个Volume源映射到同一个目录。目前,可以支持以下类型的卷源:secret、downwardAPI、configMap。所有卷源都要求与pod在同一命名空间中。
(16)FlexVolume
alpha功能。
(17)AzureFileVolume
AzureFileVolume用于将Microsoft Azure文件卷(SMB 2.1和3.0)挂载到Pod中。
(18)AzureDiskVolume
Azure是微软提供的公有云服务,如果使用Azure上面的虚拟机来作为Kubernetes集群使用时,那么可以通过AzureDisk这种类型的卷插件来挂载Azure提供的数据磁盘。
(19)vsphereVolume
vsphereVolume用于将vSphere VMDK Volume挂载到Pod中。卸载卷后,内容将被保留。它同时支持VMFS和VSAN数据存储。
(20)Quobyte
在kubernetes中使用Quobyte存储,需要提前部署Quobyte软件,要求必须是1.3以及更高版本,并且在kubernetes管理的节点上面部署Quobyte客户端。
(21)PortworxVolume
Portworx能把你的服务器容量进行蓄积(pool),将你的服务器或者云实例变成一个聚合的高可用的计算和存储节点。
(22)ScaleIO
ScaleIO是一种基于软件的存储平台(虚拟SAN),可以使用现有硬件来创建可扩展共享块网络存储的集群。ScaleIO卷插件允许部署的pod访问现有的ScaleIO卷(或者可以为持久卷声明动态配置新卷)。
(23)StorageOS
StorageOS是一家英国的初创公司,给无状态容器提供简单的自动块存储、状态来运行数据库和其他需要企业级存储功能,但避免随之而来的复杂性、刚性以及成本。
核心:StorageOS向容器提供块存储,可通过文件系统访问。
StorageOS容器需要64位Linux,没有额外的依赖关系,提供免费开发许可证。
(24)Local
Local 是Kubernetes集群中每个节点的本地存储(如磁盘,分区或目录),在Kubernetes1.7中kubelet可以支持对kube-reserved和system-reserved指定本地存储资源。
通过上面的这个新特性可以看出来,Local Storage同HostPath的区别在于对Pod的调度上,使用Local Storage可以由Kubernetes自动的对Pod进行调度,而是用HostPath只能人工手动调度Pod,因为Kubernetes已经知道了每个节点上kube-reserved和system-reserved设置的本地存储限制。