Kubernetes滚动更新,通常保留本地数据?

使用本地节点存储来保持可变状态的Kubernetes应用程序(如在Kubernetes 101示例中)在应用程序更新时会丢失其存储空间。 这是典型的部署更新方法的一个副作用,即打开新的豆荚并closures旧的豆荚。 这是不幸的,因为这意味着即使数据通常已经存在于无法访问的卷中,也会将数据重新复制到每个节点上(可能有几百GB)。 这大大减缓了更新。

应用程序员可以做些什么来优化? 一些pod属性可以在原地更新 ,但是这只包含一小部分更新。 持久卷本质上是远程的,不是本地的,所以它们不能被映射,并且不会具有与本地存储相同的性能。 他们不适当地拥有独立于应该拥有它们的部署的生命。 问题#9043讨论这个问题,但似乎没有达成任何共识; 而且无论如何,有时可以在相同的节点上更换吊舱,但不能在原地进行更新。 问题#7562开始讨论它,但它变成了一个持续的卷的讨论。 问题#598是相关的,但是当你想让pod保持未分配给任何节点而不是使用空目录启动时,真的是这样。

就目前的Kubernetesdevise而言,本地存储应该总是被视为短暂的,就像容器或吊舱一样。 不仅仅是因为这样的场景,而是因为你的吊舱可能会随时崩溃并被重新安排。 从卷文档 :

当出于任何原因从节点删除Pod时,emptyDir中的数据将被永久删除。

emptyDir的一些用途是:

  • 暂存空间,例如用于基于磁盘的合并sorting
  • 检查点计算恢复从崩溃
  • 保存内容pipe理器容器在Web服务器容器提供数据时提取的文件

GCE SSD持久性磁盘速度非常快,但是如果您确实需要本地存储的性能,而不是暂时从持久性存储中复制数据以便使用它。