簡體   English   中英

在 Kubernetes 中使用最少連接平衡流量

[英]Balancing traffic using least connection in Kubernetes

我有一個 Kubernetes 集群,其部署類似於下一個:

在此處輸入圖像描述

這里的目標是在通過名為my-app的 ClusterIP 服務公開的多個 pod 中部署應用程序。 在多個命名空間(A、B 和 C)中進行相同的部署,稍微更改應用程序的配置。 然后,在某些節點中,我有一個使用 hostNetwork 綁定到節點端口的 HAProxy。 這些 HAProxy 通過指向它們 (my_app.com) 的 DNS 向我的客戶公開。

當客戶端連接到我的應用程序時,他們會發送 header 指定請求應重定向到的命名空間(A、B 或 C),並且 HAProxy 使用do-resolve服務的my_app.A.svc.cluster.localmy_app.A.svc.cluster.local ,它返回命名空間A中服務my_app的 IP。 這樣,我的集群就可以有一個入口點(單個 DNS 記錄)和一個端口(80),這是我的要求之一。 我還能夠創建新的命名空間並部署我的應用程序的其他配置,而無需修改 HAProxies,這是第二個要求。

現在,我收到的請求是短請求和長請求的混合,所以我需要在這里使用最少的連接。 這在 HAProxies 中是不可能的,因為我沒有后端列表(重定向是動態的,如您在下面的代碼中所見)。 我正在嘗試將 kube-proxy 與 IPVS 和最少連接模式一起使用。 我注意到的是,到不同 pod 的連接跟蹤是按節點進行的,並且這些信息不會在不同節點之間共享。 這樣,如果對my_app.com Namespace: A的兩個請求由兩個不同的節點處理,則兩者都可以 go 到每個節點中相同的 pod(例如 pod_1),到該 pod 的活動連接數為 0。問題隨着我增加 DNS 后面的 HAProxies 的數量,情況變得更糟。

如何在沒有集群入口點的情況下解決這個問題並獲得更好的平衡(在 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

我會使用 HAProxy 的 peers 功能來保存跨節點邊界的命名空間會話。
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM