如果 none 已启动,我如何配置 HAProxy 以使用后端中的所有服务器

How can I configure HAProxy to use all servers in a backend if none are UP

我 运行 HAProxy 作为本地 Kubernetes 集群前面的 TCP 负载均衡器。我在每个集群节点上设置了一个小应用程序,当节点被认为是健康的时候,它 return HTTP200。它执行的健康检查之一是查询 KubeAPI 并根据 K8S 本身验证状态。现在,如果由于某种原因 Kube API 宕机,所有节点将同时被视为不健康,即使 worker 上的应用程序 运行 仍然可用。

我想以这样一种方式设置 HAProxy,即根据运行状况检查,每当所有工作节点都关闭时,HAProxy 就假定它们都处于活动状态。如果确实所有节点都宕机了,流量转发与否并不重要。如果它们全部宕机的原因是某些共享组件没有响应,那么只是盲目地发送流量至少可以保持服务正常运行。

我分析了 HAProxy reference 以寻找执行此操作的选项。我似乎找不到一个。我想我应该能够通过注册每个工作节点两次来获得此功能,一次是定期注册,一次是使用指定的 backup 选项。然后将 allbackups 添加到后端将使所有工作节点都关闭时,所有工作节点都用作备份。看起来像这样:

backend workers 
  mode tcp
  option httpchk HEAD /
  option allbackups
  server worker-001-1 <address-1> check port 32000
  server worker-001-2 <address-2> check port 32000
  server worker-001-1-backup <address-1> backup
  server worker-001-2-backup <address-2> backup

虽然此解决方案似乎有效。看起来很hacky。有没有办法以更清洁的方式做到这一点。有没有我在参考中遗漏的选项?

谢谢!

有没有可能您正在尝试解决错误的问题?如果节点在 Kube API 不可用时报告不健康,那么您是否应该专注于使 Kube API 高可用?

在本文中,他们描述了一种创建高可用性控制平面的方法。 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

我在这个答案中找到了更合适的解决方案:https://serverfault.com/a/923624/255500

归结为使用后端切换规则,为每组集群创建两个后端:

frontend ingress
  bind *:80 http
  bind *:443 https
  bind *:30000-32676 nodeports
  mode tcp
  default_backend workers
  use_backend workers_backup if { nbsrv(workers) eq 0 }

backend workers 
  mode tcp
  option httpchk HEAD /
  server worker-001-1 <address-1> check port 32000
  server worker-001-2 <address-2> check port 32000

backend workers_backup
  mode tcp
  server worker-001-1 <address-1> no-check
  server worker-001-2 <address-2> no-check

一旦后端 workers 启动了零台服务器,将使用后端 workers_backup。它仍然为每个节点注册两次,但我认为这是更好的解决方案。