kubernetes中的Volumes
为什么引入Volume
1.当container crash的时候,kubelet将会重启它,里面之前运行的数据将会丢失, 容器将以一个clean state的状态来启动.
2.运行在pod中的containers通常会共享数据. volumes的概念就是为了解决这些问题.
现状
kubernetes中的volume有完整的lifetime.在pod中可以脱离container而存在.container重启的时候, volume中的pod会被保存. pod消失的时候, volume也会消失. kubernetes支持多种volumes的类型.pod可以使用同时使用多个volume.类型如下
emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
projected
azureFileVolume
azureDisk
vsphereVolume
Quobyte
PortworxVolume
ScaleIO
常用的存储类型
emptyDir
emptyDir卷当pod分配给Node的时候会被创建, 伴随这pod在该Node上运行整个过程. 开始的时候为空的. pod中的containers可以读写emptyDir volume中的同一个文件, 这个volume可以被挂载到容器相同或者不同的目录. 但是如果pod在该node上被removed, 那么emptyDir中的数据将会被永远的删除. 注意:如果容器crashing pod没有从node上remove. emptyDir中的volume数据是safe的.
emptyDir的使用用途
暂存空间,如基于磁盘的合并排序
检查一个长时间的计算以恢复崩溃
持有内容管理器容器在Web服务器容器提供数据时提取的文件
默认情况下,根据您的环境,emptyDir卷存储在任何介质中,可能是磁盘或SSD或网络存储。 但是,您可以将emptyDir.medium字段设置为“Memory”,以告诉Kubernetes为您安装tmpfs(RAM支持的文件系统)。 虽然tmpfs非常快,但请注意,与磁盘不同,tmpfs在机器重新启动时被清除,您写入的任何文件都会计入您的容器的内存限制
Pod的例子
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
Hostpath
hostPath卷将文件或目录从主机节点的文件系统挂载到您的pod中。 这不是大多数Pods需要的,但它为某些应用提供了强大的逃生舱。
比如, 一些使用hostPath的例子
运行需要访问Docker内部的容器; 使用/ var / lib / docker的hostPath
在容器中运行cAdvisor; 使用/ dev / cgroups的hostPath
使用的时候需要注意的
1. 具有相同配置的pod(例如从podTemplate创建的)可能因节点上的不同文件在不同节点上的行为不同
2. 当Kubernetes按计划添加资源感知调度时,它将无法解决hostPath使用的资源
3. 在底层主机上创建的目录只能由root写入。 您需要以特权容器的身份运行您的进程,或修改主机上的文件权限,以便能够写入hostPath卷
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
hostPath:
# directory location on host
path: /data
gcePersistentDisk
awsElasticBlockStore
Nfs
nfs卷允许现有的NFS(网络文件系统)共享挂载到您的pod中。 不同于在删除Pod时被清除的emptyDir,nfs卷的内容将被保留,并且卷仅被卸载。 这意味着NFS卷可以预先填充数据,并且该数据可以在pod之间“切换”。 NFS可以同时由多个写入器安装。
nfs例子
https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/nfs
iSCSI
iscsi卷允许将现有iSCSI(基于IP的SCSI)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,将保留iscsi卷的内容,并且该卷仅被卸载。 这意味着可以使用数据预先填充一个iscsi卷,并且该数据可以在pod之间“切换”。
iSCSI的一个特点是它可以同时由多个消费者以只读方式安装。 这意味着您可以使用数据集预先填充卷,然后根据需要从多个pod中并行提供。 不幸的是,iSCSI卷只能由读写模式的单个消费者进行装载 – 不允许同时写入
iSCSI例子
https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/iscsi
flocker
Flocker是一个开源的集群容器数据卷管理器。 它提供由各种存储后端支持的数据卷的管理和编排。
Flocker卷允许将Flocker数据集挂载到pod中。 如果Flocker中尚未存在数据集,则需要首先使用Flocker CLI或使用Flocker API创建数据集。 如果数据集已经存在,它将被Flocker重新连接到调度盒的节点。 这意味着数据可以根据需要在pod之间“切换”。
flocker例子
https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/flocker
glusterfs
glusterfs卷允许将Glusterfs(开源网络文件系统)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,保留了一个glusterfs卷的内容,并且该卷只是被卸载。 这意味着可以使用数据预先填充一个glusterfs卷,并且该数据可以在pod之间“切换”。 GlusterFS可以同时由多个写入器安装。
Rbd
cephfs
gitRepo
secret
秘密卷用于将敏感信息(如密码)传递给pod。 您可以将秘密存储在Kubernetes API中,并将其作为文件安装在pod上,而不直接与Kubernetes连接。 秘密卷由tmpfs(RAM支持的文件系统)支持,因此它们永远不会写入非易失性存储。
PersistentVolumeClaim
persistentVolumeClaim卷用于将PersistentVolume安装到pod中。 PersistentVolumes是用户在不知道特定云环境的细节的情况下“声称”持久存储(如GCE PersistentDisk或iSCSI卷)的一种方式
downwardAPI
一个向下的API卷被用于使向下的API数据可用于应用程序。 它安装一个目录,并将所请求的数据写入纯文本文件。
https://kubernetes.io/docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information/
projected
A projected volume可以映射很多volume源到相同的目录下, 当前, 下面类型的volume sources支持的有
secret
downwardAPI
configMap
例子
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
SubPath
有时,在一个pod*享一个卷用于多个用途是有用的。 volumeMounts.subPath属性可用于指定引用卷而不是根的子路径。
例子-下面是一个LAMP stack的例子,Html内容映射到html文件目录下, databases存储在mysql文件目录下:
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
下一篇: 51Nod 1081 子段求和