我有一个HA kubernetes设置,其中包含3个复制的主节点和一些工作节点,分为3个区域(这些是AWS可用性区域,但也可以是3个虚拟化硬件机器或类似的区域)。服务之一(或更确切地说,服务的Pod)正在跨区域形成集群,以便在一个区域出现故障时仍然可用。使用反亲和力规则分配吊舱。我将在该服务的pod内运行的单个应用程序称为“应用程序节点”(与“节点”相对,后者只是一个kubernetes节点)。
集群应用程序能够检测网络分区,并通过关闭少数地区Pod中的应用程序来避免脑裂的情况。让我们考虑以下布局:
如果在(A,B)与(C)之间存在网络分区,则在区域C中运行的应用程序将自行关闭。
现在的麻烦是,区域C中的主服务器将为该服务重新创建Pod,从而导致形成一个全新的应用程序集群,而这正是我们在这种情况下要避免的。
我想告诉kubernetes在解决网络分区之前不要在区域C中为此服务重新创建Pod。据我所知,这将涉及:
1)告诉kubernetes不要在C区中重新创建Pod 2)告诉kubernetes允许在网络分区结束的C区中创建Pod。
我认为可以通过相应地创建和删除节点污点来实现。
对于1),理想情况下,我希望能够通过退出代码发出信号,尽管我认为这不可用。我可以通过程序从C区中的应用程序节点调用kubernetes API来编程设置一个节点污点,然后再将其关闭,尽管如果可以在部署中声明此行为可能会很好。
对于2)我不太确定如何进行。 Kubernetes可能认为C区中的主节点和工作节点在A区和B区中是不健康的,但我不知道是否有任何特定事件表明它们再次健康,并且可以利用该事件来取消污染区域中的节点在这种情况下为C。我认为没有办法在kubernetes中做到这一点,所以我认为我必须在应用程序层上设置此逻辑并侦听(?)与节点运行状况有关的事件,然后调用kubernetes API消除污染节点。
因此,我的问题是:
1)是否可以查询一个API端点来获取与节点运行状况相关的事件,这些事件将是哪种类型?
2)更一般地说,kubernetes调度程序是否有任何设计注意事项/功能计划,以解决网络分区/故障的问题?对于HA管理员,我在documentation或design document上没有找到太多有关此方面的信息。如我所见,需要在kubernetes上部署的支持群集的应用程序与kubernetes本身之间进行协调。
答案 0 :(得分:1)
假设我们正在谈论的应用程序是某种外部公开的服务,我建议不要在检测到拆分时退出应用程序,而应该开始为准备就绪探针返回错误代码。这样一来,您就不会关闭广告连播-不会造成娱乐活动,但请标记为在分割发生时尚未准备好为生产流量服务。