14: Service ClusterIP
Service ClusterIP w Kubernetes: podstawy komunikacji wewnętrznej
Cel zadania
Celem zadania jest zrozumienie jak działa Service typu ClusterIP w Kubernetes poprzez praktyczne utworzenie i przetestowanie komunikacji między komponentami w klastrze.
Teoria
Dlaczego Service?
- Pody są ulotne — mogą umrzeć i zostać odtworzone z nowym IP
- Nie hardcoduj IP Podów — bo po restarcie będą inne
- Service daje stały adres (ClusterIP) i stałą nazwę DNS niezależnie od tego, ile Podów żyje i jakie mają IP
- Selector to “klej” — Service znajduje Pody na podstawie etykiet (labels)
Jak działa Service ClusterIP
graph LR
CLIENT["Pod klienta<br/>(test-pod)"]
SVC["Service: nginx-service<br/>ClusterIP: 10.96.x.x<br/>Port: 80"]
subgraph EP["Endpoints (automatyczne)"]
P1["Pod 1<br/>IP: 10.244.0.5"]
P2["Pod 2<br/>IP: 10.244.0.6"]
P3["Pod 3<br/>IP: 10.244.0.7"]
end
CLIENT -->|"nginx-service:80"| SVC
SVC -->|"load balancing"| P1
SVC -->|"load balancing"| P2
SVC -->|"load balancing"| P3
style SVC fill:#e3f2fd,stroke:#1976d2
style EP fill:#f0f4ff
Endpoints to lista adresów IP Podów pasujących do selectora Service. Kubernetes aktualizuje ją automatycznie — dodaje nowe Pody, usuwa martwe.
Kluczowe elementy
- ClusterIP: Domyślny typ Service — dostępny tylko wewnątrz klastra
- Load Balancing: Automatyczne rozdzielanie ruchu między Podami
- DNS: Dostęp po nazwie serwisu (np.
nginx-servicelub pełny FQDN) - Selector: Łączy Service z Podami o pasujących etykietach (labels)
Środowisko
Przed rozpoczęciem upewnij się, że:
- Masz działający klaster Kubernetes
- Masz zainstalowane narzędzie
kubectl- Masz dostęp do internetu (do pobrania obrazów)
Zadanie 1: Tworzenie Deploymentu i Service
1.1. Utwórz plik nginx-deployment-XX.yaml:
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
1.2. Utwórz plik nginx-service-XX.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-XX
spec:
type: ClusterIP
selector:
app: nginx-XX
ports:
- protocol: TCP
port: 80
targetPort: 80
1.3. Wdróż Deployment:
kubectl apply -f nginx-deployment-XX.yaml
Sprawdź czy pody zostały utworzone i są w stanie Running
1.4. Sprawdź status podów:
kubectl get pods -l app=nginx-XX
1.5. Utwórz Service:
kubectl apply -f nginx-service-XX.yaml
1.6. Sprawdź utworzony Service:
kubectl get svc nginx-service-XX
Zadanie 2: Testowanie połączenia
2.1. Utwórz pod testowy:
kubectl run test-pod-XX --rm -it --image=busybox -- sh
Pod zostanie automatycznie usunięty po wyjściu z powłoki
2.2. Przetestuj połączenie po nazwie:
# W podzie testowym:
wget -qO- nginx-service-XX
2.3. Przetestuj połączenie po IP:
# Najpierw sprawdź IP serwisu (w innym terminalu):
kubectl get svc nginx-service-XX
# W podzie testowym użyj otrzymanego IP:
wget -qO- <IP-SERWISU>
Zadanie 3: Skalowanie i weryfikacja load balancingu
3.1. Zmodyfikuj plik nginx-deployment-XX.yaml:
spec:
replicas: 5 # Zwiększ liczbę replik
3.2. Zastosuj zmiany:
kubectl apply -f nginx-deployment-XX.yaml
3.3. Sprawdź endpointy:
kubectl get endpoints nginx-service-XX
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| Service nie znajduje podów | Sprawdź zgodność selector i labels |
| Brak dostępu do Service | Zweryfikuj nazwę i namespace |
| Pod testowy nie może się połączyć | Sprawdź polityki sieciowe |
Dobre praktyki
- Nazewnictwo
- Używaj spójnych nazw z suffixem -XX
- Stosuj opisowe nazwy dla serwisów
- Konfiguracja
- Zawsze definiuj selector
- Dokumentuj porty i protokoły
- Używaj odpowiednich labels
- Diagnostyka
- Regularnie sprawdzaj endpointy
- Monitoruj stan podów
- Weryfikuj logi
Podsumowanie
- Service ClusterIP zapewnia stały punkt dostępowy w klastrze
- Selector łączy Service z podami
- Load balancing działa automatycznie
- DNS pozwala na dostęp po nazwie serwisu
Przydatne komendy
# Sprawdź szczegóły Service
kubectl describe svc nginx-service-XX
# Sprawdź endpointy
kubectl get endpoints nginx-service-XX
# Pokaż logi podów
kubectl logs -l app=nginx-XX