Crear un deployment en kubernetes


Aprende a crear un Deployment en Kubernetes, despegarlo desde un archivo yaml y a realizar el RollingUpdate y Rollback

oscar Escrito por oscar 04 August 2025 65 0

Aprende a crear un Deployment en Kubernetes, despegarlo desde un archivo yaml y a realizar el RollingUpdate y Rollback 

✅ Requisitos previos

Configurar entorno de trabajo

1️⃣ Iniciamos Minikube con:

minikube start

Verificamos que este ejecutándose correctamente:

kubectl cluster-info

Respuesta:

Kubernetes control plane is running at https://127.0.0.1:64210

CoreDNS is running at https://127.0.0.1:64210/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

2️⃣ Verificamos los clusters disponibles y selecionamos el contexto correcto.

kubectl config get-contexts

Respuesta:

CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         minikube   minikube   minikube   default

Y nos conectamos a un cluster, en este caso el de minikube

kubectl config use-context minikube

Respuesta: Switched to context "minikube".

Crear un Deployment

Vamos a hacer un ejemplo completo de Deployment en Kubernetes usando un archivo YAML, con:

  • ✅ Despliegue inicial (imagen nginx:1.21)
  • 🔄 Estrategia RollingUpdate personalizada
  • 🔁 Actualización a nueva versión (nginx:1.25)
  • 🔙 Rollback a la versión anterior
  • 📜 Verificación de estado y cambios

0️⃣ Creamos directorio del proyecto

Creamos el directorio de proyecto para colocar los archivos

  • Windows: c:/code/deployment
  • Linux /home/user/code/deployment

Puede practicar creando un repositorio git sobre este directorio.

1️⃣ Crea un archivo llamado nginx-deployment.yaml con el siguiente contenido:

📄 Archivo: nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.21
          ports:
            - containerPort: 80

2️⃣ Aplica el Deployment y verifica:

kubectl apply -f nginx-deployment.yaml

Respuesta: deployment.apps/nginx-deployment created

3️⃣ Comandos Administrar pods

🔹 Validamos el Deployment con:

kubectl get deployments

Respuesta:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/5     5            2           14s

🔹 Ver detalles:

kubectl describe deployment nginx

🔹 Vemos los pods

kubectl get pods

Respuesta; 

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-8bdf8f46b-7ks8p   1/1     Running   0          72s
nginx-deployment-8bdf8f46b-khswz   1/1     Running   0          72s
nginx-deployment-8bdf8f46b-t4jbx   1/1     Running   0          72s
nginx-deployment-8bdf8f46b-tbmxx   1/1     Running   0          72s
nginx-deployment-8bdf8f46b-w9lq4   1/1     Running   0          72s

🔹 Ver mas informacion de los pods

kubectl get pods -o wide

Respuesta:

NAME                               READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
nginx-deployment-8bdf8f46b-26vs2   1/1     Running   0          5m28s   10.244.0.83   minikube   <none>           <none>
nginx-deployment-8bdf8f46b-hcpd2   1/1     Running   0          5m28s   10.244.0.85   minikube   <none>           <none>
nginx-deployment-8bdf8f46b-hpk2d   1/1     Running   0          5m28s   10.244.0.82   minikube   <none>           <none>
nginx-deployment-8bdf8f46b-nxv9p   1/1     Running   0          5m28s   10.244.0.81   minikube   <none>           <none>
nginx-deployment-8bdf8f46b-vr496   1/1     Running   0          5m28s   10.244.0.84   minikube   <none>           <none>

🔹 Ver la versión desplegada de un Deploy

kubectl get deploy -o wide

Respuesta: 

NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
nginx-deployment   5/5     5            5           7m37s   nginx        nginx:1.27.0   app=nginx

🔹 Reiniciar un pod

Se puede hacer simplemente eliminado el pod, lo que realizara el ReplicaSet es volver a recrear la cantidad de pods descritos en el archivo yaml del despliegue.

kubectl delete pod nginx-deployment-8bdf8f46b-vr496

pod "nginx-deployment-8bdf8f46b-vr496" deleted

🔹 Ver los logs de un pod

kubectl logs -f nginx-deployment-8bdf8f46b-nxv9p

Mostrara en pantalla los logs del pod en especifico.

4️⃣ Actualizar a NGINX 1.25

Procedemos a realizar la actualizacion del Deployment, en este caso subiremos de versión la imagen del nginx, para ello tenemos dos opciones, recomiendo la opcion 1 que es la mas recomendada para trabajar con el tema de DevOps.

Opción 1: Editar el YAML y aplicar de nuevo (Recomendado)

image: nginx:1.25

Aplicamos de nuevo el archivo

kubectl apply -f nginx-deployment.yaml

Opción 2: Usar kubectl set image con registro de cambio

kubectl set image deployment/nginx-demo nginx=nginx:1.25 --record

deployment.apps/nginx image updated

5️⃣ Ver estado del RollingUpdate

Este comando te dirá si la actualización se completó correctamente.

kubectl rollout status deployment nginx

Respuesta: deployment "nginx" successfully rolled out

6️⃣ Ver historial de revisiones

kubectl rollout history deployment nginx

Respuesta

deployment.apps/nginx
REVISION  CHANGE-CAUSE
1         <create>
2         kubectl set image deployment/nginx nginx=nginx:1.25 --record

7️⃣ Hacer rollback a versión anterior (nginx:1.21)

kubectl rollout undo deployment nginx

deployment.apps/nginx rolled back

Esto revierte automáticamente a la revisión anterior.

Para ver que se actualizó de nuevo:

kubectl get pods
kubectl describe deployment nginx

8️⃣ Ver estado actual y confirmar

Estado de los Pods:

kubectl get pods -o wide

Detalles del Deployment:

kubectl describe deployment nginx

Estado del rollout:

kubectl rollout status deployment nginx

✅ Resumen de comandos usados

Acción Comando
Crear Deployment kubectl apply -f nginx-deployment.yaml
Ver Deployment y Pods kubectl get deployments / kubectl get pods
Actualizar imagen kubectl set image deployment/nginx-demo nginx=nginx:1.25 --record
Ver estado del rollout kubectl rollout status deployment nginx-demo
Ver historial kubectl rollout history deployment nginx-demo
Hacer rollback kubectl rollout undo deployment nginx-demo
Exponer como servicio kubectl expose deployment nginx-demo --type=NodePort --port=80
Ver servicio en navegador minikube service nginx-demo

(Opcional) Escalamos el Deployment

kubectl scale deploy/nginx-deployment --replicas 2

Volvemos a consular los pods con kubectl get pods

NAME                               READY   STATUS      RESTARTS   AGE
nginx-deployment-8bdf8f46b-7ks8p   0/1     Completed   0          2m59s
nginx-deployment-8bdf8f46b-khswz   1/1     Running     0          2m59s
nginx-deployment-8bdf8f46b-t4jbx   1/1     Running     0          2m59s
nginx-deployment-8bdf8f46b-tbmxx   0/1     Completed   0          2m59s
nginx-deployment-8bdf8f46b-w9lq4   0/1     Completed   0          2m59s

Describimos los pods kubectl describe deployment nginx y vemos lo siguiente

Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m19s  deployment-controller  Scaled up replica set nginx-deployment-8bdf8f46b from 0 to 5
  Normal  ScalingReplicaSet  2m22s  deployment-controller  Scaled down replica set nginx-deployment-8bdf8f46b from 5 to 2

❌ Eliminar el deployment

kubectl delete deployment nginx

Respuesta: deployment.apps "nginx" deleted


Comentario

Debe aceptar antes de enviar