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.
Dentro vídeo: https://youtu.be/JDVnWohX530
¿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.
- Lista de vídeos en Youtube: Curso Kubernetes