kubectl expose

Tworzy usługę (Service) udostępniającą zasób w sieci.

kubectl expose tworzy w Kubernetesie obiekt typu Service na podstawie istniejącego zasobu — Poda, Deploymentu, ReplicaSetu albo innego Service. Po polsku: bierze coś, co już działa w klastrze, i wystawia to pod stabilnym adresem sieciowym, żeby inne aplikacje (albo świat zewnętrzny) mogły się z tym połączyć. Bez tego Twoje Pody dostają nowe, ulotne adresy IP przy każdym restarcie i nikt ich sensownie nie znajdzie. expose to skrót, który robi za Ciebie YAML-a do Service’u, więc nie musisz go klepać ręcznie.

Składnia i najważniejsze opcje

Podstawowa forma: kubectl expose TYPE NAME --port=PORT [flagi], gdzie TYPE to np. deployment, pod czy rs.

  • --portport, na którym nasłuchuje sam Service (przez ten port łączą się klienci).
  • --target-port — port w kontenerze, do którego Service kieruje ruch. Pominięty? Przyjmuje wartość z --port.
  • --type — typ Service’u: ClusterIP (domyślny, tylko wewnątrz klastra), NodePort lub LoadBalancer.
  • --name — nazwa tworzonego Service’u (domyślnie bierze nazwę zasobu źródłowego).
  • --protocol — protokół: TCP (domyślnie), UDP albo SCTP.
  • --selector — etykiety, po których Service znajduje swoje Pody (zwykle ustawiane automatycznie).
  • --external-ip — zewnętrzne IP, na którym Service ma być dostępny.
  • -f — wskazuje plik z zasobem zamiast podawania TYPE NAME w linii poleceń.

Przykłady użycia

  • kubectl expose deployment nginx --port=80 --target-port=8000 — wystawia Deployment nginx na porcie 80, ruch leci do kontenerów na port 8000.
  • kubectl expose pod redis --port=6379 --name=redis-svc — robi Service o nazwie redis-svc dla pojedynczego Poda.
  • kubectl expose deployment web --type=NodePort --port=8080 — udostępnia aplikację na losowym porcie każdego węzła klastra.
  • kubectl expose deployment api --type=LoadBalancer --port=443 — prosi providera chmury o load balancer z publicznym IP.
  • kubectl expose deployment app --port=80 --dry-run=client -o yaml — generuje manifest YAML bez tworzenia czegokolwiek (świetne do zapisania w repo).

Częste błędy i pułapki

Najczęstsza wpadka: --port kontra --target-port. --port to port Service’u, --target-port to port kontenera — pomylisz je i ruch idzie w próżnię. Druga pułapka: expose tworzy selektor na podstawie etykiet zasobu źródłowego. Jeśli Twój Deployment nie ma sensownych etykiet, Service nie znajdzie żadnych Podów i dostaniesz pusty zbiór endpoints. Pamiętaj też, że LoadBalancer działa naprawdę tylko w chmurze (GKE, EKS, AKS) — na lokalnym minikube zostanie w stanie pending, dopóki nie odpalisz minikube tunnel. I nie mieszaj NodePort z portami spoza zakresu 30000–32767, bo Kubernetes je odrzuci.

Powiązane komendy: kubectl create service, kubectl get svc, kubectl describe service, kubectl get endpoints, kubectl port-forward.