pod的每个容器都有自己独立的文件系统, 因为文件系统来自容器镜像. 如果想要共享磁盘, container需要自己进行挂载.

Kubernetes定义了存储卷, 它们被定义为pod的一部分, 并和pod共享相同的声明周期. 这意味着在pod启动时创建卷, 并在删除pod时销毁卷. 因此, 在容器重新启动期间, 卷的内容将保持不变, 在重新启动容器之后, 新容器可以识别前一个容器写入卷的所有文件.

通过卷在容器之间共享数据

使用emptyDir

卷从一个空目录开始, 运行在pod内的应用程序可以写入它需要的任何文件. 因为卷的生存周期与pod的生存周期相关联, 所以当删除pod时, 卷的内容就会丢失.

指定用于EMPTYDIR的介质

作为卷来使用的emptyDir, 是在承载pod的工作节点的实际磁盘上创建的, 因此其性能取决于节点的磁盘类型. 但我们可以通知Kubernetestmfs文件系统(存在内存而非硬盘)上创建emptyDir. 因此, 将emptyDirmedium设置为Memory:

1
2
3
4
volumes:
- name: html
emptyDir:
medium: Memory

使用Git仓库作为存储卷

gitRepo卷基本上也是一个emptyDir卷, 它通过克隆Git仓库并在pod启动时(但在创建容器之前)检出特定版本类填充数据.

在创建gitRepo卷之后, 它并不能和对应repo保持同步. 当向Git仓库推送新增的提交时, 卷中的文件将不会被更新.

1
2
3
4
5
volumes:
- name: html
gitRepo:
repository: https://github.com/luksa/kubia-website-example.git
directory: .

介绍sidercar容器

sidecar container, 它是一种容器, 增加了对pod主容器的操作. 可以将一个sidecar添加到pod中, 这样就可以使用现有的容器镜像, 而不是将附加逻辑填入主应用程序的代码中, 这会使它过于复杂和不可用.

访问工作节点文件系统上的文件

大多数pod应该忽略它们的主机节点, 因此它们不应该访问节点文件系统上的任何文件. 但是某系系统级别的pod(切记, 这些通常由DaemonSet管理)确实需要读取节点的文件或使用节点文件系统来访问节点设备. Kubernetes通过hostPath卷实现了这一点.

介绍hostPath

hostPath卷是持久性存储, 因为gitRepoemptyDir卷的内容都会在pod被删除时被删除, 而hostPath卷的内容则不会被删除. 如果删除了一个pod, 并且下一个pod使用了指向主机上相同路径的hostPath卷, 则新pod将会发现上一个pod留下的数据, 但前提是必须将其调度到与第一个pod相同的节点上.

使用持久化存储

当运行在一个pod中的应用程序需要将数据保存到磁盘上, 并且即使该pod重新调度到另一个节点时也要求具有相同的数据可用. 这就不能使用emptyDir, gitRepohostPath, 由于这些数据需要从任何集群节点访问, 因此必须将其存储在某种类型的网络储存中.

-------------本文结束感谢您的阅读-------------