Saltar al contenido principal

deployments

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.

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

Además, kubernetes gestiona las actualizaciones de los deployment para que sean progresivo entre un cambio de versión y el servicio de que dan los pods no se interrumpa.

Se puede consultar la actualización del deployment en tiempo real con el comando:

kubectl rollout status deployment nginx-deployment

Este comando nos devolvería paso a paso la actualización del deployment:

Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out

Si el despliegue ya ha terminado no se mostrará este proceso de actualización. Aun así, podremos consultarlo en el registro de eventos usando el comando:

kubectl describe deployment nginx-deployment
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4m27s deployment-controller Scaled up replica set nginx-deployment-59c46f7dff to 3
Normal ScalingReplicaSet 4m8s deployment-controller Scaled up replica set nginx-deployment-5c4d5dcbf5 to 1
Normal ScalingReplicaSet 4m4s deployment-controller Scaled down replica set nginx-deployment-59c46f7dff to 2
Normal ScalingReplicaSet 4m4s deployment-controller Scaled up replica set nginx-deployment-5c4d5dcbf5 to 2
Normal ScalingReplicaSet 4m2s deployment-controller Scaled down replica set nginx-deployment-59c46f7dff to 1
Normal ScalingReplicaSet 4m2s deployment-controller Scaled up replica set nginx-deployment-5c4d5dcbf5 to 3
Normal ScalingReplicaSet 4m deployment-controller Scaled down replica set nginx-deployment-59c46f7dff to 0

Escalar un deployment

Podemos escalar el deployment con el comando:

kubectl scale deployment nginx-deployment --replicas=5

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

Pausar y reanudar un deployment

Podemos pausar un deployment con el comando:

kubectl rollout pause deployment nginx-deployment

Para reanudar un deployment usaremos el comando:

kubectl rollout resume deployment nginx-deployment