Container下可写但无状态分区的目的OS

Purpose of Writable but Stateless Partitions under Container OS

最近我运行在 Compute Engine 的容器 OS 下安装了一个容器,我的数据(特别是我的 TLS 证书)在重新启动后并没有在容器外持久保存,因为我正在写至 /etc。过了一会儿,我偶然发现了 Disks and file system overview - File system,它解释了它们是如何分为两种类型的可写分区:有状态和无状态。 /etc 是无状态的,我需要将我的持久文件移动到 /var 以进行有状态存储。

但我想知道可写、无状态分区的目的。 Deploying Containers - Limitations 解释了容器 OS(在 VM 实例上)如何只能 运行 一个容器。与仅在 docker 容器中写入数据相比,可写但无状态的分区启用了什么,因为这两个可写位置无论如何都会在主机 OS 重启时丢失?我能看到的唯一好处是在同一主机上跨容器共享数据 OS,但上述限制使这一点无效。

COS 映像的主要目的是安全性:最小 OS,没有无用的系统库和二进制文件,并且能够 运行 容器。

因此,/etc 是无状态的,不会在 COS 最重要的可执行库中持续更改和更新(后门)。

在容器端,它存在于内存中。你可以在上面写你想要的东西,它写在内存中(除非你的容器中有挂载卷,但这不是这里的目的)。而且您受到容器中可用内存量的限制。最后,当您停止容器时,它会从内存中卸载,当然,您会丢失容器中写入的所有数据。


所以现在,您需要记住容器的 /etc 与 VM 的 /etc 不同。 /var 也一样。您的容器的 /var 始终是无状态的(如果不是从 VM 卷挂载),您的 VM 的 /var 是有状态的。

此外,生命周期也不相同:您可以在 COS VM 上启动和停止多个容器,而无需停止并重新启动它。因此 VM /etc 将经历所有 VM 生命,并且可能“查看”几个容器的生命。

最终,COS 映像在计算引擎上用于 运行 一个容器,并且一次只能使用一个。但是,此 COS 映像也用于 Kubernetes 节点池(GCP 上的 GKE),通常使用 Kubernetes,您可以 运行 同一节点(Compute Engine 实例)上的多个 Pod(1+ 容器) ).

所有这些用例都可以向您展示这些限制和功能的含义和有用性(或无用性)(我希望我的解释很清楚!)