我最近开始学习Kubernetes,我注意到在线上的各种教程中几乎没有提到Volumes。教程涵盖了Pod,ReplicaSet,部署和服务-但它们通常以结合了这四种方式构建的一些微服务应用示例结尾。当涉及数据库时,他们只需部署带有“mongo”镜像的容器,为其命名并提供服务,以便其他容器可以看到它,然后将其保留。没有讨论如何将数据写入磁盘。
因此,我假设没有其他配置,容器就可以将文件写入磁盘。我不认为这意味着文件在容器重新启动后是持久的,但是如果我编写了一个简单的NodeJS应用程序,例如:

const fs = require("fs");
fs.writeFileSync("test.txt", "blah");
const value = fs.readFileSync("test.txt", "utf8");
console.log(value);
我怀疑这会正确地输出“blah”并且不会由于无法写入磁盘而崩溃(请注意,我还没有对此进行测试,因为当我还在学习Kubernetes时,我还没有意识到这一点。如何将自己的自定义镜像放入群集中-到目前为止,我只加载了已经在Docker Hub上的镜像)
但是,当阅读Kubernetes Volumes时,我遇到了Ephemeral Volume -该卷如下:

临时卷的存在使我得出以下两个结论之一:
  • 容器在未经授予权限(通过卷)的情况下无法写入磁盘,因此到目前为止,我所看过的每个教程都是双层的,因为当您尝试存储数据
  • 时mongo会崩溃
  • 临时卷没有意义,因为您可以将已经写入磁盘而无需它们,那么它们的作用是什么?

  • 那么这些事情是怎么回事?为什么有人会创建一个临时卷?

    最佳答案

    容器进程始终可以写入容器本地文件系统(Unix权限允许);但是删除广告连播后,其中的所有内容都会丢失。可以定期删除Pod(例如,如果您需要升级镜像),也可以在控件之外删除(如果其所在的节点已终止)。
    在文档中,types of ephemeral volumes突出了两点:

  • emptyDir卷,通常用于在单个容器中的容器之间共享内容(更具体地说,用于将数据从初始化容器发布到主容器);和
  • configMapdownward API或其他数据源注入(inject)的数据可能完全是人工

  • 在这两种情况下,数据“都像卷一样”:您可以指定数据来自何处以及在何处进行装载,并且可以隐藏基础镜像中的所有内容。与持久卷不同,如果删除并重新创建Pod,则基础存储可能不会持久。
    通常,数据库的预打包版本(例如Helm图表)将包含持久的卷声明(或在有状态集合中为每个副本创建一个声明),因此即使 pods 被破坏,数据也确实会持久存在。

    09-13 11:51