卷
卷
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, 由于这些数据需要从任何集群节点访问, 因此必须将其存储在某种类型的网络储存中.