Kubernets 详解--Volume

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
**apiVersion****:** **v1**

**kind****:** **Pod**

**metadata****:**

**name****:** **server**

**spec****:**

**containers****:**

**-** **image****:** **nginx**

**name****:** **nginx**

**volumeMounts****:**

**-** **mountPath****:** **/mypath**

**name****:** **git-volume**

**volumes****:**

**-** **name****:** **git-volume**

**gitRepo****:**

**repository****:** **"git@somewhere:me/my-git-repository.git"**

**revision****:** **"22f1d8406d464b0c0874075539c1f2e96c253775"**

1.1.2.12 secret

存放敏感信息的卷,具体可以参考K8s的Secret介绍

1.1.2.13 其他

PersistentVolumeClain

dowanwardAPI

AzureFileVolume

AzureDiskVolume

vsphereVolume