Exposición Interna de un Microservicio con ClusterIP
Enunciado
Se ha desplegado una base de datos MongoDB como un Deployment llamado db-mongo. Esta base de datos debe ser accesible únicamente para otros Pods dentro del clúster, sin exposición externa.
Asignación
- Crear un
Deploymentdb-mongocon la imagenmongo:4.4. - Crear un
Servicede tipo ClusterIP llamadodb-serviceque exponga el puerto27017de MongoDB. - Desplegar un Pod de prueba (por ejemplo,
busybox) y verificar la conectividad a la base de datos usando el nombre del Service (db-service) como hostname.
Herramientas
- Docker
- Kubernetes
Requisitos previos
Se utiliza Minikube para simular el cluster K8s en un servidor, en primer lugar lo iniciamos:

Procedimiento y comandos
-
Generación del Deployment
Se creó el manifiesto YAML del Deployment mediante el siguiente comando:kubectl create deployment db-mongo --image=mongo:4.4 --dry-run=client -o yaml > db-mongo-deployment.yaml
Luego se aplicó el recurso al clúster:
kubectl apply -f db-mongo-deployment.yaml

-
Creación del Service ClusterIP
Se expuso el Deployment como un Service de tipo ClusterIP, mapeando el puerto27017del contenedor al mismo puerto en el Service:kubectl expose deployment db-mongo --type=ClusterIP --port=27017 --target-port=27017 --name=db-service --dry-run=client -o yaml > db-service.yaml kubectl apply -f db-service.yaml

-
Prueba de conectividad interna
Se lanzó un Pod temporal con la imagenbusyboxpara realizar pruebas:kubectl run test-pod --image=busybox --restart=Never -- sleep 3600

Desde dentro del Pod, se comprobó el estado de MongoDB usando el nombre del Service como dirección:
kubectl exec -it test-pod -- sh
# nc -zv db-service 27017

La salida confirmó que el puerto está abierto y accesible, validando la correcta comunicación interna mediante ClusterIP.
Acceso Externo a la Aplicación con NodePort
Enunciado
Se requiere que la aplicación frontend-web (del ejercicio anterior) sea accesible desde el navegador local para realizar pruebas rápidas sin necesidad de Ingress.
Asignación
- Asegurar que el
Deploymentweb-deploymentesté en ejecución. - Crear un
Servicede tipo NodePort para este Deployment. - Identificar el puerto NodePort asignado (en el rango 30000-32767) y acceder a la aplicación desde el navegador usando la IP de Minikube y ese puerto.
Procedimiento y comandos
-
Verificación del Deployment
Se confirmó que el Deploymentweb-deployment(basado en la imagen Apache) estuviera activo:kubectl get deployment web-deployment kubectl describe deployment web-deployment
-
Exposición mediante NodePort
Se creó un Service de tipo NodePort, especificando el puerto del contenedor (en este caso, el puerto 80 de Apache):kubectl expose deployment web-deployment --type=NodePort --port=80 --target-port=80 --name=web-service --dry-run=client -o yaml > web-service.yaml kubectl apply -f web-service.yaml
-
Obtención del puerto asignado
Se listaron los Services para ver el puerto NodePort asignado automáticamente:kubectl get svc web-service
La salida mostró un puerto en el rango 30000-32767 (por ejemplo,
32123). -
Acceso desde el navegador
Se obtuvo la IP de Minikube:minikube ip

