K8s 存储
什么是卷?为什么要用卷?
我们知道K8s是基于容器,对各个Pod进行管理的。Pod是由容器构成的,我也知道,容器(如Docker)有个特点就是,容器删除后,在容器中产生的数据也会随之销毁。K8s会监控容器的运行状态,当有容器崩溃或停止时,K8s的Controller会删除这些容器,并重新创建新的容器。如果容器被销毁,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。在崩溃期间,kubelet 会以干净的状态重新启动容器。
另外一个需求就是:当多个容器在一个 Pod 中运行并且需要共享文件时, 就需要跨所有容器设置和访问共享文件系统。
K8s卷分类
根据应用场景不同,和需求不同,将卷分为不同的种类
-
临时卷
-
持久卷
-
投射卷
卷的相关参数
-
卷类型
-
卷挂载位置
卷挂载位置
卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。
注意:卷不能挂载到其他卷之上(不过存在一种使用 subPath 的相关机制),也不能与其他卷有硬链接。
K8s目前支持的卷类型
已启用的卷类型
- awsElasticBlockStore (已弃用)
- azureDisk (已弃用)
- cinder (已弃用)
- gcePersistentDisk(已弃用)
- gcePersistentDisk(已弃用)
- gitRepo (已弃用)
- glusterfs(已移除)
- portworxVolume(已弃用)
- vsphereVolume(已弃用)
- flexVolume(已弃用)
可以使用的卷类型
- cephfs
- configMap
- downwardAPI
- emptyDir
- fc (光纤通道)
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- subPath
- 树外(Out-of-Tree)卷插件
常用的数据卷(Volume)有:
- 本地:如,HostPath、EmptyDir;
- 网络:如,NFS、Ceph、GlusterFS;
- 公有云:如,AWS EBS;
- K8s资源:如,Configmap、Secret。
临时卷
什么是临时卷?
临时卷的生命周期与 Pod 的生命周期相同,与 Pod 一起创建和删除,当 Pod 不再存在时,Kubernetes 也会销毁临时卷。 所以停止和重新启动 Pod 时,不会受持久卷在何处可用的限制。
应用场景1:有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。
示例:缓存服务经常受限于内存大小,而且可以将不常用的数据转移到比内存慢的存储中,对总体性能的影响并不大。
应用场景2:些应用程序需要以文件形式注入的只读数据
示例:比如配置数据或密钥。
临时卷类型
根据不同的用途,支持几种不同类型的临时卷
- EmptyDir: Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存
- 见投射卷:ConfigMap、 DownwardAPI、 Secret: 将不同类型的 Kubernetes 数据注入到 Pod 中
- CSI 临时卷: 类似于前面的卷类型,但由专门支持此特性 的指定 CSI 驱动程序提供
- 通用临时卷: 它可以由所有支持持久卷的存储驱动程序提供
emptyDir
、configMap
、downwardAPI
、secret
是作为 本地临时存储 提供的。它们由各个节点上的 kubelet 管理。
"本地"意味着存储介质不能是网络上的。
EmptyDir
EmptyDir是在当 Pod 分派到某个Node节点上时创建的,它的初始内容为空,k8s自动分配一个目录,而无需指定宿主机上对应的目录文件。当Pod销毁时, EmptyDir中的数据也会被永久删除。
无论Pod 中的容器挂载 emptyDir
卷的路径是否相同,这些容器都可以读写 emptyDir
卷中相同的文件。
说明:容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir
卷中的数据是安全的
emptyDir
的一些用途:
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
设置卷挂载位置:
使用emptyDir.medium
字段用来控制 emptyDir
卷的存储位置。
挂载位置可以是基于存储介质的,也可以是基于内存的:
emptyDir
卷存储在该节点所使用的介质上; 此处的介质可以