博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9.Kubernetes Volume(存储卷)
阅读量:5907 次
发布时间:2019-06-19

本文共 3444 字,大约阅读时间需要 11 分钟。

Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume概念、用途和目的与Docker的Volume比较类似,但两者不能等价。首先,Kubernetes中的Volume定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下;其次,Kubernetes中的Volume中的数据也不会丢失。最后,Kubernetes支持多种类型的Volume,例如Gluster、Ceph等先进的分布式文件系统。

Volume的使用也比较简单,在大多数情况下,我们先在Pod上声明一个Volume,然后在容器里引用该Volume并Mount到容器里的某个目录上。举例来说,我们要給之前的Tomcat Pod增加一个名字为datavol的Volume,并且Mount到容器的/mydata-data目录上,则只要对Pod的定义文件做如下修正即可:

template:  metadata:    labels:      app: app-demo      tier: frontend  spec:    volumes:    - name: datavol      emptyDir: {}    containers:    - name: tomcat-demo      image: tomcat      volumeMounts:       - mountPath: /mydata-data name: datavol imagePullPolicy: IfNotPersent

除了可以让一个Pod里的多个容器共享文件、让容器的数据写到宿主机的磁盘上或者写文件到网络存储中,Kubernetes的Volume还扩展出了一种非常有实用价值的功能,即容器配置文件集中化定义与管理,这是通过ConfigMap这个新的资源对象来实现的,后面我们会详细说明。

Kubernetes提供了非常丰富的Volume类型,下面逐一进行说明。

1.emptyDir

一个emptyDir Volume是在Pod分配到Node时创建的。从它的名称就可以看出,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为这是Kubernetes自动分配的一个目录,当Pod从Node上移除时,emptyDir中的数据也会被永久删除。empty的一些用途如下。

临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留。

长时间任务的中间过程CheckPoint的临时保存目录。

一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。

目前,用户无法控制emptyDir使用的介质种类。如果kubelet的配置是使用硬盘,那么所有emptyDir都将创建在该硬盘上。Pod在将来可以设置emptyDir是位于硬盘、固态硬盘上还是基于内存的tmpfs上,上面的例子便采用了emptyDir类的Volume。

缺省情况下,EmptyDir 是使用主机磁盘进行存储的,也可以设置emptyDir.medium 字段的值为Memory,来提高运行速度,但是这种设置,对该卷的占用会消耗容器的内存份额。

2.hostPath

hostPath为在Pod上挂载宿主机上的文件或目录,它通常可以用于以下几方面。

  1. 容器应用程序生成的日志文件需要永久保持时,可以使用宿主机的高速文件系统进行存储。

  2. 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。

在使用这种类型的Volume时,需要注意以下几点:

  1. 在不同的Node上具有相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结构不一致。

  2. 如果使用了资源配额管理,则Kubernetes无法将hostPath在宿主机上使用的资源纳入管理。

在下面对例子中使用宿主机的/data目录定义了一个hostPath类型的Volume:

volumes:- name: "persistent-storage"  hostPath:    path: "/data"

3.gcePersistentDisk

使用这种类型的Volume表示使用谷歌公有云提供的永久磁盘(Persistent Disk,PD)存放Volume的数据,它与emotyDir不同,PD上的内容会被永久保存,当Pod被删除时,PD只是被卸载(Unmount),但不会被删除。需要注意的是,你需要先创建一个永久磁盘(PD),才能使用gcePersistentDisk。

使用gcePersistentDisk有以下一些限制条件。

Node(运行kubeket的节点)需要是GCE虚拟机。

这些虚拟机需要与PD存在于相同的GCE项目和Zone中。

通过gcloud命令即可创建一个PD:

gcloud compute disks create --size=500GB --zone=us-centrall-a my-data-disk

定义gcePersisentDisk类型的Volume的示例如下:

volumes:- name: test-volume  # This GCE PD must already exist.  gcePersistentDisk:    pdName: my-data-disk    fsType: ext4

4.awsElasticBlockStore

与GCE类似,该类型的Volume使用亚马逊公有云提供的EBS Volume存储数据,需要先创建一个EBS Volume才能使用awsElasticBlockStore。

使用awsElasticBlockStore的一些限制条件如下:

  1. Node(运行kubelet的节点)需要是AWS EC2实例。
  2. 这些AWS EC2实例需要与EBS volume存在于相同的region和availability-zone中。
  3. EBS只支持单个EC2实例mount一个volume。

通过aws ec2 create-volume命令可以创建一个EBS volume:

aws ec2 create-volume --availability-zone eu-west-1a --size 10 --volume-type gp2

定义awsElasticBlockStore类型的Volume的示例如下:

volumes:- name: test-volume  # This AWS EBS volume must already exist.  awsElasticBlockStore:    volumeID: aws://
/
fsType: ext4

5.NFS

使用NFS网络文件系统提供的共享目录存储数据时,我们需要在系统中部署一个NFS Server。定义NFS类型的Volume的示例如下:

volumes: - name: nfs   nfs:     # 改为你的NFS服务器地址     server: nfs-server.localhost     path: "/"

6.其他类型的Volume

  1. iscsi:使用iSCSI存储设备上的目录挂载到Pod中
  2. flocker:使用Flocker来管理存储卷
  3. glusterfs:使用开源GlusterFS网络文件系统的目录挂载到Pod中。
  4. rbd:使用Ceph块设备共享存储(Rados Block Device)挂载到Pod中。
  5. gitRepo:通过挂载一个空目录,并从GIT库clone一个git repository以供Pod使用。
  6. secret:一个secret volume用于为Pod提供加密的信息,你可以将定义在Kubernetes中的secret直接挂载的volume总是不会持久化的。
链接:https://www.orchome.com/1340
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

转载于:https://www.cnblogs.com/linux20190409/p/10976249.html

你可能感兴趣的文章
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
The Shared folder with you
查看>>
挖掘数据金矿 领军协同创新 曙光荣膺“2016大数据创新应用领袖企业”称号
查看>>
oschina程序开发
查看>>
《从零开始学Swift》学习笔记(Day 40)——析构函数
查看>>
CDN相关
查看>>
查找(AVL平衡二叉树)
查看>>
POJ2406 Power Strings(KMP)
查看>>
极值问题(acms)
查看>>
SVN Hooks的介绍及使用
查看>>
JAVA核心编程教学
查看>>
mysql 主从配置
查看>>
apache 限制指定user_agent
查看>>
[转]Apache重写中的flag说明
查看>>
20171011
查看>>
自我总结(九)---
查看>>
【N-Queens】cpp
查看>>
soap 的应用
查看>>
APP的广告模式
查看>>
STM32F4相关
查看>>