当kubernetes集群节点变成unknown状态,statefulset创建的pod并不会被主动重新在其他的节点上进行创建,需要人为的将该node通过kubectl delete node进行删除,这样才会在其他的节点上进行创建。

社区upstream的smarterclayton给出了为什么要这样设计

This is by design. When a node goes “down”, the master does not know whether it was a safe down(deliberate shutdown) or a network partition. If the master said “ok, the pod is deleted” then the pod could actually be running somewhere on the cluster, thus violating the guarantees of stateful sets only having one pod.
In your case, if you intend the node to be deleted, you must delete the node object. That will cause the master to understand that you wish the node to be gone, and delete the pods.

当你手动kubectl delete node 节点之后,会触发statefulset关联的pod重建,这个时候会出现pod处于pending状态,主要原因是down节点状态的pod可能还存在,仍然使用该ceph rbd进行读写,需要手动去除ceph rbd跟主机之间的关联关系。

所以处理办法分两种情况
方法一
下电状态为unknown状态的节点,重新调度到其他节点的kubelet会重新deattach/attach流程
方法二
在unknown状态的节点,使用rbd unmap命令unmap掉被map到主机的对应的rbd. 如果提示device busy,则需要先手动停止掉使用该rbd的container.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