Kubernetes 如何在 StatefulSet 中跟踪哪个云盘挂载到哪个 Pod?
Posted
技术标签:
【中文标题】Kubernetes 如何在 StatefulSet 中跟踪哪个云盘挂载到哪个 Pod?【英文标题】:How does Kubernetes track which cloud disk is attached to which Pod in a StatefulSet? 【发布时间】:2018-06-22 21:19:06 【问题描述】:我在 GKE 上创建了一个 StatefulSet,它提供了一堆 GCE 磁盘,这些磁盘连接到属于该 StatefulSet 的 pod。假设我将 StatefulSet 缩放为 0:组成的 pod 被销毁并且磁盘被释放。当我扩大规模时,磁盘会重新连接并安装在正确的 pod 内。
我的问题是:
Kubernetes 如何跟踪哪个 GCE 磁盘要重新连接到哪个 StatefulSet pod? 假设我想从快照中恢复 StatefulSet Pod 的 PV。如何让 Kubernetes 使用从快照创建的磁盘,而不是旧磁盘?【问题讨论】:
【参考方案1】:当您将 StatefulSet 扩展为 0 个副本时,pod 会被销毁,但持久卷和持久卷声明会被保留。与 GCE 磁盘的关联写在 PersistentVolume 对象中。当您再次扩展 RS 时,Pod 被分配到正确的 PV,从而从 GCE 获得相同的卷。
为了在快照还原后更改持久卷 - GCE 磁盘关联,您需要编辑 PV 对象。
【讨论】:
谢谢。第二部分我已经想通了:就我而言,因为我在 GCE 上,所以我能够编辑spec.gcePersistentDisk.pdName
并将其替换为我恢复的图像的名称。但是我的第一个问题仍然存在(此时这主要是一个好奇的问题)——StatefulSet 控制器如何识别哪个序数需要哪个 PV?
我认为,通过设计,StatefulSet 按名称关联 PVC 和 Pod。如您所知,StatefulSet 中的 pod 的名称比 ReplicaSet 生成的名称随机性小,例如 mypod-0、mypod-1 等。我猜 StatefulSet 实现只是将这些 pod 名称映射到同源 PVC,例如 mypod-0 与 mypvc-0 相关联,依此类推
哦,没错,PVC 也是按顺序排列的。是的,这是有道理的。谢谢。
我手动编辑PV切换出底层云盘有什么问题吗?
只要你确定磁盘的内容是正确的,没有就没有问题。实际上,PV 是由系统管理员手动管理的,而自动创建它们的事实是 GCE 的一项功能。您完全可以编辑它们【参考方案2】:
Kubernetes 1.12 开始使用 Kubernetes 的 Snapshot / restore 功能和CSI (Container Storage Interface) 以更通用的方式解决此问题,作为 alpha 功能引入。 这提供了标准化的 API 设计 (CRD),并为 CSI volume drivers 添加了 PV 快照/恢复支持。
这不再特定于 GKE。
查看功能请求“Snapshot / Restore Volume Support for Kubernetes (CRD + External Controller)”及其关联的CSI snapshot design。
statefulSet 方面在 beta 级别是 not yet fully addressed in this,但将来会:
以下是当前阶段的非目标,但将在稍后阶段考虑。
目标 5:提供更高级别的管理,例如备份和恢复 pod 和 statefulSet,以及创建一致的快照组。
见PR for the documentation:“Volume Snapshot and Restore Volume from Snapshot Support”
【讨论】:
以上是关于Kubernetes 如何在 StatefulSet 中跟踪哪个云盘挂载到哪个 Pod?的主要内容,如果未能解决你的问题,请参考以下文章