Gestión de Aplicaciones Deployments, ReplicaSets y DaemonSets.
Enunciado
La aplicación web frontend‑web está ganando popularidad. Necesitas desplegarla de forma robusta, asegurando que siempre haya un número mínimo de réplicas funcionando.
Asignación:
- Crea un Deployment llamado
web-deploymentusando la imagenhttpd:2.4. - El Deployment debe tener 3 réplicas.
- Expón el Deployment como un servicio de tipo
NodePortpara acceder a la web desde tu navegador. - Simula una alta carga y escala el Deployment a 5 réplicas usando
kubectl scale. - Escala el Deployment de vuelta a 2 réplicas y observa cómo el ReplicaSet gestiona la terminación de los Pods.
Herramientas
- Docker
- Kubernetes
Requisitos previos
Se utiliza Minikube para simular el cluster K8s en un servidor, en primer lugar lo iniciamos:

Pasos realizados
-
Generar el manifiesto YAML del Deployment
Con el siguiente comando creamos un archivodeployment.yamlcon la configuración deseada:kubectl create deployment web-deployment --image=httpd:2.4 --replicas=3 --dry-run=client -o yaml > deployment.yaml -
Aplicar el Deployment
kubectl apply -f deployment.yaml -
Exponer el servicio como NodePort
Para acceder desde el navegador, creamos un servicio de tipoNodePort.
(Nota: Kubernetes solo permite puertos en el rango 30000‑32767 para NodePort).kubectl expose deployment web-deployment --type=NodePort --port=80 --target-port=80 --name=web-serviceLuego podemos obtener la URL de acceso con:
minikube service web-service --url -
Escalar a 5 réplicas
kubectl scale deployment web-deployment --replicas=5 -
Escalar de vuelta a 2 réplicas
kubectl scale deployment web-deployment --replicas=2Al reducir el número de réplicas, el ReplicaSet elimina gradualmente los Pods sobrantes (normalmente los más recientes o los que están en estado
Running), manteniendo el número deseado. Puedes observar el proceso con:kubectl get pods -w
Actualización de una Aplicación usando Rolling Update
Contexto: Los desarrolladores han lanzado una nueva versión de la imagen para web-deployment: httpd:2.4.58. Debes actualizar el Deployment sin tiempo de inactividad.
Asignación:
- Actualiza la imagen del Deployment
web-deploymentdel ejercicio anterior ahttpd:2.4.58usandokubectl set image. - Observa cómo se realiza la actualización gradual (rolling update). Usa
kubectl rollout statuspara monitorear el progreso. - Simula un error en la nueva versión y realiza un rollback a la versión anterior usando
kubectl rollout undo.
Pasos realizados
-
Actualizar la imagen
kubectl set image deployment web-deployment httpd=httpd:2.4.58Nota: El nombre del contenedor es
httpd(definido en el YAML). Si el contenedor tiene otro nombre, ajústalo. -
Monitorear el progreso del rolling update
kubectl rollout status deployment web-deploymentVerás cómo Kubernetes va reemplazando los Pods antiguos por nuevos de forma gradual, garantizando que siempre haya réplicas disponibles.
-
Realizar un rollback (deshacer la actualización)
kubectl rollout undo deployment web-deploymentEste comando revierte el Deployment a la revisión anterior (en este caso, a
httpd:2.4). Puedes confirmar la reversión con:kubectl rollout status deployment web-deployment kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}' | tr ' ' '\n'
Despliegue de un Agente de Monitoreo con DaemonSet
Contexto: El equipo de operaciones quiere desplegar un agente de monitoreo llamado node‑exporter en todos los nodos del clúster para recolectar métricas del sistema.
Asignación:
- Crea un DaemonSet llamado
node-exportercon la imagenprom/node-exporter. - Asegúrate de que el DaemonSet se ejecute en todos los nodos (en Minikube solo hay un nodo).
- Verifica que el Pod se haya creado y esté corriendo.
- Investiga qué sucede si etiquetas un nodo con
disktype=ssdy modificas el DaemonSet para que solo se ejecute en nodos con esa etiqueta (usandonodeSelector). ¿Qué ocurre con el Pod existente?
Pasos realizados
-
Crear el DaemonSet
Como el comando
kubectl create daemonset --imageno funcionó en algunos entornos, se optó por un manifiesto YAML:apiVersion: apps/v1 kind: DaemonSet metadata: name: node-exporter labels: app: node-exporter spec: selector: matchLabels: app: node-exporter template: metadata: labels: app: node-exporter spec: containers: - name: node-exporter image: prom/node-exporter ports: - containerPort: 9100 name: metricsAplicar el DaemonSet:
kubectl apply -f node-exporter-daemonset.yaml -
Verificar la ejecución en todos los nodos
kubectl get daemonset node-exporter kubectl get pods -o wide | grep node-exporterEn Minikube (un solo nodo) verás un único Pod en estado
Runningsobre el nodominikube. -
Etiquetar el nodo y añadir
nodeSelector-
Etiquetar el nodo
minikubecondisktype=ssd:kubectl label nodes minikube disktype=ssd -
Modificar el DaemonSet para que solo se ejecute en nodos con esa etiqueta usando
kubectl patch:kubectl patch daemonset node-exporter -p '{"spec":{"template":{"spec":{"nodeSelector":{"disktype":"ssd"}}}}}'
-
-
Comportamiento observado
- El Pod existente fue eliminado y recreado con la nueva especificación que incluye el
nodeSelector. - Como el nodo
minikubetiene la etiquetadisktype=ssd, el nuevo Pod se programa correctamente y sigue ejecutándose. - Si no se hubiera etiquetado el nodo, el DaemonSet habría eliminado el Pod y no habría creado ninguno nuevo (desired=0), quedando el agente sin ejecutarse hasta que se añadiera la etiqueta.
- El Pod existente fue eliminado y recreado con la nueva especificación que incluye el
Actualización de Imagen con Patch
Contexto: Se descubre una vulnerabilidad crítica en la imagen nginx:1.21. El equipo de seguridad pide actualizar inmediatamente todos los Deployments que usen esa imagen a nginx:1.23.
Asignación:
- Crea un Deployment llamado
seguro-webcon 2 réplicas usando la imagennginx:1.21. - Usa el comando
kubectl patchpara actualizar la imagen del Deployment anginx:1.23sin usarset image. - Verifica que el cambio se haya aplicado correctamente y que los nuevos Pods usen la imagen actualizada.
Pasos realizados
-
Crear el Deployment
kubectl create deployment seguro-web --image=nginx:1.21 --replicas=2 -
Actualizar la imagen mediante
patchkubectl patch deployment seguro-web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.23"}]'Explicación: Este comando reemplaza directamente el valor de la imagen en la ruta especificada del Deployment. Es una forma muy directa de modificar cualquier campo del manifiesto sin necesidad de usar comandos específicos.
-
Verificar la actualización
kubectl rollout status deployment seguro-webLuego, comprobar que todos los Pods usan la nueva imagen:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'También podemos describir el Deployment:
kubectl describe deployment seguro-web | grep ImageLa salida debe mostrar
nginx:1.23para todos los Pods.