StatefulSet:pods陷入未知状态

mur*_*uru 2 cassandra kubernetes

我正在使用v1.5.1 的示例在Kubernetes上试验Cassandra和Redis .

  • 使用Cassandra StatefulSet,如果我关闭一个节点而不通过排空或删除它kubectl,该节点的Pod将永远保留(至少一周以上),而不会移动到另一个节点.
  • 使用Redis,即使pod与Cassandra一样,哨兵服务也会启动一个新的pod,因此功能pod的数量始终保持不变.

如果节点出现故障,有没有办法自动将Cassandra pod移动到另一个节点?或者我是否必须手动排空或删除节点?

Ani*_*han 5

请参阅此处的文档.

Kubernetes(1.5或更新版本)不会因为节点无法访问而删除Pod.在无法访问的节点上运行的Pod在超时后进入"终止"或"未知"状态.当用户尝试在无法访问的节点上正常删除Pod时,Pod也可能进入这些状态.可以从apiserver中删除处于这种状态的Pod的唯一方法如下:

  • Node对象被删除(由您或节点控制器删除).
  • 无响应节点上的kubelet开始响应,杀死Pod并从apiserver中删除条目.
  • 强制用户删除Pod.

这是kubernetes 1.5中引入的行为变化,它允许StatefulSet优先考虑安全性.

没有办法区分以下情况:

  1. 在没有删除Node对象的情况下关闭实例.
  2. 在所讨论的节点和kubernetes-master之间引入了网络分区.

这两种情况都被视为节点上的kubelet被Kubernetes主人无法响应.如果在第二种情况下,我们要在不同的节点上快速创建替换pod,我们可能违反StatefulSet保证的最多一个语义,并且具有在不同节点上运行的具有相同身份的多个pod.在最坏的情况下,这甚至可能导致运行有状态应用程序时大脑和数据丢失.

在大多数云提供程序中,当删除实例时,Kubernetes可以确定节点也被删除,因此可以在其他地方重新创建StatefulSet窗格.

但是,如果您在本地运行,则可能不会发生这种情况.建议您在关闭时从kubernetes中删除Node对象,或者使用协调循环使Kubernetes将节点的概念与可用的实际节点保持同步.

github问题还有一些上下文.