Hoja de trucos — Comandos de Services de Kubernetes

2 min

Proyecto projet11-kubernetes-services · todos los comandos para desplegar, exponer y probar los Services.

Tabla de contenidos


1. Construir la imagen y desplegar

Desde la carpeta del proyecto (projet11-kubernetes-services):

powershell
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 Running

2. Observar los Services

powershell
kubectl get svc                              # TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S)
kubectl get svc -o wide
kubectl describe svc demo-clusterip          # detalles + Endpoints

Lectura de kubectl get svc:

ColumnaSignificado
TYPEClusterIP / NodePort / LoadBalancer
CLUSTER-IPIP interna (siempre presente)
EXTERNAL-IPIP externa (LoadBalancer) o <none>
PORT(S)port del Service (y :nodePort para NodePort)

3. ClusterIP: descubrimiento de services (DNS)

Un ClusterIP no es alcanzable desde el anfitrión: se llama desde un Pod, por su nombre.

powershell
# Pod cliente desechable (--rm: se elimina al salir)
kubectl run client --rm -it --image=curlimages/curl -- sh

Luego, en el shell del Pod:

sh
curl http://demo-clusterip           # llamada POR NOMBRE (resuelta por CoreDNS)
curl http://demo-clusterip           # vuelve a lanzar: el nombre del Pod cambia
exit

Probar la resolución DNS:

powershell
kubectl run dnstest --rm -it --image=busybox:1.36 -- sh
# en el Pod:
nslookup demo-clusterip
wget -qO- http://demo-clusterip

4. NodePort: acceso externo

powershell
kubectl get svc demo-nodeport
# Abrir en el navegador:
start http://localhost:30082
# o probar en línea de comandos:
curl http://localhost:30082

5. LoadBalancer: IP externa

powershell
kubectl get svc demo-lb                      # EXTERNAL-IP debe pasar a "localhost"
start http://localhost:8090
curl http://localhost:8090

Si EXTERNAL-IP se 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: usa kubectl port-forward (ver anexo).


6. Endpoints y selectores

powershell
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 Service

Ver el reparto (10 peticiones vía port-forward):

powershell
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 }

7. Limpieza

powershell
kubectl delete -f k8s/
# o por objeto:
kubectl delete svc demo-clusterip demo-nodeport demo-lb
kubectl delete deployment demo-back

Anexo — diagnóstico

SíntomaCausa probableSolución
curl http://demo-clusterip fallaNo es desde un Pod, o el service no existeLlamar desde un Pod; verificar kubectl get svc
Endpoints vacíosEl selector no coincide con ningún label de PodAlinear 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 inaccesibleNodePort no creado / puerto ocupadokubectl get svc demo-nodeport; cambiar nodePort
ImagePullBackOffImagen demo-k8s:1.0 ausente del clústerConstruirla; en kind: kind load docker-image demo-k8s:1.0
powershell
# Solución universal de acceso temporal a cualquier Service:
kubectl port-forward svc/demo-clusterip 8091:80   # -> http://localhost:8091

Curso creado por el Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos