Realiza actualizaciones progresivas

Esta página explica cómo realizar actualizaciones progresivas para aplicaciones en Google Kubernetes Engine.

Descripción general

Puedes realizar una actualización progresiva para actualizar las imágenes, la configuración, las etiquetas, las anotaciones y los límites o solicitudes de recursos de las cargas de trabajo en los clústeres. Las actualizaciones progresivas reemplazan de manera gradual los pods de tus recursos por otros nuevos, que luego se programan en nodos con recursos disponibles. Las actualizaciones progresivas están diseñadas para actualizar las cargas de trabajo sin tiempo de inactividad.

Los siguientes objetos representan las cargas de trabajo de Kubernetes. Puedes activar una actualización progresiva de estas cargas de trabajo si actualizas su plantilla de pods:

  • DaemonSets
  • Implementaciones
  • StatefulSets

Cada uno de estos objetos tiene una plantilla de pods, que el campo spec: template representa en el manifiesto. El campo de plantilla de pods contiene una especificación para que los pods que crea el controlador obtengan el estado o comportamiento deseados. Activas un lanzamiento de actualización si actualizas la spec: template del objeto.

La plantilla de pods incluye los siguientes campos:

Para obtener más información sobre la plantilla de pods, consulta la documentación de PodTemplateSpec.

Escalar un recurso o actualizar campos fuera de la plantilla de pods no activa un lanzamiento.

Antes de comenzar

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de habilitar la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de instalar el SDK de Cloud.
  • Configura el ID del proyecto predeterminado:
    gcloud config set project [PROJECT_ID]
  • Si trabajas con clústeres zonales, configura tu zona de procesamiento predeterminada:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Si trabajas con clústeres regionales, configura tu región de procesamiento predeterminada:
    gcloud config set compute/region [COMPUTE_REGION]
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Cómo actualizar una aplicación

En la siguiente sección, se explica cómo puedes actualizar una aplicación mediante Google Cloud Platform Console o kubectl.

kubectl set

Puedes usar kubectl set para realizar cambios en image, resources (recurso de procesamiento como CPU y memoria) o los campos selector de un objeto.

Por ejemplo, ejecuta el siguiente comando para actualizar una implementación de nginx con versiones de 1.7.9 a 1.9.1:

kubectl set image deployment nginx nginx=nginx:1.9.1

El comando kubectl set image actualiza la imagen nginx de los pods de la implementación de uno en uno.

Este es otro ejemplo para configurar las solicitudes y límites de recursos de la implementación:

kubectl set resources deployment nginx --limits cpu=200m,memory=512Mi --requests cpu=100m,memory=256Mi

O bien, para quitar las solicitudes de recursos de la implementación:

kubectl set resources deployment nginx --limits cpu=0,memory=0 --requests cpu=0,memory=0

kubectl apply

Puedes usar kubectl apply para actualizar un objeto si aplicas un archivo de manifiesto nuevo o actualizado.

Para aplicar un archivo de manifiesto nuevo, ejecuta el siguiente comando:

kubectl apply -f [MANIFEST]

Donde [MANIFEST] es el archivo de manifiesto actualizado.

Console

Para editar la configuración en vivo de una aplicación, sigue estos pasos:

  1. Visita el menú de cargas de trabajo de Google Kubernetes Engine en GCP Console.

    Visita el menú de cargas de trabajo.

  2. Selecciona la carga de trabajo que desees.

  3. Haz clic en Editar.

  4. Usa el editor para realizar los cambios que desees en las etiquetas del objeto o en la plantilla de pods.

  5. Haz clic en Guardar.

Cómo administrar un lanzamiento de actualizaciones

Puedes usar kubectl rollout a fin de inspeccionar un lanzamiento conforme ocurre, detenerlo y reanudarlo, revertir una actualización y ver el historial de lanzamiento de un objeto.

Cómo inspeccionar un lanzamiento con kubectl rollout status

Puedes inspeccionar el estado de un lanzamiento con el comando kubectl rollout status.

Por ejemplo, puedes inspeccionar el lanzamiento de la implementación nginx si ejecutas el siguiente comando:

kubectl rollout status deployment nginx

El resultado es similar al siguiente:

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx" successfully rolled out

Después de que el lanzamiento sea correcto, ejecuta kubectl get deployment nginx para verificar que todos los pods se ejecuten. El resultado es similar al siguiente:

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx              3         3         3            3           36s

Cómo detener y reanudar un lanzamiento

Puedes usar kubectl rollout pause para detener un lanzamiento.

Por ejemplo, ejecuta el siguiente comando para detener el lanzamiento de la implementación nginx:

kubectl rollout pause deployment nginx

Para reanudar, ejecuta el siguiente comando:

kubectl rollout resume deployment nginx

Cómo visualizar el historial de lanzamiento con kubectl rollout history

Puedes usar kubectl rollout history para ver el historial de lanzamiento de un objeto.

Por ejemplo, ejecuta el siguiente comando para ver el historial de lanzamiento de la implementación nginx:

kubectl rollout history deployment nginx

Para ver el historial de la tercera revisión, ejecuta el siguiente comando:

kubectl rollout history deployment nginx --revision 3

Cómo revertir una actualización con kubectl rollout undo

Puedes revertir el lanzamiento de un objecto con el comando kubectl rollout undo.

Por ejemplo, ejecuta el siguiente comando para revertir la implementación nginx a la versión anterior:

kubectl rollout undo deployments nginx

Como otro ejemplo, ejecuta el siguiente comando para revertir la implementación a la tercera revisión:

kubectl rollout undo deployment nginx --to-revision 3

Consideraciones para StatefulSets y DaemonSets

StatefulSets desde Kubernetes 1.7 y DaemonSets desde Kubernetes 1.6 usan una estrategia de actualización a fin de configurar además de inhabilitar actualizaciones progresivas y automatizadas de contenedores, etiquetas, solicitudes o límites de recursos y anotaciones para sus pods. La estrategia de actualización se configura con el campo updateStrategy.

El campo updateStrategy acepta OnDelete o RollingUpdate como valores.

OnDelete es el comportamiento predeterminado cuando updateStrategy no está especificado. OnDelete evita que el controlador actualice sus pods automáticamente. Debes borrar manualmente los pods para que el controlador cree pods nuevos que reflejen los cambios. OnDelete es útil si prefieres actualizar los pods de forma manual.

RollingUpdate implementa actualizaciones progresivas y automatizadas para los pods en StatefulSet. RollingUpdate hace que el controlador borre y vuelva a crear todos sus pods uno a la vez. Espera hasta que un pod actualizado esté en ejecución y listo antes de actualizar a su predecesor.

El controlador de StatefulSet actualiza todos los pods en orden inverso y respeta las garantías de StatefulSet.

Cómo usar la estrategia RollingUpdate

Puedes usar la estrategia RollingUpdate para actualizar automáticamente todos los pods en StatefulSet o DaemonSet.

Por ejemplo, ejecuta el siguiente comando a fin de parchar el StatefulSet web para aplicar la estrategia RollingUpdate:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"rollingUpdate"}}}'

Luego, realiza un cambio en la spec.template del StatefulSet. Por ejemplo, puedes usar kubectl set para cambiar la imagen de contenedor. En el siguiente ejemplo, el StatefulSet web se configura para que su contenedor nginx ejecute la imagen nginx-slim:0.7:

kubectl set image statefulset web nginx=nginx-slim:0.7

Ejecuta el siguiente comando para verificar que se actualicen los pods en el StatefulSet que ejecuta el contenedor nginx:

kubectl get pods -l app=nginx -w

El resultado es similar al siguiente:

NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          7m
web-1     1/1       Running   0          7m
web-2     1/1       Running   0          8m
web-2     1/1       Terminating   0         8m
web-2     1/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Pending   0         0s
web-2     0/1       Pending   0         0s
web-2     0/1       ContainerCreating   0         0s
web-2     1/1       Running   0         19s
web-1     1/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Pending   0         0s
web-1     0/1       Pending   0         0s
web-1     0/1       ContainerCreating   0         0s
web-1     1/1       Running   0         6s
web-0     1/1       Terminating   0         7m
web-0     1/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Pending   0         0s
web-0     0/1       Pending   0         0s
web-0     0/1       ContainerCreating   0         0s
web-0     1/1       Running   0         10s

Los pods en el StatefulSet se actualizan en orden inverso. El controlador del StatefulSet finaliza cada pod y espera a que pase a los estados "En ejecución" y "Listo" antes de actualizar el siguiente pod.

Partición de una RollingUpdate

Puedes especificar un parámetro partition en el campo RollingUpdate del StatefulSet.

Si especificas una partition, se actualizarán todos los pods con un número ordinal mayor o igual al valor partition. Todos los pods con un número ordinal menor al valor partition no se actualizarán y se volverán a crear en la versión anterior, incluso si se borran.

Si un valor partition es mayor que su número de replicas, las actualizaciones no se propagan a sus pods. La partición es útil si deseas realizar una actualización, implementar detección de fallos o realizar una implementación por fases.

Por ejemplo, ejecuta el siguiente comando para realizar una partición del StatefulSet web:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'

Esto hace que se actualicen los pods con un número ordinal mayor o igual que 3.

Parámetro maxUnavailable de DaemonSet

El parámetro opcional maxUnavailable de DaemonSet es un elemento secundario de su campo rollingUpdate.

maxUnavailable determina el número máximo de pods de DaemonSet que pueden no estar disponibles durante las actualizaciones. El valor predeterminado es 1, si se omite. El valor no puede ser 0. El valor puede ser un número absoluto o un porcentaje.

Cómo actualizar la estrategia OnDelete

Si prefieres actualizar un StatefulSet o DaemonSet de forma manual, puedes omitir el campo updateStrategy que indica al controlador que use la estrategia OnDelete.

Para actualizar un controlador que usa la estrategia OnDelete, debes borrar de forma manual sus pods después de realizar cambios en su plantilla de pods.

Por ejemplo, puedes configurar el StatefulSet web para usar la imagen nginx-slim:0.7:

kubectl set image statefulset web nginx=nginx-slim:0.7

Luego, ejecuta el siguiente comando para borrar el primer pod web:

kubectl delete pod web-0

Para mirar cómo se vuelve a crear el pod mediante el StatefulSet y las transiciones a "Ejecutar" y "Listo", ejecuta el siguiente comando:

kubectl get pod web-0 -w

El resultado de este comando es similar al siguiente:

NAME      READY     STATUS               RESTARTS   AGE
web-0     1/1       Running              0          54s
web-0     1/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Pending              0         0s
web-0     0/1       Pending              0         0s
web-0     0/1       ContainerCreating    0         0s
web-0     1/1       Running              0         3s

Cómo actualizar un trabajo

Cuando actualizas la configuración de un trabajo, el trabajo nuevo y sus pods se ejecutan con la configuración nueva. Después de actualizar un trabajo, debes borrar de forma manual el trabajo anterior y sus pods, si lo deseas.

Para borrar un trabajo y todos sus pods, ejecuta el siguiente comando:

kubectl delete job my-job

Para borrar un trabajo, pero conservar sus pods en ejecución, especifica la marca --cascade false:

kubectl delete job my-job --cascade false

También puedes ejecutar kubectl describe deployment nginx, que produce más información sobre la implementación.

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...