K8s 負載平衡

  • Ingress → 透過 Ingress Controller (NGINX / Traefik)來實作
      1. 基於主機名(Host-based)的負載平衡
        1. Ingress Controller 可以根據 HTTP 請求的主機名來將流量路由到不同的 Service。例如,您可以配置 Ingress Controller 將來自 example.com 的請求轉發到 Service A,而將來自 example.org 的請求轉發到 Service B。
      1. 基於 URL 路徑(Path-based)的負載平衡
        1. Ingress Controller 可以根據 HTTP 請求的 URL 路徑來將流量路由到不同的 Service。例如,您可以配置 Ingress Controller 將以 /api 開頭的請求轉發到 Service A,而將以 /web 開頭的請求轉發到 Service B。
      1. 基於 Cookie 的負載平衡
        1. Ingress Controller 可以根據 HTTP 請求的 Cookie 信息來將流量路由到不同的 Service。例如,您可以配置 Ingress Controller 將具有特定 Cookie 的請求轉發到 Service A,而將其他請求轉發到 Service B。
      1. 基於請求標頭(Header-based)的負載平衡
        1. Ingress Controller 可以根據 HTTP 請求的標頭信息來將流量路由到不同的 Service。例如,您可以配置 Ingress Controller 將具有特定 User-Agent 的請求轉發到 Service A,而將其他請求轉發到 Service B。
  • Service → 透過 Kube-proxy 來實作
      1. 隨機(Random):kube-proxy 可以在後端的 Pod 中隨機選擇一個,將請求轉發過去。這種方法簡單,但可能導致流量分布不均。
      1. Round-robin:kube-proxy 可以使用 round-robin 算法來選擇後端 Pod。這種方法會在每個請求到來時依次選擇下一個 Pod,從而確保流量在後端 Pod 之間均衡分配。
      1. 基於權重的負載平衡:根據實際需求,kube-proxy 也可以使用其他負載平衡算法,例如基於權重的負載平衡。在這種情況下,每個 Pod 的流量分配比例可以根據預先設定的權重來決定。
        1. 使用 Session Affinity
          1. Kubernetes Service 支持 Session Affinity,通常用於實現客戶端與特定 Pod 之間的持久連接。您可以通過設置 service.spec.sessionAffinityClientIP 來實現基於客戶端 IP 的 Session Affinity。這樣,來自同一客戶端 IP 的請求將始終被轉發到相同的 Pod。此外,您還可以通過 service.spec.sessionAffinityConfig 自定義 Session Affinity 的超時時間。
        2. 使用 ExternalTrafficPolicy
          1. 如果您使用的是 LoadBalancer 或 NodePort 類型的 Service,可以通過設置 service.spec.externalTrafficPolicy 來調整負載平衡策略。設置為 Local 時,只有運行目標 Pod 的節點會接收到該流量,這有助於減少跨節點的流量並提高性能。設置為 Cluster 時(默認值),流量將在所有節點上負載平衡,但可能會導致多餘的跨節點流量。
        3. 自定義負載平衡策略
          1. Kubernetes 本身並未提供直接設置負載平衡策略的選項,但您可以通過使用第三方 Ingress 控制器(如 NGINX、HAProxy 或 Traefik)來實現更高級的負載平衡策略。例如,基於權重的負載平衡、基於請求標頭的負載平衡等。您需要根據所選擇的 Ingress 控制器的文檔來配置相應的負載平衡策略。
        4. 使用 Service Mesh
          1. 您可以使用 Service Mesh(如 Istio、Linkerd 或 Kuma)來進一步自定義和管理負載平衡策略。Service Mesh 在應用層提供了更高級的流量管理功能,包括智能負載平衡、金絲雀部署、熔斷器等。您需要根據所選擇的 Service Mesh 的文檔來配置相應的負載平衡策略。