Realizar una actualización gradual
Objetivos
- Realizar una actualización gradual (rolling update) usando kubectl.
Actualizar una aplicación
Los usuarios esperan que las aplicaciones estén disponibles todo el tiempo y se espera que los desarrolladores implementen nuevas versiones de ellas varias veces al día. En Kubernetes esto se hace con actualizaciones graduales (rolling updates). Las actualizaciones graduales permiten que la actualización de las implementaciones se realice sin tiempo de inactividad al actualizar incrementalmente las instancias de Pods con nuevas. Los nuevos Pods se programarán en nodos con recursos disponibles.
En el módulo anterior escalamos nuestra aplicación para ejecutar varias instancias. Este es un requisito para realizar actualizaciones sin afectar la disponibilidad de la aplicación. De forma predeterminada, el número máximo de Pods que pueden estar no disponibles durante la actualización y el número máximo de nuevos Pods que se pueden crear es uno. Ambas opciones se pueden configurar con números o porcentajes (de Pods). En Kubernetes, las actualizaciones están versionadas y cualquier actualización de implementación se puede revertir a una versión anterior (estable).
Rolling updates overview
De manera similar al escalado de aplicaciones, si un Deployment se expone públicamente, el Service balanceará el tráfico solo a Pods disponibles durante la actualización. Un Pod disponible es una instancia que está disponible para los usuarios de la aplicación.
Las actualizaciones graduales permiten las siguientes acciones:
- Promueve una aplicación de un entorno a otro (a través de actualizaciones de imágenes de contenedor)
- Revierte a versiones anteriores
- Integración continua (CI) y entrega continua (CD) de aplicaciones sin tiempo de inactividad
Si un Deployment se expone públicamente, el Service balanceará el tráfico solo a Pods disponibles durante la actualización.
A continuación, actualizaremos nuestra aplicación a una nueva versión y también realizaremos un rollback.
Actualizar la versión de la aplicación
Para listar los despliegues, ejecutamos el subcomando get deployments:
kubectl get deployments
Para listar los Pods en ejecución, ejecutamos el subcomando get pods:
kubectl get pods
Para ver la versión actual de la imagen de la aplicación, ejecutamos el subcomando describe pods y buscamos el campo Image:
kubectl describe pods
Para actualizar la imagen de la aplicación a la versión 2, use el subcomando set image, seguido del nombre del Deployment y la nueva versión de la imagen:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
El comando notificó al Deployment que usara una imagen diferente para su aplicación e inició una actualización gradual.
Revisemos el estado de los nuevos Pods y veamos los antiguos terminando con el subcomando get pods
:
kubectl get pods
Verificar la actualización
Primero verifiquemos que la aplicación se esté ejecutando. Para encontrar la dirección IP y el puerto expuestos, ejecutamos
el comando describe
:
kubectl describe services/kubernetes-bootcamp
Creamos una variable de entorno llamada NODE_PORT que tiene el valor del puerto asignado en el nodo:
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o jsonpath='{.spec.ports[].nodePort}')"
echo "NODE_PORT=$NODE_PORT"
export NODE_IP="$(kubectl get nodes/cluster-prueba-worker -o jsonpath='{.status.addresses[0].address}')"
echo "NODE_IP=$NODE_IP"
A continuación, hacemos un curl a la IP y el puerto expuestos:
curl "http://$NODE_IP:$NODE_PORT"
Cada vez que ejecuta el comando curl, impactará un Pod diferente. Observe que todos los Pods ahora están ejecutando la última versión (v2).
También podemos confirmar la actualización ejecutando el subcomando rollout status
:
kubectl rollout status deployments/kubernetes-bootcamp
Para ver la versión actual de la imagen de la aplicación, ejecutamos el subcomando describe pods
y buscamos el campo Image:
kubectl describe pods
En el campo Image de la salida, verifique que está ejecutando la última versión de la imagen (v2).
Revertir una actualización
Hagamos otra actualización e intentemos implementar una imagen etiquetada con v10:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
Usemos el subcomando get deployments
para ver el estado del Deployment:
kubectl get deployments
Notemos que la salida no muestra el número deseado de Pods disponibles. Ejecutemos el subcomando get pods
para listar todos los Pods:
kubectl get pods
Podemos ver que algunos de los Pods tienen un estado de ImagePullBackOff
.
Para obtener más información sobre el problema, ejecute el subcomando describe pods
:
kubectl describe pods
En la sección Events de la salida de los Pods afectados, notemos que la versión de la imagen v10 no existe en el repositorio.
Para revertir el despliegue a la última versión funcional, use el subcomando rollout undo
:
kubectl rollout undo deployments/kubernetes-bootcamp
El comando rollout undo
revierte el Deployment al estado conocido anterior (v2 de la imagen). Las actualizaciones están
versionadas y puede revertir a cualquier estado conocido anterior de un Deployment.
Usemos el subcomando get pods
para listar los Pods nuevamente:
kubectl get pods
Los Pods están en ejecución. Para verificar la imagen implementada en estos Pods, use el subcomando describe pods
:
kubectl describe pods
El Deployment está usando nuevamente una versión estable de la aplicación (v2). El rollback fue exitoso.
Para terminar el tutorial, elimine el Deployment y el Service que creó:
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp