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