HAProxy
4 minute read
📍 Kontekst
Celem architektury jest zapewnienie jednolitego, wysoko dostępnego punktu wejścia (VIP) dla usług publikowanych pod domeną *.rachuna-net.pl, w sposób umożliwiający:
-
redundancję warstwy LB (brak SPOF na wejściu),
-
separację i agregację backendów pochodzących z dwóch środowisk:
- LXC (Proxmox): Consul, Vault,
- Kubernetes: Traefik (Ingress), Kubernetes API (masters),
-
centralne sterowanie routowaniem oraz health-checkami.
flowchart LR
subgraph External["External"]
U["Users"]
end
subgraph LB["HA Layer"]
VIP[("VIP")]
HA1["HAProxy 1"]
HA2["HAProxy 2"]
HA3["HAProxy 3"]
end
subgraph CT["LXC"]
CONSUL["Consul"]
VAULT["Vault"]
end
subgraph K8S["Kubernetes"]
T["Traefik"]
M["K8S Masters"]
end
subgraph SERVICES["Services"]
direction TB
CT
K8S
end
U == "<span style=paddK8S-left:><span style=paddK8S-left:>*.rachuna-net.pl</span></span>" ==> VIP
VIP ==> HA1 & HA2 & HA3
HA2 === n1["Small Circle"]
HA1 === n1
HA3 === n1
n1 ==> CONSUL & VAULT & M & T
n1@{ shape: sm-circ}
style CT fill:#FFF9C4,color:#000000
style K8S fill:#C8E6C9,color:#000000
style n1 fill:#D50000,stroke:#D50000
linkStyle 0 stroke:#AA00FF,fill:none
linkStyle 1 stroke:#AA00FF,fill:none
linkStyle 2 stroke:#AA00FF,fill:none
linkStyle 3 stroke:#AA00FF,fill:none
linkStyle 4 stroke:#AA00FF,fill:none
linkStyle 5 stroke:#AA00FF,fill:none
linkStyle 6 stroke:#AA00FF,fill:none
linkStyle 7 stroke:#AA00FF,fill:none
linkStyle 8 stroke:#AA00FF,fill:none
linkStyle 9 stroke:#AA00FF,fill:none
linkStyle 10 stroke:#AA00FF,fill:none
1. Architektura logiczna
Architektura składa się z następujących warstw:
-
External – klienci (użytkownicy, aplikacje)
-
HA Layer – VIP + trzy instancje HAProxy
-
Services – docelowe backendy:
- LXC: Consul, Vault
- Kubernetes: Traefik, Masters (API)
2. Warstwa kliencka (External)
2.1. Opis
Warstwa kliencka obejmuje wszystkie podmioty inicjujące połączenia do usług domenowych.
2.2. Punkt wejścia
Użytkownicy łączą się do usług poprzez:
*.rachuna-net.pl→ VIP
W praktyce oznacza to, że niezależnie od tego, czy celem jest Vault, Consul, aplikacje w K8S czy API Kubernetes, wejście jest spójne i scentralizowane.
📍
Wyjątkiem jest:
gitlab.rachuna-net.pl,registry.rachuna-net.pl*.pages.rachuna-net.pl.
W przyszłości planowane jest przełączenie usług na HAProxy
3. Warstwa HA (VIP + HAProxy)
3.1. VIP (Virtual IP)
VIP stanowi logiczny adres wejściowy, którego zadaniem jest:
- zapewnienie stałego endpointu dla DNS (A/AAAA),
- umożliwienie failover pomiędzy instancjami HAProxy (VRRP/keepalived).
VIP nie realizuje routingu aplikacyjnego; jest jedynie mechanizmem przekierowania do aktywnej instancji warstwy LB.
3.2. HAProxy 1/2/3
Warstwa HA składa się z trzech instancji HAProxy, które zapewniają:
- terminację lub transparentne przekazanie TLS (w zależności od modelu),
- routing ruchu do odpowiednich backendów (LXC/K8S),
- health-check backendów,
- możliwość rozdzielania ruchu po portach (np. 443/8200/8501/6443) oraz po SNI/Host header.
W modelu z diagramu wszystkie instancje HAProxy są równorzędne, a warstwa HA działa jako „klaster” LB.
4. Warstwa usług (Services)
Warstwa usług jest zbiorem backendów pochodzących z dwóch niezależnych domen wykonawczych: LXC i Kubernetes.
4.1. LXC (Proxmox)
W warstwie LXC znajdują się usługi infrastrukturalne:
- Consul – system koordynacji / storage backend (w zależności od wdrożeń),
- Vault – system zarządzania sekretami i certyfikatami.
Warstwa HAProxy publikuje te usługi na zewnątrz zgodnie z polityką portów i nazw.
4.2. Kubernetes
W warstwie Kubernetes znajdują się kluczowe elementy komunikacyjne:
- Traefik – Ingress Controller dla usług aplikacyjnych (HTTP/HTTPS),
- Kubernetes Masters (API) – dostęp do
kube-apiserver(typowo port 6443) dla administracji i automatyzacji klastra.
Warstwa HAProxy może:
- kierować ruch HTTP/HTTPS (443) do Traefik,
- kierować ruch TCP (6443) do API serverów masters.
5. Model routingu (abstrakcja „Service Router”)
📍
Diagram wskazuje logiczny węzeł pośredni (oznaczony jako małe kółko), który reprezentuje koncepcję wspólnego „routera usług” w warstwie HAProxy:
-
jest to abstrakcja, nie osobna maszyna,
-
oznacza, że HAProxy posiada spójny model backendów i reguł routingu,
-
umożliwia kierowanie ruchu do:
- Consul,
- Vault,
- Traefik,
- Kubernetes Masters.
W praktyce realizowane jest to przez konfiguracje HAProxy w postaci:
- wielu frontendów po portach,
- backendów z checkami,
- ewentualnych ACL po SNI/Host.
6. Przepływy ruchu
6.1. Przepływ ogólny
-
Klient inicjuje połączenie do
*.rachuna-net.pl. -
DNS wskazuje na VIP.
-
VIP kieruje ruch do jednej z instancji HAProxy.
-
HAProxy, na podstawie portu i reguł routingu, przekazuje połączenie do właściwego backendu:
- LXC: Vault/Consul,
- K8S: Traefik lub API masters.
6.2. Przykładowe mapowania (typowe)
| Usługa | Warstwa | Port wejściowy | Backend |
|---|---|---|---|
| Vault UI/API | LXC | 8200 lub 443 | Vault |
| Consul UI/API | LXC | 8501 lub 443 | Consul |
| Aplikacje (Ingress) | K8S | 443 | Traefik |
| Kubernetes API | K8S | 6443 | Masters |
Dokładne porty i tryb TLS zależą od przyjętego standardu publikacji (L4 passthrough vs TLS termination).
7. Wysoka dostępność i odporność na awarie
7.1. Eliminacja SPOF na wejściu
- VIP zapewnia stały endpoint.
- Trzy instancje HAProxy zapewniają redundancję.
7.2. Domena awarii
- awaria pojedynczej instancji HAProxy nie powoduje niedostępności usług,
- awaria pojedynczego backendu (np. Vault node / Traefik pod / master) może być maskowana przez load-balancing i health-checki, o ile backend jest zestawem replik.