Lab 14 – Services

Lab 14 – Services

Cíl: dosáhnout na pody přes stabilní jméno, zevnitř i zvenčí. Kapitola: Services

# 1 – co budeme vystavovat
cd ~
kubectl create deploy web --image nginx:1.27 --replicas 3
kubectl get pods -l app=web -o wide      # všimněte si IP podů
# 2 – ClusterIP, výchozí typ
kubectl expose deploy web --port 80 --name web-svc
kubectl get svc web-svc
kubectl get endpointslices -l kubernetes.io/service-name=web-svc

Zajímavý objekt je EndpointSlice: drží ty tři IP podů. Service je jen stabilní průčelí; EndpointSlice je živý seznam členů, který udržuje kontroler podle toho, které pody jsou ready.

# 3 – zevnitř clusteru, podle jména
kubectl run tmp --image busybox --restart=Never -it --rm -- \
  wget -qO- --timeout=3 web-svc | head -3

# 4 – co DNS skutečně vrací
kubectl run tmp --image busybox --restart=Never -it --rm -- \
  nslookup web-svc.default.svc.cluster.local

Jméno se přeloží na ClusterIP, ne na pod. Provoz na tu virtuální IP přepíše kube-proxy na uzlu na jednu ze skutečných IP podů.

# 5 – stabilita: zničte všechny pody, adresa zůstane
kubectl get svc web-svc -o jsonpath='{.spec.clusterIP}{"\n"}'
kubectl delete pod -l app=web
kubectl get pods -l app=web -o wide      # nové IP
kubectl get svc web-svc -o jsonpath='{.spec.clusterIP}{"\n"}'   # beze změny
kubectl get endpointslices -l kubernetes.io/service-name=web-svc  # uvnitř nové IP

To je celá přidaná hodnota: pody jsou zaměnitelné, jméno Service ne.

Zvenčí clusteru

# 6 – NodePort otevře stejný port na KAŽDÉM uzlu
kubectl delete svc web-svc
kubectl expose deploy web --port 80 --type NodePort --name web-svc
PORT=$(kubectl get svc web-svc -o jsonpath='{.spec.ports[0].nodePort}')
echo $PORT
for n in control01 worker01 worker02 worker03; do
  echo -n "$n: "; curl -s --max-time 3 http://$n:$PORT | grep -o '<title>.*</title>'
done

Odpovídá každý uzel, i ten, na kterém neběží žádný z podů – kube-proxy přeposílá za celý cluster. Všimněte si, jak rychle se to stane neudržitelným u víc než dvou aplikací; to je argument pro Gateway API v dalším labu.

# 7 – port-forward, jen na ladění
kubectl port-forward svc/web-svc 8080:80 &
curl -s localhost:8080 | head -3
kill %1

port-forward běží na vaší stanici a umře s terminálem. Hodí se na šťourání se v něčem, co nemá vnější přístup; nikdy to není součást řešení.

Úklid

# 8 –
kubectl delete svc web-svc
kubectl delete deploy web