[TOC] # 介绍 * K8s集群中存储卷和Docker中的存储卷有些类似,不同之处在于 * Docker存储卷作用于一个容器 * K8s存储卷的生命周期和作用范围是Pod * 每个Pod中声明的存储卷由Pod中所有容器共享 * K8s支持的存储卷类型有 * 公有云存储: AWS\、Google、Azure * 分布式存储:GlusterFS、Geph * 主机本地目录、NFS * 使用Persistent Volume Claim 逻辑存储 Kubernetes volume,拥有明确的生命周期,与所在的Pod的生命周期相同。因此,Kubernetes volume独立与任何容器,与Pod相关,所以数据在重启的过程中还会保留,当然,如果这个Pod被删除了,那么这些数据也会被删除。更重要的是,Kubernetes volume 支持多种类型,任何容器都可以使用多个Kubernetes volume。 ## Volumes类型 > emptyDir hostPath nfs gcePersistentDisk awsElasticBlockStore iscsi glusterfs rbd gitRepo secret persistentVolumeClaim ### emptyDir 一个emptyDir 第一次创建是在一个pod被指定到具体node的时候,并且会一直存在在pod的生命周期当中,正如它的名字一样,它初始化是一个空的目录,pod中的容器都可以读写这个目录,这个目录可以被挂在到各个容器相同或者不相同的的路径下。当一个pod因为任何原因被移除的时候,这些数据会被永久删除。注意:一个容器崩溃了不会导致数据的丢失,因为容器的崩溃并不移除pod. emptyDir 磁盘的作用: * 普通空间,基于磁盘的数据存储 * 作为从崩溃中恢复的备份点 * 存储那些那些需要长久保存的数据,例web服务中的数据 ### hostPath 一个hostPath类型的磁盘就是挂在了主机的一个文件或者目录,这个功能可能不是那么常用,但是这个功能提供了一个很强大的突破口对于某些应用来说 例如,如下情况我们旧可能需要用到hostPath * 某些应用需要用到docker的内部文件,这个时候只需要挂在本机的/var/lib/docker作为hostPath * 在容器中运行cAdvisor,这个时候挂在/dev/cgroups ``` apiVersion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: nginx-container image: nginx ports: - containerPort: 80 volumeMounts: - name: volume-pod mountPath: /nginx-volume - name: busybox-container image: busybox command: ['sh', '-c', 'echo The app is running! && sleep 3600'] volumeMounts: - name: volume-pod mountPath: /busybox-volume volumes: - name: volume-pod hostPath: path: /tmp/volume-pod ``` ### nfs nfs使的我们可以挂在已经存在的共享到的我们的Pod中,和emptyDir不同的是,emptyDir会被删除当我们的Pod被删除的时候,但是nfs不会被删除,仅仅是解除挂在状态而已,这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递.并且,nfs可以同时被多个pod挂在并进行读写 注意:必须先保证NFS服务器正常运行在我们进行挂在nfs的时候