1.1 Volume
容器内的磁盘都是临时的,Volume引入的原因:
1、当一个容器宕机后,kubelet会重启改容器,但是容器内的文件就会丢失
2、一个Pod内的多个容器需要共享数据
1.1.1 背景
docker中也有Volume的概念docker中的Volume只是简单的一个磁盘目录或者其他Container中的目录,管理比较简单,虽然目前支持了volume driver,但是单个容器只支持使用一个volume driver。
K8s中的Volume,有着明确的生命周期,与Pod的生命周期相同,Volume独立于Pod内的Container,在Container重启过程中,Volume保持不变。当然,让一个Pod停止退出时,Volume也会停止退出。除此之外,一个POD可以同时使用任意数量的,任意类型的卷。
Pod中的Container必须明确指定卷的挂载点
1.1.2 卷类型
1.1.2.1 emptyDir
当使用emptyDir卷的Pod在节点创建时,会在该节点创建一个新的空目录,只要改Pod运行在该节点,该目录会一直存在,Pod内的容器可以将改目录挂载到不同的挂载点,但都可以读写emptyDir内的文件。当Pod不论什么原因被删除,emptyDir的数据都会永远被删除(一个Container Crash 并不会在该节点删除Pod,因此在Container crash时,数据不会丢失)
使用场景
1、 临时空间,例如基于磁盘空间做合并排序
2、 检测一个比较长的计算任务,能够让改计算任务从crash 恢复
3、 保存 内容管理Container 获取的文件,webserver 容器处理这些数据
默认情况下,emptyDir支持任何类型的后端存储:disk、ssd、网络存储。也可以通过设置 emptyDir.medium 为Memory,K8s会默认mount一个tmpfs(RAM-backed filesystem),因为是RAM Backed,因此tmpfs 通常很快。但是会在容器重启或者crash时,数据丢失。
1.1.2.2 hostPath
挂载Node节点以及存在的文件或者目录,不太常用,一下场景
1、 运行的容器需要访问宿主机的docker 内部信息 例如/var/lib/docker 目录
2、 容器内运行cadvisor,需要访问 /dev/cgroups
使用该类型的卷,需要注意以下几个方面:
1、 使用同一个模板创建的Pod,由于不同的节点有不同的目录信息,可能会导致不同的结果
2、 如果K8s增加了已知资源的调度,该调度不会考虑hostPath使用的资源
3、 如果宿主机目录上已经存在的目录,只可以被root可以写,所以容器需要root权限访问该目录,或者修改目录权限
1.1.2.3 gcePersistentDisk
GCE提供的存储
1.1.2.4 awsElasticBlockStore
AWS提供的块存储
1.1.2.5 NFS
与emptyDir不同,基于NFs的卷,在Pod删除时,卷并不会清除,只是与容器解绑。NFS支持同时读写。
NFS Server 需要单独搭建
1.1.2.6 Iscsi
iScSi提供卷,在Pod删除时,卷并不会清除,只是与容器解绑
iSCSI Server 必须自己搭建
使用iscsi的一个特性,多个容器挂载卷时,可以指定挂载类型为read-only,但是有个缺点,iscsi卷只能同时被一个Container挂载为读写模式,不支持多个Container同时读写。
1.1.2.7 Flocker
开源,容器集群 卷管理,支持管理和编排多种存储后端的数据卷
一个flocker volume 允许挂载一个flocker dataset 到一个Pod
1.1.2.8 Glusterfs
支持多容器同时写
1.1.2.9 RBD
Rados Block Device voluem 挂载到Pod
Rbd特点:可以被同时挂载为Read-Only。但是只能同时被一个Container 挂载为读写模式
1.1.2.10 Cephfs
支持多容器同时写
1.1.2.11 Gitrepo
可以类似一个卷插件,挂载一个空目录,clone git上的仓库到该目录,Pod可以使用该仓库
1 | **apiVersion****:** **v1** |
1.1.2.12 secret
存放敏感信息的卷,具体可以参考K8s的Secret介绍
1.1.2.13 其他
PersistentVolumeClain
dowanwardAPI
AzureFileVolume
AzureDiskVolume
vsphereVolume