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-service lub 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

  1. Nazewnictwo
    • Używaj spójnych nazw z suffixem -XX
    • Stosuj opisowe nazwy dla serwisów
  2. Konfiguracja
    • Zawsze definiuj selector
    • Dokumentuj porty i protokoły
    • Używaj odpowiednich labels
  3. 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

results matching ""

    No results matching ""