Saltar al contenido principal

Deployments en Kubernetes

Los deployments son elementos de configuración que permiten la creación de una aplicación de una sola instancia.

El deployment gestiona uno o varios objetos replicaset y estos a su vez gestionan uno o más pods.

Deployments en kubernetes

Dentro vídeo: https://youtu.be/JDVnWohX530 Deployments

¿Qué es un ReplicaSet?

Un ReplicaSet es un objeto de Kubernetes que asegura que un número específico de réplicas de un pod estén ejecutándose en todo momento. Los deployments utilizan ReplicaSets para gestionar la creación, actualización y eliminación de pods, asegurando alta disponibilidad y escalabilidad.

Definición de un deployment

Este es un ejemplo de su estructura básica:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

Aplicaría la configuración anterior con el comando:

kubectl apply -f deployment.yaml

Este deployment gestionaría los servicios de replicaset y los contenedores de nginx definidos.

Podríamos consultar el estado del deployment con el comando:

kubectl get deployment nginx-deployment

El cual nos devolvería una salida similar a la siguiente:

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment 3 3 3 2m

Crear un deployment con comandos

También podemos crear un deployment con una sola instancia con el comando:

kubectl create deployment nginx --image=nginx

Actualizar un deployment

Supongamos que queremos actualizar el deployment para que gestione una nueva imagen, concretamente, las de nginx basadas en alpine. El yaml de configuración quedaría así:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80

Aplicamos los cambios de nuevo con el comando 'kubectl apply -f deployment.yaml' y esta vez nos devuelve que se ha configurado, en vez de crearse:

kubectl apply -f deployment.yaml
deployment.apps/deployment-test configured #Salida del comando

También podríamos actualizar el deployment con el comando:

kubectl edit deployment nginx-deployment

Escalar un deployment

Podemos escalar el deployment con el comando:

kubectl scale deployment nginx-deployment --replicas=5

Historial y rollout de un deployment

Kubernetes mantiene un historial de los cambios realizados en los deployments, lo que permite hacer un seguimiento de las versiones y realizar rollbacks si es necesario. Esto es especialmente útil para revertir cambios no deseados o fallidos, así como para auditar el historial de cambios en la configuración de la aplicación si fuera necesario.

Historial de un deployment

Podemos consultar el historial de un deployment con el comando:

kubectl rollout history deployment nginx-deployment

Modificar el límite del historial de un deployment

Por defecto, el historial de un deployment muestra las últimas 10 actualizaciones a menos que modifiquemos el valor 'revisionHistoryLimit' en los spec del deployment. Por ejemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
revisionHistoryLimit: 3
replicas: 3
selector:
matchLabels:
app: nginx
...

Hacer un rollback a una versión anterior

Es posible hacer un rollback a una versión anterior de un deployment, ya sea porque el último despliegue no funcione o la aplicación tenga errores inesperados. Se podría hacer con el comando:

kubectl rollout undo deployment nginx-deployment

Este comando hace un rollback a la versión anterior del deployment. También podríamos especificarle una versión específica:

kubectl rollout undo deployment nginx-deployment --to-revision=1

Buenas prácticas para trabajar con Deployments

  • Usa etiquetas claras y consistentes para identificar tus recursos.
  • Configura revisionHistoryLimit para evitar almacenar demasiadas revisiones.
  • Realiza actualizaciones progresivas para minimizar interrupciones.
  • Monitorea el estado de los deployments con kubectl rollout status.
  • Usa archivos YAML para mantener la configuración como código.

Errores comunes y soluciones

Error: "ImagePullBackOff"

Esto ocurre cuando Kubernetes no puede descargar la imagen del contenedor. Verifica:

  • Que el nombre de la imagen sea correcto.
  • Que tengas acceso al registro de contenedores.
  • Usa el comando kubectl describe pod <nombre-pod> para más detalles.

Error: "CrashLoopBackOff"

Esto indica que el contenedor se está reiniciando continuamente. Verifica:

  • Los logs del pod con kubectl logs <nombre-pod>.
  • Que la configuración del contenedor (puertos, variables de entorno, etc.) sea correcta.

Volver al índice