17: Service LoadBalancer
Service LoadBalancer w Kubernetes na Azure AKS
Cel zadania
Zrozumienie działania Service typu LoadBalancer w Azure AKS poprzez praktyczne ćwiczenia z wykorzystaniem publicznego i wewnętrznego Load Balancera.
Teoria
Service LoadBalancer w Azure AKS
- LoadBalancer Service: Rozszerza funkcjonalność ClusterIP i automatycznie tworzy Azure Load Balancer
- Publiczny LoadBalancer: Zapewnia zewnętrzny dostęp do aplikacji z internetu
- Internal LoadBalancer: Ogranicza dostęp do sieci VNET
- Dziedziczenie: Zachowuje wszystkie funkcje ClusterIP plus dodaje zewnętrzny dostęp
Ważne informacje
- Każdy Service typu LoadBalancer automatycznie otrzymuje ClusterIP
- W przypadku Internal LoadBalancer, dostęp jest ograniczony do sieci VNET
- Można stosować różne annotacje do konfiguracji zachowania Load Balancera
ClusterIP vs LoadBalancer
| Cecha | ClusterIP | LoadBalancer |
|---|---|---|
| Dostępność | Tylko wewnątrz klastra | Z internetu (publiczny IP) |
| Użycie | Komunikacja między serwisami | Udostępnienie aplikacji użytkownikom |
| Cena | Darmowy | Koszt chmurowego Load Balancera |
LoadBalancer to rozszerzenie ClusterIP — nie zamiennik. Każdy LoadBalancer Service automatycznie posiada ClusterIP.
Diagram: Przepływ ruchu
graph LR
INET["Internet<br/>(użytkownicy)"]
ALB["Azure Load Balancer<br/>(publiczny IP)"]
SVC["Service: LoadBalancer<br/>(ClusterIP + External IP)"]
subgraph CLUSTER["Klaster Kubernetes"]
P1["Pod 1<br/>nginx"]
P2["Pod 2<br/>nginx"]
P3["Pod 3<br/>nginx"]
end
INET -->|"HTTP request"| ALB
ALB -->|"przekazuje"| SVC
SVC -->|"load balancing"| P1
SVC -->|"load balancing"| P2
SVC -->|"load balancing"| P3
style ALB fill:#e3f2fd,stroke:#1976d2
style SVC fill:#fff3e0,stroke:#f57c00
style CLUSTER fill:#f0f4ff
Zadanie 1: Publiczny LoadBalancer
Krok 1: Deployment nginx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-XX
spec:
replicas: 3
selector:
matchLabels:
app: nginx-XX
template:
metadata:
labels:
app: nginx-XX
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
Krok 2: Public LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
name: nginx-public-lb-XX
spec:
type: LoadBalancer
selector:
app: nginx-XX
ports:
- protocol: TCP
port: 80
targetPort: 80
Wdrożenie i testowanie:
- Utwórz Deployment:
kubectl apply -f nginx-deployment-XX.yaml - Utwórz Service:
kubectl apply -f nginx-public-lb-XX.yaml - Sprawdź status Service i pobierz publiczny IP:
kubectl get svc nginx-public-lb-XX -w - Test dostępu:
- Otwórz przeglądarkę internetową
- Wpisz publiczny IP Load Balancera
- Powinieneś zobaczyć stronę powitalną nginx
Zadanie 2: Internal LoadBalancer
Internal LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
name: nginx-internal-lb-XX
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
selector:
app: nginx-XX
ports:
- protocol: TCP
port: 80
targetPort: 80
Wdrożenie i weryfikacja:
- Utwórz Internal LoadBalancer Service:
kubectl apply -f nginx-internal-lb-XX.yaml - Sprawdź status Service:
kubectl get svc nginx-internal-lb-XX - Weryfikacja w Azure Portal:
- Przejdź do portalu Azure
- Znajdź grupę zasobów MC_* związaną z klastrem AKS
- Zlokalizuj Load Balancer z typem “Internal”
- Sprawdź konfigurację Frontend IP i Backend Pools
Przydatne komendy diagnostyczne
# Sprawdź szczegóły Service
kubectl describe svc nginx-public-lb-XX
kubectl describe svc nginx-internal-lb-XX
# Sprawdź endpointy
kubectl get endpoints nginx-public-lb-XX
kubectl get endpoints nginx-internal-lb-XX
# Sprawdź wydarzenia w klastrze
kubectl get events
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| LoadBalancer w stanie pending | Sprawdź uprawnienia Service Principal/Managed Identity |
| Brak dostępu do aplikacji | Sprawdź Network Security Groups (NSG) |
| Health probe fails | Zweryfikuj konfigurację health probe w Azure Portal |
| Nieprawidłowe endpointy | Sprawdź selector w Service i labels w Pod |
Dobre praktyki
- Używaj odpowiednich annotacji
- Dostosuj timeout dla health probe
- Skonfiguruj idle timeout dla połączeń
- Ustaw odpowiednie tagi dla zasobów Azure
- Monitorowanie i diagnostyka
- Regularnie sprawdzaj status endpointów
- Monitoruj metryki Load Balancera w Azure
- Konfiguruj alerty dla problemów z health probe
- Bezpieczeństwo
- Używaj NSG do kontroli dostępu
- Rozważ użycie Internal LoadBalancer dla aplikacji wewnętrznych
- Implementuj HTTPS dla ruchu zewnętrznego
Podsumowanie
- LoadBalancer Service zapewnia zewnętrzny dostęp do aplikacji
- Może być skonfigurowany jako publiczny lub wewnętrzny
- Dziedziczy wszystkie funkcje ClusterIP
- Jest integralną częścią infrastruktury Azure
- Wymaga odpowiedniej konfiguracji uprawnień i zabezpieczeń