存储卷介绍
一个容器的对文件系统的写入都是发生在文件系统的可写层的,一旦该容器运行结束,所有写入数据都会被丢弃。在K8S集群之中,Pod会在各个节点之间漂移,如何保障Pod的数据持久和不同节点数据的共享。Kubernetes提出了存储卷Volume的概念,Kubernetes存储卷主要解决了依次递增的几个问题:
- 当运行的容器崩溃时,kubelet会重新启动该容器,但容器会以干净状态被重新启动。容器崩溃之前写入的文件将会被丢失。
- 当一个Pod中同时运行多个容器时,这些容器之间需要共享文件。
- 在k8s中,由于Pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且在节点故障时,可能会导致数据的永久性丢失。
Kubernetes存储卷拥有明确的生命周期,与所在的Pod的生命周期相同。因此Kubernetes存储卷独立于任何容器,所以数据在Pod重启的过程中还会保留,当然如果这个Pod被删除了,那么这些数据也会被删除。
Kubernetes 支持的卷类型
Type | Type | Type | Type | Type | Type |
---|---|---|---|---|---|
awsElasticBlockStore | azureDisk | azureFile | cephfs | cinder | configMap |
csi | downwardAPI | emptyDir | fc (fibre channel) | flexVolume | flocker |
gcePersistentDisk | glusterfs | hostPath | iscsi | local | nfs |
persistentVolumeClaim | projected | portworxVolume | quobyte | rbd | scaleIO |
storageos | vsphereVolume |
emptyDir
emptyDir类型的存储卷创建于Pod被调度到宿主机上的时候,同一个Pod内的多个容器能读写emptyDir中的同一个文件,一旦这个Pod销毁或者漂移开该宿主机,emptyDir中的数据就会被永久删除。emptyDir类型的存储卷主要用作临时空间或者不同容器之间的数据共享。容器的crashing事件并不会导致emptyDir中的数据被删除。
emptyDir支持内存作为存储资源,emptyDir.medium设为Memory即可,但如果遇到node节点重启,emptyDir中的数据也会全部丢失。
以下演示如何在Pod中不同容器之间共享数据。
vi emptydir-pod.ya