【发布时间】:2018-09-12 08:40:33
【问题描述】:
我有一个 HA kubernetes 设置,其中包含 3 个复制的主节点和一些工作节点,分为 3 个区域(这些是 AWS 可用区域,但也可以是 3 个虚拟化硬件机器或类似的)。其中一项服务(或者更确切地说,服务的 pod)正在跨区域形成一个集群,以便在一个区域出现故障时仍然可用。 pod 使用反关联性规则进行分发。我将在服务的 pod 中运行的单个应用程序称为“应用程序节点”(而不是“节点”,它只是一个 kubernetes 节点)。
集群应用程序能够检测网络分区并通过关闭少数区域中的 pod 中的应用程序来避免脑裂情况。让我们考虑以下布局:
- A 区:2 个应用程序节点
- B 区:2 个应用程序节点
- C 区:1 个应用程序节点
如果 (A, B) 和 (C) 之间出现网络分区,则在区域 C 中运行的应用程序将自行关闭。
现在的问题是,区域 C 中的 master 将为该服务重新创建 pod,从而导致形成一个全新的应用程序集群,这正是我们在这种情况下想要避免的。
我想告诉 kubernetes 在解决网络分区之前不要在区域 C 中为该服务重新创建 pod。据我所知,这将涉及:
1) 告诉 kubernetes 不要在 zone 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 本身之间需要协调。
【问题讨论】:
标签: kubernetes