Proyecto projet11-kubernetes-services · todos los comandos para desplegar, exponer y probar los Services.
Desde la carpeta del proyecto (projet11-kubernetes-services):
kubectl config use-context docker-desktop
docker build -t demo-k8s:1.0 ./app # (si no se construyó ya en el proyecto 10)
kubectl apply -f k8s/ # deployment + 3 services
kubectl get pods # 3 Pods Runningkubectl get svc # TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S)
kubectl get svc -o wide
kubectl describe svc demo-clusterip # detalles + EndpointsLectura de kubectl get svc:
| Columna | Significado |
|---|---|
TYPE | ClusterIP / NodePort / LoadBalancer |
CLUSTER-IP | IP interna (siempre presente) |
EXTERNAL-IP | IP externa (LoadBalancer) o <none> |
PORT(S) | port del Service (y :nodePort para NodePort) |
Un ClusterIP no es alcanzable desde el anfitrión: se llama desde un Pod, por su nombre.
# Pod cliente desechable (--rm: se elimina al salir)
kubectl run client --rm -it --image=curlimages/curl -- shLuego, en el shell del Pod:
curl http://demo-clusterip # llamada POR NOMBRE (resuelta por CoreDNS)
curl http://demo-clusterip # vuelve a lanzar: el nombre del Pod cambia
exitProbar la resolución DNS:
kubectl run dnstest --rm -it --image=busybox:1.36 -- sh
# en el Pod:
nslookup demo-clusterip
wget -qO- http://demo-clusteripkubectl get svc demo-nodeport
# Abrir en el navegador:
start http://localhost:30082
# o probar en línea de comandos:
curl http://localhost:30082kubectl get svc demo-lb # EXTERNAL-IP debe pasar a "localhost"
start http://localhost:8090
curl http://localhost:8090Si
EXTERNAL-IPse queda en<pending>, espera unos segundos (Docker Desktop provisiona el LB). En un clúster kind, el tipo LoadBalancer se queda en<pending>sin MetalLB: usakubectl port-forward(ver anexo).
kubectl get endpoints demo-clusterip # IP de los Pods detrás del Service
kubectl get pods -o wide --show-labels # labels de los Pods
kubectl get pods --selector app=demo-back # mismos Pods que el selector del ServiceVer el reparto (10 peticiones vía port-forward):
kubectl port-forward svc/demo-clusterip 8091:80
# en OTRO terminal:
1..10 | ForEach-Object { (Invoke-WebRequest -Headers @{Accept="application/json"} http://localhost:8091).Content }kubectl delete -f k8s/
# o por objeto:
kubectl delete svc demo-clusterip demo-nodeport demo-lb
kubectl delete deployment demo-back| Síntoma | Causa probable | Solución |
|---|---|---|
curl http://demo-clusterip falla | No es desde un Pod, o el service no existe | Llamar desde un Pod; verificar kubectl get svc |
| Endpoints vacíos | El selector no coincide con ningún label de Pod | Alinear selector (Service) y labels (Pods) |
EXTERNAL-IP en <pending> | No hay load balancer (kind, cloud no configurado) | Docker Desktop: esperar; si no, kubectl port-forward |
localhost:30082 inaccesible | NodePort no creado / puerto ocupado | kubectl get svc demo-nodeport; cambiar nodePort |
ImagePullBackOff | Imagen demo-k8s:1.0 ausente del clúster | Construirla; en kind: kind load docker-image demo-k8s:1.0 |
# Solución universal de acceso temporal a cualquier Service:
kubectl port-forward svc/demo-clusterip 8091:80 # -> http://localhost:8091Curso creado por el Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos