学习笔记
分享学习经验,记录生活点滴

K8S-将磁盘挂载到容器

pod中的每个容器都有自己独立的文件系统,因为文件系统来自容器镜像。

​ 在某些场景下,我们可能希望新的容器可以在之前容器结束的位置继续运行,比如在物理机上重启进程。可能不需要(或者不想要)整个文件系统被持久化,但又希望能保存实际数据的目录。
Kubernetes通过定义存储卷来满足这个需求,它们不像pod这样的顶级资源,而是被定义为pod的一部分,并和pod共享相同的生命周期。这意味着在pod启动时创建卷,并在删除pod时销毁卷。因此,在容器重新启动期间,卷的内容将保持不变,在重新启动容器之后,新容器可以识别前一个容器写入卷的所有文件。另外,如果一个pod包含多个容器,那这个卷可以同时被所有的容器使用。

1 可用的卷类型

  • emptyDir——用于存储临时数据的简单空目录。
  • hostPath——用于将目录从工作节点的文件系统挂载到pod中。
  • gitRepo——通过检出Git仓库的内容来初始化的卷。
  • nfs——挂载到pod中的NFS共享卷。
  • gcePersistentDisk(Google高效能型存储磁盘卷)、awsElastic BlockStore(Amazon Web 服务弹性块存储卷)、azureDisk(Microsoft Azure 磁盘卷)——用于挂载云服务商提供的特定存储类型。
  • cindercephfsiscsiflockerglusterfsquobyterbdflexVolumevsphere-VolumephotonPersistentDiskscaleIO——用于挂载其他类型的网络存储。
  • configMapsecretdownwardAPI——用于将Kubernetes部分资源和集群信息公开给pod的特殊类型的卷。
  • persistentVolumeClaim——一种使用预置或者动态配置的持久存储类型。

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

2.1 使用emptyDir

  • 在pod中使用emptyDir

  • 创建pod

  • 查看pod状态

    $ kubectl port-forward fortune 8080:80 将端口从本地机器转发到pod

    $ curl http://localhost:8080

  • 指定用于EMPTYDIR的介质

2.2 使用Git仓库作为存储卷

​ 对Github项目中的文件进行修改后,这些更改在web服务器上不可见,因为gitrepo卷与Git仓库未能保持同步,可以通过再次访问pod来确认这一点。要查看新版本的站点,需要删除pod并重建,每次进行更改时,没必要每次都删除pod,可以运行一个附加进程(sidecar容器)来使卷与Git仓库保持同步。

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

3.1 介绍hostPath

hostPath卷指向节点文件系统上的特定文件或目录。在同一个节点上运行并在其hostPath卷中使用相同路径的pod可以看到相同的文件。

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

​ 如果你正在考虑使用hostPath卷作为存储数据库数据的目录,请重新考虑。因为卷的内容存储在特定节点的文件系统中,所以当数据库pod被重新安排在另一个节点时,会找不到数据。这解释了为什么对常规pod使用hostPath卷不是一个好主意,因为这会使pod对预定规划的节点很敏感。

3.2 检查使用hostPath卷的系统pod

​ 如何正确地使用hostPath卷?先看一下是否有系统层面的pod已经在使用这种类型的卷,而不是直接创建一个新pod。

4 使用持久化存储

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

5 小结

  • 创建一个多容器pod,并通过为pod添加一个卷并将其挂载到每个容器中,来让pod中的容器操作相同的文件
  • 使用emptyDir卷存储临时的非持久数据
  • 使用gitRepo卷可以在pod启动时使用Git库的内容轻松填充目录
  • 使用hostPath卷从主机节点访问文件
  • 将外部存储装载到卷中,以便在pod重启之前保持pod数据读写
  • 通过使用持久卷和持久卷声明解耦pod与存储基础架构
  • 为每个持久卷声明动态设置所需(或缺省)存储类的持久卷
  • 当需要将持久卷声明绑定到预配置的持久卷时,防止动态置备程序干扰
赞(7) 打赏
未经允许不得转载:ABCLearning » K8S-将磁盘挂载到容器
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云限时红包 助力一步上云

了解详情领取红包

觉得文章有用就打赏一下文章作者

微信扫一扫打赏