数据卷用于实现容器持久化数据,kubernetes对于数据卷重新定义,提供了丰富强大的功能。

kubernetes提供了以下类型的数据卷:1.EmptyDir
2.HostPath
3.GCE Persistent Disk
4.Aws Elastic Block Store
5.NFS
6.iSCSI
7.Flocker
8.GlusterFS
9.RBD
10.Git Repo
11.Secret
12.Persistent Volume Claim
13.Downward API

一、本地数据卷
kubernetes中有两种类型的数据卷,它们只能作用于本地文件系统,我们称为本地数据卷。
本地数据卷中的数据只会存在于一台机器上,所以当Pod发生迁移的时候,数据便会丢失,无法满足真正的数据持久化要求。但是本地数据卷提供了其他用途,比如Pod中容器的文件共享,或者共享宿主机的文件系统。
1.EmptyDir
EmptyDir从名称上的意思是空的目录,它是在Pod创建的时候新建的一个目录。
如果Pod配置了EmptyDir数据卷,在Pod的生命周期内都会存在,当Pod被分配到Node上的时候,会在Node上创建EmptyDir数据卷,并挂载到Pod的容器中。
只要Pod存在,EmptyDir数据卷都会存在(容器删除不会导致EmptyDir数据卷丢失数据),但是如果Pod的生命周期终结(Pod被删除),EmptyDir数据卷也会被删除,并且永久丢失。
EmptyDir数据卷非常适合实现Pod中容器的文件共享。目前EmptyDir类型的volume主要作临时空间,如web服务器写日志或者tmp文件需要的临时目录。
定义文件示例:emptydir-volume-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
labels:
name: emptydir-volume
role: master
name: emptydir-volume
spec:
containers:
- name: emptydir-volume
image: registry:5000/back_demon:1.0
volumeMounts:
- name: log-storage
mountPath: /home/laizy/test/
command:
- /run.sh
volumes:
- name: log-storage
emptyDir: {}
2.HostPath
HostPath数据卷允许将容器宿主机上的文件系统挂载到Pod中。如果Pod需要使用宿主机上的某些文件,可以使用HostPath数据卷。
创建一个Pod需要使用宿主机的SSL证书,可以通过创建HostPath数据卷,然后将宿主机的/etc/ssl/certs目录挂载到容器中。

Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:nginx
spec:
containers:
-name:nginx
image:nginx
ports:
-containerPort:80
protocol:TCP
volumeMounts:
-name:ssl-certs
mountPath:/etc/ssl/certs
readOnly:true
volumes:
-name:ssl-certs
hostPath:
path:/etc/ssl/certs
二、网络数据卷
网络数据卷能够满足数据的持久化需求,Pod通过配置使用网络数据卷,每次Pod创建的时候都会将存储系统的远端文件目录挂载到容器中,数据卷中的数据将被永久保存,即使Pod被删除的时候,只是除去挂载数据卷,数据卷中的数据仍然保存在存储系统中,并且当新的Pod被创建的时候,仍是挂载同样的数据卷。
1.NFS
NFS(Network File System)即网络文件系统,是FreeBSD支持的一种文件系统,它允许网络中的计算机通过TCP/IP共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS数据卷的配置参赛:

emptyDir 的卷 emptydir数据卷类型有什么作用_数据

Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:nfs-web
spec:
containers:
-name:web
image:nginx
ports:
-name:web
containerPort:80
volumeMounts:
-name:nfs
mountPath:"/usr/share/nginx/html"
volumes:
-name:nfs
nfs:
server:nfs-server.default.kube.local
path:"/"

2.RBD
Ceph是开源、分布式的网络存储,同时又是文件系统。Ceph基于可靠的、可扩展的和分布式的对象存储,通过一个分布式的集群管理元数据,符合POSIX。
RBD是一个Linux块设备驱动,提供了一个共享网络块设备,实现与Ceph的交互。RBD在Ceph对象存储的集群上进行条带化和复制,提供可靠性、可扩展性以及对块设备的访问。
kubernetes中支持RBD方式,RBD数据卷配置的参数如下:

