Aprende a crear un Deployment en Kubernetes, despegarlo desde un archivo yaml y a realizar el RollingUpdate y Rollback
✅ Requisitos previos
- Docker Desktop instalado y corriendo correctamente.
- Minikube instalado y debe estar iniciado correctamente
- Revisa la definición de deployment en kubernetes
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