kubernetes - 在 Kubernetes 中使用最少连接来平衡流量

标签 kubernetes load-balancing haproxy kube-proxy ipvs

我有一个 Kubernetes 集群,其部署类似于下一个:

enter image description here

这里的目标是在多个通过名为 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/

相关文章:

kubernetes - 外部流量可以访问我在Minikube内部的部署吗?

kubernetes - k8s : Unable to read environment variable in livenessProbes exec

kubernetes - kubectl事件从何而来?我该如何导出这些?

node.js - 健康探测将实例标记为不健康,但事实并非如此

proxy - 以编程方式将节点添加到像 Haproxy 这样的负载均衡器?

kubernetes - Nginx 入口 Controller 配置 (gke)

java - 使用tomcat进行负载均衡

lua - 如何将第 3 方 lua 库(通过 luarocks 安装)加载到 haproxy

node.js - HAproxy 和 Node.js+Spdy

elasticsearch - 如何在外部使用eck公开Elasticsearch设置