emptyDir 的卷 emptydir数据卷类型有什么作用_Pod_02

emptyDir 的卷 emptydir数据卷类型有什么作用_数据_03

Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:rbd
spec:
containers
-image:kubernetes/pause
name:rbd-rw
volumeMounts:
-mountPath:/mnt/rbd
name:rbdpd
volumes:
-name:rbdpd
rbd:
fsType:ext4
image:foo
keyring:/etc/ceph/keyring
monitors:
-10.16.154.78:6789
-10.16.154.79:6789
-10.16.154.80:6789
pool:kube
readOnly:true
user:admin

3.iSCSI
iSCSI技术是一种由IBM公司研究开放的,是一个供硬设备使用的可以在IP的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。
iSCSI技术是一种新的存储技术,该技术是将现有的SCSI接口与以太网技术结合,使服务器可与使用IP网络的存储装置互相交换资料。
iSCSI数据卷的配置参数:

emptyDir 的卷 emptydir数据卷类型有什么作用_Elastic_04

Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:iscsipd
spec:
containers:
-image:kubernetes/pause
name:iscsipd-ro
volumeMounts:
-mountPath:/mnt/iscsipd
name:iscsipd-ro
-image:kubernetes/pause
name:iscsipd-rw
volumeMounts:
-mountPath:/mnt/iscsipd
name:iscsipd-rw
volumes:
-iscsi:
fsType:ext4
iqn:iqn.2001-04.com.example:storage.kube.sysl.xyz
lun:0
readOnly:true
targetPortal:10.0.2.15:3260
name:iscsipd-ro
-iscsi:
fsType:ext4
iqn:iqn.2001-04.com.example:storage.kube.sysl.xyz
lun:0
readOnly:true
targetPortal:10.0.2.15:3260
name:iscsipd-rw
4.GlusterFS
GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。
GlusterFS数据卷配置参数:

emptyDir 的卷 emptydir数据卷类型有什么作用_Elastic_05

Endpoints的定义文件如下:
apiVersion:v1
kind:Endpoints
metadata:
name:glusterfs-cluster
subsets:
-addresses:
-ip:10.240.106.152
ports:
-port:1
-addresses:
-ip:10.240.79.157
Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:glusterfs
spec:
containers:
-image:kubernetes/pause
name:glusterfs
volumeMounts:
-mountPath:/mnt/glusterfs
name:glustersfvol
volumes:
-glusterfs:
endpoints:glusterfs-cluster
path:kube_vol
readOnly:true
name:glustersfvol
5.Flocker
Flocker是一个容器数据管理工具,作为ClusterHQ公司2014年推出的产品,Flocker主要负责Docker容器及其数据的管理。Flocker是一个数据卷管理器和多主机的Docker集群管理工具。用户可以通过它来控制数据,实现在Docker中运行数据库、队列和键值存储服务,并在应用程序中轻松使用这些服务。
Flocker数据卷配置参数:

emptyDir 的卷 emptydir数据卷类型有什么作用_Elastic_06

Pod的定义文件如下:
apiVersion:v1
kind:Pod
metadata:
name:flocker-web
spec:
containers:
ports:
-name:web
containerPort:80
volumeMounts:
#name must match the volume name below
-name:www-root
mountPath:"/usr/share/nginx/html"
volumes:
-name:www-root
flocker:
datasetName:my-flocker-vol
6.AWS Elastic Block Store
AWS Elastic Block Store在AWS云中提供用于Amazon EC2实例的持久性数据的块级存储卷。如果kubernetes运行在AWS之上,就可以非常方便地使用Amazon Elastic Block Store作为数据卷。
Amazon Elastic Block Store数据卷的配置参数:

emptyDir 的卷 emptydir数据卷类型有什么作用_Elastic_07

