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?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 如何运行容器?

Kubernetes 如何比较浅显的描述 Kubernetes 的架构

如何在 Kubernetes 中取消设置环境变量?

如何在 etcd 中访问 Kubernetes 密钥

如何让 SSH 在 Kubernetes 上运行?

如何在 Kubernetes Dashboard 中获取 Prometheus 数据