我有一个 Kubernetes 集群,其部署类似于下一个:
这里的目标是在多个通过名为 my-app
的 ClusterIP 服务公开的 Pod 中部署应用程序。 .在多个命名空间(A、B 和 C)中进行相同的部署,稍微改变了应用程序的配置。然后,在某些节点中,我有一个使用 hostNetwork 绑定(bind)到节点端口的 HAProxy。这些 HAProxy 通过指向它们的 DNS (my_app.com) 向我的客户端公开。
当客户端连接到我的应用程序时,它们会发送一个 header ,指定应将请求重定向到的命名空间(A、B 或 C),并且 HAProxy 使用 do-resolve
解析服务的 IP针对像 my_app.A.svc.cluster.local
这样的 dns 条目,返回服务的 IP my_app
在命名空间 A
.这样,我的集群就可以有一个入口点(单个 DNS 记录)和一个端口(80),这是我的要求之一。我还能够创建新的命名空间并部署我的应用程序的其他配置,而无需修改 HAProxies,这是第二个要求。
现在,我收到的请求是短请求和长请求的混合,所以我需要在这里使用最少的连接。这在 HAProxies 中是不可能的,因为我没有后端列表(重定向是动态的,如您在下面的代码中所见)。我正在尝试将 kube-proxy 与 IPVS 和最少连接模式一起使用。我注意到的是,到不同 pod 的连接跟踪是按节点进行的,并且这些信息不会在不同节点之间共享。这样,如果两个请求到 my_app.com Namespace: A
由两个不同的节点处理,两者都可以像每个节点一样转到同一个 pod(例如 pod_1),到该 pod 的事件连接数为 0。随着我增加 DNS 后面的 HAProxies 的数量,问题变得更糟。
在没有单个集群入口点(在 DNS 后面有一个 HAProxy)的情况下,如何解决这个问题并获得更好的平衡?
我在这里添加了 HAProxy 中使用的代码,以根据 header 进行路由:
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
最佳答案
我会使用 HAProxy 的 peers 功能来保存跨节点边界的命名空间 session 。
https://www.haproxy.com/blog/introduction-to-haproxy-stick-tables/
简而言之,未经测试
peers mypeers
peer node1 192.168.122.64:10000
peer node2 192.168.122.1:10000
backend my_app_backend
stick-table type string len 32 size 100k expire 30m peers mypeers
stick on hdr(X-Namespace)
http-request set-dst var(txn.service)
http-request set-dst-port int(80)
server service 0.0.0.0:0
关于kubernetes - 在 Kubernetes 中使用最少连接来平衡流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58674623/