Pod的定义文件如下:
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:aws://<availability-zone>
fsType:ext4
7.GCE Persistent Disk
GCE Persistent Disk是GCE提供的持久化数据的服务,如果kubernetes运行在GCE之上,可以使用GCE Persistent Disk作为数据卷。
GCE Persistent Disk数据卷的配置:

emptyDir 的卷 emptydir数据卷类型有什么作用_Pod_08

emptyDir 的卷 emptydir数据卷类型有什么作用_Elastic_09

Pod的定义文件如下:
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

三、Persistent Volume和Persistent Volume Claim关系
kubernetes中提供了Persistent Volume和Persistent Volume Claim机制,这是存储消费模式。
Persistent Volume是由系统管理员配置创建的一个数据卷,它代表了某一类存储插件实现,可以是NFS、iSCSI等;而对于普通用户来说,通过Persistent Volume Claim可请求并获得合适的Persistent Volume,而无须感知后端的存储实现。
Persistent Volume和Persistent Volume Claim相互关联,有着完整的生命周期管理。
Persistent Volume的状态包括以下几项:
1.Available:Persistent Volume创建成功后进入可用状态,等待Persistent Volume Claim消费。
2.Bound:Persistent Volume被分配到Persistent Volume Claim进行绑定,Persistent Volume进入绑定状态。
3.Released:Persistent Volume绑定的Persistent Volume Claim被删除,Persistent Volume进入释放状态,等待收回处理。
4.Failed:Persistent Volume执行自动清理回收策略失败后,Persistent Volume会进入失败状态。
Persistent Volume Claim的状态包括如下几项:
1.Pending:Persistent Volume Claim创建成功后进入等待状态,等待绑定Persistent Volume。
2.Bound:分配Persistent Volume给Persistent Volume Claim进行绑定,Persistent Volume Claim进入绑定状态。
四、Persistent Volume
Persistent Volume实际上就是复用了已有的数据卷实现,配置方法也是一致的,Persistent Volume目前支持以下类型:
1.GCE Persistent Disk
2.AWS Elastic Block Store
3.NFS
4.iSCSI
5.RBD
6.GlusterFS
7.HostPath(只适合测试使用)

创建Persistent Volume的时候需要指定数据卷的容量、访问模式、回收策略。
1.容量
Persistent Volume通过设置资源容量,然后Persistent Volume Claim在请求的时候指定资源需求来进行匹配。
例如:
capacity:
storage:20Gi
2.访问模式:
1).ReadWriteOnce:数据卷能够在一个节点上挂载为读写目录。
2).ReadOnlyMany:数据卷能够在多个节点上挂载为只读目录。
3).ReadWriteMany:数据卷能够在多个节点上挂载为读写目录。
3.回收策略:
1).Retain:Persistent Volume在释放后,需要人工进行回收操作。
2).Recycle:Persistent Volume在释放后,kubernetes自动进行清理,清理完成后Persistent Volume则可以再次绑定使用。
Persistent Volume的定义文件nfs-pv.yaml:
apiVersion:v1
kind:PersistentVolume
metadata:
name:nfs-pv
labels:
type:nfs
spec:
capacity:
storage:5Gi
accessModes:
-ReadWriteMany
nfs:
server:nfs-server
path:/
通过定义文件创建Persistent Volume:
$kubectl create -f nfs-pv.yaml
查看创建的Persistent Volume:
$kubectl describe persistentvolume nfs-pv
五、Persistent Volume Claim
Persistent Volume Claim指定所需要的存储大小,然后kubernetes会选择满足条件的Persistent Volume进行绑定。
Persistent Volume Claim的定义文件test-pvc.yaml:
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:test-pvc
spec:
accessModes:
-ReadWriteMany
resources:
requests:
storage:3Gi
通过定义文件创建Persistent Volume Claim
$kubectl create -f my-pvc.yaml
创建成功后查询Persistent Volume Claim:
$kubectl describe persistentvolumeclain my-pvc

