卷
卷
pod
的每个容器都有自己独立的文件系统, 因为文件系统来自容器镜像. 如果想要共享磁盘, container
需要自己进行挂载.
Kubernetes
定义了存储卷, 它们被定义为pod
的一部分, 并和pod
共享相同的声明周期. 这意味着在pod
启动时创建卷, 并在删除pod
时销毁卷. 因此, 在容器重新启动期间, 卷的内容将保持不变, 在重新启动容器之后, 新容器可以识别前一个容器写入卷的所有文件.
通过卷在容器之间共享数据
使用emptyDir
卷
卷从一个空目录开始, 运行在pod
内的应用程序可以写入它需要的任何文件. 因为卷的生存周期与pod
的生存周期相关联, 所以当删除pod
时, 卷的内容就会丢失.
指定用于EMPTYDIR
的介质
作为卷来使用的emptyDir
, 是在承载pod
的工作节点的实际磁盘上创建的, 因此其性能取决于节点的磁盘类型. 但我们可以通知Kubernetes
在tmfs
文件系统(存在内存而非硬盘)上创建emptyDir
. 因此, 将emptyDir
的medium
设置为Memory
:
1 | volumes: |
使用Git
仓库作为存储卷
gitRepo
卷基本上也是一个emptyDir
卷, 它通过克隆Git
仓库并在pod
启动时(但在创建容器之前)检出特定版本类填充数据.
在创建gitRepo
卷之后, 它并不能和对应repo
保持同步. 当向Git
仓库推送新增的提交时, 卷中的文件将不会被更新.
1 | volumes: |
介绍sidercar
容器
sidecar container
, 它是一种容器, 增加了对pod
主容器的操作. 可以将一个sidecar
添加到pod
中, 这样就可以使用现有的容器镜像, 而不是将附加逻辑填入主应用程序的代码中, 这会使它过于复杂和不可用.
访问工作节点文件系统上的文件
大多数pod
应该忽略它们的主机节点, 因此它们不应该访问节点文件系统上的任何文件. 但是某系系统级别的pod
(切记, 这些通常由DaemonSet
管理)确实需要读取节点的文件或使用节点文件系统来访问节点设备. Kubernetes
通过hostPath
卷实现了这一点.
介绍hostPath
卷
hostPath
卷是持久性存储, 因为gitRepo
和emptyDir
卷的内容都会在pod
被删除时被删除, 而hostPath
卷的内容则不会被删除. 如果删除了一个pod
, 并且下一个pod
使用了指向主机上相同路径的hostPath
卷, 则新pod
将会发现上一个pod
留下的数据, 但前提是必须将其调度到与第一个pod
相同的节点上.
使用持久化存储
当运行在一个pod
中的应用程序需要将数据保存到磁盘上, 并且即使该pod
重新调度到另一个节点时也要求具有相同的数据可用. 这就不能使用emptyDir
, gitRepo
和hostPath
, 由于这些数据需要从任何集群节点访问, 因此必须将其存储在某种类型的网络储存中.