我有一个 Kubernetes 集群,其部署类似于下一个:
这里的目标是将应用程序部署在通过名为my-app
. 在多个命名空间(A、B 和 C)中进行相同的部署,稍微更改应用程序的配置。然后,在某些节点中,我有一个使用 hostNetwork 绑定到节点端口的 HAProxy。这些 HAProxy 通过指向它们的 DNS (my_app.com) 向我的客户端公开。
当客户端连接到我的应用程序时,它们会发送一个标头,指定请求应重定向到的命名空间(A、B 或 C),并且 HAProxy 使用do-resolve
类似 的 dns 条目解析服务的 IP,该条目my_app.A.svc.cluster.local
返回的 IPmy_app
命名空间中的服务A
。这样,我的集群就可以有一个入口点(单个 DNS 记录)和一个端口(80),这是我的要求之一。我还能够创建新的命名空间并部署我的应用程序的其他配置,而无需修改 HAProxies,这是第二个要求。
现在,我收到的请求是短请求和长请求的混合,所以我需要在这里使用最少的连接。这在 HAProxies 中是不可能的,因为我没有后端列表(重定向是动态的,如您在下面的代码中所见)。我正在尝试将 kube-proxy 与 IPVS 和最少连接模式一起使用。我注意到的是,到不同 pod 的连接跟踪是按节点进行的,并且这些信息不会在不同节点之间共享。这样,如果两个my_app.com Namespace: A
不同的节点处理两个请求,则两者都可以转到同一个 pod(例如 pod_1),因为在每个节点中,到该 pod 的活动连接数为 0。随着我增加问题,问题变得更糟DNS 后面的 HAProxy 数量。
如何在没有集群入口点的情况下解决这个问题并获得更好的平衡(在 DNS 后面有一个 HAProxy)?
我在这里添加了 HAProxy 中使用的代码,以根据标头进行路由:
resolvers dns
hold nx 3s
hold other 3s
parse-resolv-conf
frontend my_app_frontend
bind :80
default_backend my_app_backend
http-request set-var(sess.namespace) hdr(X-Namespace)
http-request do-resolve(txn.service,dns,ipv4) str(),concat(my_app.,sess.namespace,.svc.cluster.local)
backend my_app_backend
http-request set-dst var(txn.service)
http-request set-dst-port int(80)
server service 0.0.0.0:0