繁体   English   中英

为单个副本设置有状态是一种矫枉过正吗?

[英]Is Stateful set for single replica an overkill?

我需要使用“最多一次”语义运行我的应用程序。 在任何给定时间只运行我的应用程序的一个实例或根本不运行是绝对重要的

一开始我使用的是带有单个副本的资源类型“部署”,但后来我意识到在网络分区期间我们可能会无意中运行多个实例。

我在 kubernetes 中搜索 most once 语义时偶然发现了“有状态集”。 进一步阅读时,这些示例处理了容器需要持久卷的情况,并且通常这些容器使用多个副本运行。 我的应用程序甚至没有使用任何卷。

我还阅读了有关在节点无法访问时杀死 pod 的容忍度。 鉴于 tolerations 可以处理 pod 无法访问的情况,有状态设置对我的用例来说是否太过分了?

我正在证明使用有状态集是合理的 - 因为即使在那个时候节点变得无法访问并且达到了容忍秒数并且 kubelet 意识到它与网络断开并杀死了进程,kubernetes 可以启动另一个实例。 而且我相信 stateful set 也可以防止这种极端情况。

我对吗? 有没有其他方法可以实现这一目标?

引用Kubernetes 文档

...StatefulSets 为其 Pod 维护一个粘性、稳定的身份...保证每个 Pod 的身份有助于避免在节点无法访问(网络分区)的情况下出现裂脑副作用。

如同一文档中所述,节点上的 StatefulSet Pod 被标记为“未知”并且不会重新调度,除非在节点无法访问时强行删除。 如果走这条路,要考虑适当的恢复。

所以,是的 - StatefulSet 可能比 Deployment 更适合给定的用例。

在我看来,使用 StatefulSet 并不过分——选择最适合您的用例的 Kubernetes 对象。

在任何给定时间只运行我的应用程序的一个实例绝对至关重要。

使用领导选举模式来保证最多有一个活动副本 如果您使用多个副本和领导者选举,则其他副本在网络分区情况下处于待机状态。 这就是Kubernetes 控制平面中的组件在只需要一个活动实例解决这个问题的方式

Kubernetes 中的领导者选举算法通常通过使用超时锁定(例如在 etcd 中)来工作。 只有拥有锁的实例是活动的 当锁定超时时,领导者选举算法要么延长锁定超时时间,要么选举新的领导者。 它的工作方式取决于实现,但可以保证最多有一个领导者- 活动实例。

参见例如Simple Leader Election with Kubernetes ,它也描述了如何在side car容器中解决这个问题。

如果您的应用程序是无状态的,您应该使用Deployment而不是StatefulSet 看起来StatefulSet是一种网络分区情况下最多解决一个实例的方法,但这主要是在有状态复制应用程序(例如缓存或数据库集群)的情况下,即使它也可以解决您的特定情况.

  • Statefulsets 不是最多一种语义的资源——它们通常用于部署“状态完整”的应用程序,例如使用其 pod 的持久身份在它们之间进行集群的数据库

  • 我们遇到过与您提到的类似的问题 - 我们隐含地假设在启动新实例之前将完全删除旧 pod

  • 一种选择是使用 preStop hooks + init-containers 组合的组合

  • preStop hook 将进行必要的清理(比如删除应用程序特定的 etcd 密钥)

  • Init 容器可以等到 etcd 键消失(有一个上限)。

参考:

https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

另一种选择是尝试使用反亲和性设置,但我对这个不是很确定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM