Realizar una actualización gradual

Objetivos

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:

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