我有4个节点kubernetes集群。我的应用程序运行2个副本实例。我正在使用具有副本集的部署资源。根据文档,副本集始终确保指定的否。应用程序实例将运行。如果我删除了一个pod实例,那么它将在相同或不同的节点上重新启动。但是当我通过在一个节点上停止docker引擎来模拟pod实例的失败时。 Kubectl将状态显示为pod实例的错误,但不在另一个节点上重新启动pod。这是预期的行为还是我错过了什么。
答案 0 :(得分:3)
AFAIS Kubernetes用1.5版改变了这种行为。如果我正确解释docs,则失败节点的Pod仍然在apiserver中注册,因为它突然死亡并且无法取消注册pod。由于Pod仍然已注册,因此ReplicaSet不会替换它。
原因是,Kubernetes无法判断它是网络错误(例如裂脑)还是节点故障。随着StatefulSets的推出,Kubernetes需要确保没有Pod多次启动。
这可能听起来像是一个错误,但如果你有一个正确配置的云提供商(例如GCE或AWS),Kubernetes可以看到该节点是否仍在运行。当您关闭该节点时,控制器应取消注册Node及其Pod,然后在另一个节点上创建一个新的Pod。与节点运行状况检查和节点替换一起,群集能够自我修复。
如何配置云提供商在很大程度上取决于您的Kubernetes设置。
答案 1 :(得分:1)
等待大约5分钟关闭节点或泊坞窗。 Kubernetes将在该节点上运行的所有pod的状态标记为“Unknown”,并将其显示在剩余的活动符合条件的节点上。一旦失败的节点重新启动,如果K8S已经在其他节点上替换了它们,那么该节点上的pod将被删除。