StatefulSet:pods陷入未知状态

时间:2017-01-06 06:12:11

标签: cassandra kubernetes

我正在使用https://github.com/jakevdp/sklearn_pycon2015在Kubernetes上试验Cassandra和Redis。

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

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

1 个答案:

答案 0 :(得分:5)

请参阅文档here

  

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

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

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

无法区分以下情况:

  1. 关闭实例而不删除Node对象。
  2. 在相关节点和kubernetes-master之间引入网络分区。
  3. 这两种情况都被视为节点上的kubelet被Kubernetes主人无法响应。如果在第二种情况下,我们要在不同的节点上快速创建替换pod,我们可能违反StatefulSet保证的最多一个语义,并且具有在不同节点上运行的具有相同身份的多个pod。在最坏的情况下,这甚至可能导致运行有状态应用程序时大脑和数据丢失。

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

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

    更多上下文位于github issue