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