当一个容器崩溃了,kubelet将会尝试重启它,但是之前容器中的文件将会丢失。另外,一个Pod中多个容器之间共享文件也是必需的。Kubernetes提供了一个Volume抽象概念来解决这些问题。
Volume的生命周期
Volume的生命周期与Pod一致。当Pod停止,Volume也将停止。
比Pod中的任何容器存活时间长。容器如果意外退出后,可能会自动重启。
如何使用Volume
通过.spec.volumes
字段为Pod指定一组Volume。
通过.spec.containers[*].volumeMounts
为某一个容器挂在一组Volume。
示例: 创建一个Nginx的deployment并暴露出去,在浏览器中请求该服务,显示”Hello World!”
1 | apiVersion: v1 |
执行命令:
1 | kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/volumes/example-01.yaml |
在浏览器打开http://localhost:8081/api/v1/namespaces/default/services/nginx-service/proxy/就可以看见`Hello World!`
Volume的类型
Kubenetes支持的Volume很多,详细的可以看https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes。
我大致将其分为如下四类:
- 云提供者提供的存储资源:
awsElasticBlockStore
、azureDisk
、azureFile
、gcePersistentDisk
、vsphereVolume
(vSphere)和cinder
(OpenStack)。 - Kubernetes对象和集群中的存储资源:
configMap
、secret
、downwardAPI
、emptyDir
、projected
、local
、hostPath
和persistentVolumeClaim
。 - 其他外部存储资源:
cephfs
、fc (fibre channel)
、flocker
、gitRepo (deprecated)
、glusterfs
、iscsi
、nfs
、portworxVolume
、quobyte
、rbd
、scaleIO
和storageos
。 - 插件:
Container Storage Interface (CSI)
和FlexVolume
emptyDir
该类型的Volume是一个临时的空间,主要用来临时存储数据。当Pod被删除(被kubelet驱逐,手动删除等)时,在该类型Volume上的数据会被永久清除。
上面的示例中使用的就是该类型的Volume。还可以用来在不同容器之间共享数据。
configMap
、secret
和downwardAPI
ConfigMap 和 Secret 是Kubernetes对象。
ConfigMap用于存储配置信息,Secret用来存储敏感信息(比如密码),这两种资源可以挂载到Pod上作为Volume。downwardAPI
类型的Volume用来使应用程序可以使用下行的API数据。
如果一个应用程序需要很多很多配置信息和敏感信息,如果直接挂载Pod上会很麻烦。projected
可以帮助我们将多个volume映射到同一个目录下。