vlambda博客
学习文章列表

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: v1kind: Podmetadata: name: test-pdspec: 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: v1kind: Podmetadata: name: test-pdspec: 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: v1kind: Podmetadata: name: test-pdspec: 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

awsElasticBlockStoreGCE相似,可以挂载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: v1kind: Podmetadata: name: test-ebsspec: 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设置的本地存储限制。