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.
--port— port, 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),NodePortlubLoadBalancer.--name— nazwa tworzonego Service’u (domyślnie bierze nazwę zasobu źródłowego).--protocol— protokół:TCP(domyślnie),UDPalboSCTP.--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 podawaniaTYPE NAMEw 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.