Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Kubernetes Network Policy — izolacja ruchu między podami

Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo / Kubernetes

Domyślny klaster Kubernetes to środowisko z zerową izolacją sieciową — każdy pod może połączyć się z każdym innym. Jeśli atakujący przejmie pod frontendowy, może bezpośrednio odpytywać bazę danych. Network Policy to natywny mechanizm K8s do definiowania reguł ruchu sieciowego na poziomie podów i namespace'ów. W tym artykule wdrożymy model least-privilege od podstaw: deny-all baseline, a następnie selektywne zezwalanie na konkretne połączenia.

Wymaganie: CNI plugin obsługujący Network Policy

Network Policy to tylko manifest YAML — egzekwowanie reguł leży po stronie CNI pluginu. Kubernetes nie egzekwuje ich sam. Sprawdź czy Twój klaster ma odpowiedni CNI:

CNI Plugin Network Policy L7 Policies Wydajność Instalacja
Calico Tak (iptables / eBPF) Nie (L3/L4) Dobra Łatwa
Cilium Tak (eBPF) Tak (HTTP/gRPC) Bardzo dobra Średnia
Weave Net Tak Nie Średnia Łatwa
Flannel Nie Nie Dobra Bardzo łatwa
kindnet (kind) Tak (od v1.29) Nie Dev only Automatyczna
# Instalacja Calico (dla kubeadm, bez overlay)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml

# Instalacja Cilium (przez Helm — zalecane)
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.15.0 \
  --namespace kube-system \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true

# Weryfikacja
kubectl get pods -n kube-system | grep -E 'calico|cilium'

Baseline — deny all ingress i egress

Pierwsza polityka to deny-all dla wszystkich podów w namespace. Pusta lista ingress: [] i egress: [] blokuje cały ruch. Stosuj ją do każdego namespace produkcyjnego zanim zaczniesz dodawać wyjątki:

# deny-all.yaml — blokuje caly ruch w namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}        # pusta selector = dotyczy WSZYSTKICH podow w namespace
  policyTypes:
    - Ingress
    - Egress
  ingress: []            # brak wpisow = deny all ingress
  egress: []             # brak wpisow = deny all egress

# Uwaga: po zastosowaniu tej polityki pody stracą nawet dostep do DNS!
# Dodaj egress na DNS dla kazdego namespace:
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-egress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - ports:
        - port: 53
          protocol: UDP
        - port: 53
          protocol: TCP

Reguły ingress — zezwolenie na konkretne połączenia

# Zezwol frontenowi laczyc sie z backendem
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-allow-from-frontend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend           # ta polityka dotyczy podow backend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend  # tylko pody z etykieta app=frontend
      ports:
        - protocol: TCP
          port: 8080
---
# Baza danych — tylko backend moze sie laczyc
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-allow-from-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 5432

namespaceSelector — ruch między namespace'ami

# Zezwol Ingress Controllerowi z namespace ingress-nginx dostepu do aplikacji
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-controller
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:      # filtr na namespace
            matchLabels:
              kubernetes.io/metadata.name: ingress-nginx
          podSelector:            # + filtr na poda w tym namespace
            matchLabels:
              app.kubernetes.io/name: ingress-nginx
      ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443

Uwaga na składnię AND vs OR: podSelector i namespaceSelector w jednym elemencie listy from to warunek AND (pod MUSI pasować DO OBU). Osobne elementy listy to OR (pasuje do JEDNEGO lub DRUGIEGO). To częste źródło błędów — sprawdź dokumentację K8s dla tego rozróżnienia.

Testowanie i debugowanie Network Policy

# Pod testowy z narzędziami sieciowymi
kubectl run test-pod -n production --rm -it \
  --image=nicolaka/netshoot \
  --labels="app=frontend" \
  -- bash

# W shellu poda testowego:
# Sprawdz polaczenie z backendem (powinno dzialac)
curl -v http://backend:8080/health

# Sprawdz polaczenie z baza (powinno byc zablokowane)
nc -zv postgres 5432
# (brak odpowiedzi = timeout = polityka dziala)

# Sprawdz DNS
nslookup backend.production.svc.cluster.local

# Dla Cilium - obserwuj ruch przez Hubble CLI
kubectl exec -n kube-system ds/cilium -- cilium monitor --type drop

# Sprawdz które NetworkPolicies dotycza poda
kubectl get networkpolicies -n production
kubectl describe networkpolicy backend-allow-from-frontend -n production

Najczęstsze pytania

Czy Kubernetes domyślnie izoluje ruch między podami? +
Nie. Domyślnie każdy pod może rozmawiać z każdym innym podem w klastrze, niezależnie od namespace. Brak Network Policy to "default allow all". Dopiero po stworzeniu pierwszej Network Policy dla danego poda (przez podSelector) zaczyna obowiązywać model "deny all except defined". Oznacza to, że aplikacja produkcyjna bez Network Policies ma otwartą komunikację — frontend może połączyć się z bazą produkcyjną bezpośrednio, co jest poważnym ryzykiem bezpieczeństwa.
Czym różni się Calico od Cilium jako CNI plugin? +
Calico i Cilium to dwa najpopularniejsze CNI pluginy obsługujące Network Policies. Calico używa iptables (lub eBPF w trybie native) do egzekwowania reguł — sprawdzony, stabilny, szeroko wspierany. Cilium opiera się wyłącznie na eBPF, co daje wyższą wydajność (brak iptables overhead), native L7 policies (HTTP paths, gRPC methods), distributed load balancing i zaawansowany observability przez Hubble. Cilium wymaga kernela 4.9.17+. Calico jest łatwiejszy w instalacji i debugging, Cilium ma wyższy sufit możliwości.
Jak przetestować czy Network Policy działa poprawnie? +
Najprostszy sposób to uruchomienie tymczasowego poda z narzędziami sieciowymi i próba połączenia: kubectl run test-pod --rm -it --image=nicolaka/netshoot -- bash, następnie w shellu curl http://service-name:port lub nc -zv pod-ip port. Jeśli połączenie jest zablokowane przez Network Policy, dostaniesz timeout (nie connection refused — CNI po prostu dropuje pakiet). Dla Cilium możesz użyć Hubble UI do obserwowania ruchu w czasie rzeczywistym i diagnozowania dropped packets z przyczyną.
Jak działają reguły egress w Network Policy? +
Reguły egress kontrolują ruch WYCHODZĄCY z podów wybranych przez podSelector. Jeśli definujesz egress, musisz jawnie zezwolić na wszystko czego pod potrzebuje na wyjście: dostęp do innych serwisów, do DNS (port 53 UDP/TCP na kube-dns), do zewnętrznych API przez CIDR. Typowy błąd: zapomnienie o egress na port 53 — pod nie może resolvować nazw DNS i "nie może się połączyć" mimo poprawnych IP. Zawsze dodaj egress na DNS gdy definiujesz reguły wychodzące.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.