最后创建Pod来使用Persistent Volume Claim,Pod的定义文件:
apiVersion:v1
kind:Pod
metadata:
name:busybox
labels:
app:busybox
spec:
containers:
-name:busybox
image:busybox
command:
-sleep
-3600
volumeMounts
-mountPath:/busybox-data
name:data
volume:
-name:data
persistentvolumeclain:
claimName:my-pvc
六、信息数据卷
kubernetes中有一些数据卷,主要用来给容器传递配置信息,我们称之为信息数据卷。
比如Secret和Downward API都是将Pod的信息以文件形式保存,然后以数据卷方式挂载到容器中,容器通过读取文件获取相应的信息。
1.Secret
kubernetes提供了Secret来处理敏感数据,比如密码、token和密钥,相比于直接将敏感数据配置在Pod的定义或者镜像中,Secret提供了更加安全的机制,防止数据泄漏。
Secret的创建是独立于Pod的,以数据卷的形式挂载到Pod中,Secret的数据将以文件的形式保存,容器通过读取文件可以获取需要的数据。
Secret的类型有3种:
1).Opaque:自定义数据内容,默认值。
2).kubernetes.io/service-account-token:Service Account的认证内容。
3).kubernetes.io/dockkercfg:Docker镜像仓库的认证内容。
例如,现在有一个应用需要获取帐号密码,因为是自定义数据内容,所以Secret的类型是Opaque。
Secret定义文件secret.yaml:
apiVersion:v1
kind:Secret
metadata:
name:mysecret
type:Opaque
data:
username:my-username
password:my-password
通过定义文件创建Secret:
$kubectl create -f secret.yaml
创建成功后查询Secret:
$kubectl describe secret mysecret
然后创建Pod使用该Secret,Pod的定义文件:
apiVersion:v1
kind:Pod
metadata:
name:busybox
labels:
app:busybox
spec:
containers:
-name:busybox
image:busybox
command:
-sleep
-"3600"
volumeMounts:
-mountPath:/secret
name:secret
readOnly:true
volumes:
-name:secret
secret:
secretName:mysecret
2.Downward API
Downward API可以通过环境变量的方式告诉容器Pod的信息。另外,也可以通过数据卷方式传值,Pod的信息将会以文件的形式通过数据卷挂载到容器中,在容器中可以通过读取文件获取信息,目前支持:
1).Pod的名称。
2).Pod的Namespace。
3).Pod的Label
4).Pod的Annotation
创建Pod使用Downward API数据卷,Pod的定义文件downwardapi-volume.yaml:
apiVersion:v1
kind:Pod
metadata:
name:downwardapi-volume
labels:
zone:us-est-coast
cluster:test-cluster1
rack:rack-22
annotations:
build:two
builder:john-doe
spec:
containers:
-name:client-container
image:ubuntu:14.04
command:["/bin/bash","-c","while true;do sleep 5;done"]
volumeMounts:
-name:podinfo
mountPath:/podinfo/
readOnly:false
volumes:
-name:podinfo
downwardAPI:
items:
-path:"pod_name"
fieldRef:
fieldPath:metadata.name
-path:"pod_namespace"
fieldRef:
fieldPath:metadata.namespace
-path:"pod_labels"
fieldRef:
fieldPath:metadata.labels
-path:"pod_annotations"
fieldRef:
fieldPath:metadata.annotations
3.Git Repo
kubernetes支持将Git仓库下载到Pod中,目前是通过Git Repo数据卷实现,即当Pod配置Git Repo数据卷时,就下载配置的Git仓库到Pod的数据卷中,然后挂载到容器中。
创建Git Repo数据卷,Pod的定义文件:
apiVersion:v1
kind:Pod
metadata:
name:busybox
labels:
app:busybox
spec:
containers:
-name:busybox
image:busybox
command:
-sleep
-"3600"
volumeMounts
-mountPath:/config
name:busybox-config
volumes:
-name:busybox-config
gitRepo:
repository:http://github.com/wulonghui/busybox-config.git
revision:master