Con la IP y el puerto NodePort, se abrió el navegador en http://<ip-minikube>:<nodeport> y se comprobó que la aplicación respondía correctamente.
Enrutamiento Inteligente con Ingress
Enunciado
La empresa desea alojar múltiples aplicaciones bajo el mismo dominio: frontend-web debe ser accesible desde tudominio.com/web y una nueva API desde tudominio.com/api.
Asignación
- Habilitar el addon de Ingress en Minikube.
- Crear un segundo
Deploymentllamadoapi-deploymentcon la imagennginxque sirva un mensaje “API v1”. - Crear un Service
api-servicepara este nuevo Deployment. - Crear un recurso Ingress que enrute el tráfico de
/webalweb-servicey de/apialapi-service. - Modificar el archivo
/etc/hostspara apuntartudominio.coma la IP de Minikube y probar el enrutamiento.
Procedimiento y comandos
-
Habilitación del Ingress Controller
Se verificó si el addon de Ingress estaba activo y, en caso contrario, se habilitó:minikube addons list | grep ingress minikube addons enable ingressSe esperó a que el controlador estuviera listo:
kubectl wait --namespace=ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=120s
-
Creación del Deployment y Service para la API
Se generó el Deployment para la API, editando el YAML para incluir un comando que devuelva el mensaje “API v1”:kubectl create deployment api-deployment --image=nginx:latest --dry-run=client -o yaml > api-deployment.yaml # Se editó el archivo para agregar el comando: ["/bin/sh", "-c", "echo 'API v1' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"] kubectl apply -f api-deployment.yaml
Luego se creó el Service para la API (tipo ClusterIP, ya que solo será accedido internamente por el Ingress):
kubectl expose deployment api-deployment --name=api-service --port=80 --target-port=80 --type=ClusterIP --dry-run=client -o yaml > api-service.yaml kubectl apply -f api-service.yaml -
Definición del recurso Ingress
Se creó el archivoingress.yamlcon las reglas de enrutamiento:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: main-ingress spec: rules: - host: tudominio.com http: paths: - path: /web pathType: Prefix backend: service: name: web-service port: number: 80 - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Se aplicó el recurso:
kubectl apply -f ingress.yaml
-
Verificación del Ingress
Se comprobó que el Ingress se hubiera creado correctamente:kubectl get ingress

-
Configuración del archivo hosts
Se obtuvo la IP de Minikube y se agregó la entrada al archivo/etc/hosts(en sistemas Linux/macOS) oC:\Windows\System32\drivers\etc\hosts(en Windows):<ip-minikube> tudominio.com

-
Prueba de enrutamiento
Se realizaron peticiones concurlpara validar el enrutamiento:curl http://tudominio.com/web curl http://tudominio.com/api

Las respuestas mostraron el contenido de la aplicación web y el mensaje “API v1” respectivamente, confirmando el correcto funcionamiento del Ingress.
Ejecución de un Proceso por Lote con Jobs
Enunciado
Todos los días a las 3 AM debe ejecutarse un script que limpia la base de datos de logs antiguos. Este proceso debe ejecutarse una sola vez y finalizar correctamente.
Asignación
- Crear un Job llamado
db-cleanupque use la imagenbusyboxy ejecute el comandoecho "Limpiando logs..." && sleep 10. - Verificar que el Job cree un Pod, lo ejecute y que el Pod termine en estado
Completed. - Escalar el Job para que ejecute 5 tareas en paralelo (modificando la propiedad
parallelism).
Procedimiento y comandos
-
Creación del Job inicial
Se generó un Job con un solo Pod:kubectl create job db-cleanup --image=busybox -- echo "Limpiando logs..." && sleep 10Nota: El comando anterior debe ajustarse para que el shell interprete el
&&. Para ello, se recomienda usar un YAML o encerrar el comando entre comillas. La forma más limpia es crear un YAML manualmente, pero para simplificar se puede usar:kubectl create job db-cleanup --image=busybox -- /bin/sh -c 'echo "Limpiando logs..." && sleep 10'

-
Verificación de la ejecución
Se observó el estado del Job y del Pod:kubectl get jobs kubectl get pods

El Pod pasó a estado Completed tras finalizar el comando, y el Job mostró COMPLETIONS 1/1.
-
Escalado a 5 tareas en paralelo
Dado que un Job una vez completado no se puede modificar enparallelism, se creó un nuevo Job con la propiedadparallelism: 5desde el principio. Se preparó un manifiesto YAML como el siguiente:apiVersion: batch/v1 kind: Job metadata: name: db-cleanup-parallel spec: parallelism: 5 template: spec: containers: - name: cleaner image: busybox command: ["/bin/sh", "-c", "echo 'Limpiando logs...' && sleep 10"] restartPolicy: NeverSe aplicó el archivo:
kubectl apply -f job-parallel.yaml
Se comprobó que se lanzaron 5 Pods en paralelo, todos finalizando exitosamente:
kubectl get pods -l job-name=db-cleanup-parallel
La salida mostró 5 Pods en ejecucion y progresivamente en
Completed, demostrando la ejecución concurrente.