Migra cargas de trabajo a diferentes tipos de máquina

En este instructivo, se muestra cómo migrar las cargas de trabajo que se ejecutan en un clúster de GKE a un nuevo conjunto de nodos dentro del mismo clúster sin incurrir en tiempo de inactividad para tu aplicación. Esta migración puede ser útil si deseas migrar tus cargas de trabajo a nodos con un tipo de máquina diferente.

Contexto

Un grupo de nodos es un subconjunto de máquinas que tiene la misma configuración, incluidos los alcances de autorización del tipo de máquina (CPU y memoria). Los grupos de nodos representan un subconjunto de nodos dentro de un clúster; un clúster del contenedor puede contener uno o más grupos de nodos.

Cuando necesites cambiar el perfil de máquina de tu clúster de Compute Engine, puedes crear un grupo de nodos y luego migrar tus cargas de trabajo al nuevo grupo de nodos.

Para migrar tus cargas de trabajo sin incurrir en tiempo de inactividad, debes hacer lo siguiente:

  • Marca el grupo de nodos existente como no programable.
  • Desvía las cargas de trabajo que se ejecutan en el grupo de nodos existente.
  • Borra el grupo de nodos existente.

Kubernetes, que es el sistema de organización de clústeres de GKE, reprograma automáticamente los pods desalojados al nuevo grupo de nodos a medida que desvía el grupo de nodos existente.

Antes de comenzar

Sigue estos pasos para habilitar la API de Kubernetes Engine:
  1. Visita la página de Kubernetes Engine en Google Cloud Platform Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Instala las siguientes herramientas de línea de comandos que se usan en este instructivo:

  • gcloud se usa para crear y borrar clústeres de Kubernetes Engine. gcloud está incluida en el SDK de Google Cloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres que usa Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Establece valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo cuando escribas las opciones de tu ID del proyecto y zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados de la siguiente manera:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Paso 1: crea un clúster de GKE

El primer paso es crear un clúster del contenedor para ejecutar las cargas de trabajo de la aplicación. El siguiente comando crea un clúster nuevo con cinco nodos con el tipo de máquina predeterminado (n1-standard-1):

gcloud container clusters create migration-tutorial --num-nodes=5

Paso 2: ejecuta una implementación de aplicación repetida

El siguiente comando creará una implementación de seis réplicas de la imagen del contenedor de la aplicación web de muestra:

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 \
  --replicas=6 --limits='cpu=100m,memory=80Mi'

Puedes recuperar la lista de los pods iniciados si ejecutas lo siguiente:

kubectl get pods
Resultado:
NAME                   READY     STATUS    RESTARTS   AGE
web-2212180648-80q72   1/1       Running   0          10m
web-2212180648-jwj0j   1/1       Running   0          10m
web-2212180648-pf67q   1/1       Running   0          10m
web-2212180648-pqz73   1/1       Running   0          10m
web-2212180648-rrd3b   1/1       Running   0          10m
web-2212180648-v3b18   1/1       Running   0          10m

Paso 3: crea un grupo de nodos con un tipo de máquina grande

De forma predeterminada, GKE crea un grupo de nodos denominado default-pool para cada nuevo clúster:

gcloud container node-pools list --cluster migration-tutorial
Resultado:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7

Para ingresar instancias con una configuración diferente, como un tipo de máquina diferente o alcances de autenticación diferentes, necesitas crear un grupo de nodos nuevo.

El siguiente comando crea un nuevo grupo de nodos con nombre larger-pool con cinco instancias con alta capacidad de memoria con tipo de máquina n1-highmem-2:

gcloud container node-pools create larger-pool --cluster=migration-tutorial \
  --machine-type=n1-highmem-2 --num-nodes=5

Tu clúster del contenedor ahora debería tener dos grupos de nodos:

gcloud container node-pools list --cluster migration-tutorial
Resultado:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7
larger-pool   n1-highmem-2   100           1.5.7

Puedes ver las instancias del nuevo grupo de nodos agregado a tu clúster de GKE:

kubectl get nodes
Resultado:
NAME                                                STATUS    AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready     40m       v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready     4m        v1.5.7

Paso 4: migra las cargas de trabajo

Después de crear un nuevo grupo de nodos, tus cargas de trabajo aún se están ejecutando en el default-pool. Kubernetes no reprograma los pods mientras estén activos y disponibles.

Ejecuta el siguiente comando para ver en qué nodo se están ejecutando los pods (consulta la columna NODE):

kubectl get pods -o=wide
Resultado:
NAME                          READY     STATUS    IP         NODE
web-2212180648-80q72          1/1       Running   10.8.3.4   gke-migration-tutorial-default-pool-56e3af9a-k6jm
web-2212180648-jwj0j          1/1       Running   10.8.2.5   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-pf67q          1/1       Running   10.8.4.4   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-pqz73          1/1       Running   10.8.2.6   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-rrd3b          1/1       Running   10.8.4.3   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-v3b18          1/1       Running   10.8.1.4   gke-migration-tutorial-default-pool-56e3af9a-p9j4

Para migrar estos pods al nuevo grupo de nodos, debes realizar los siguientes pasos:

  1. Acordonar el grupo de nodos existente: esta operación marca los nodos en el grupo de nodos existente (default-pool) como no programable. Kubernetes deja de programar los pods nuevos en estos nodos una vez que los marcas como no programables.

  2. Desviar el grupo de nodos existente: esta operación desvía las cargas de trabajo que se ejecutan en los nodos del grupo de nodos existente (default-pool) con facilidad.

Los pasos anteriores hacen que los pods que se ejecutan en tu grupo de nodos existentes finalicen correctamente y Kubernetes los reprograma en otros nodos disponibles. En este caso, los únicos nodos disponibles son los de larger-pool creados en el Paso 3.

A fin de asegurarte de que Kubernetes resuelva tus aplicaciones con éxito, tus contenedores deben manipular la señal SIGTERM. Esto se puede usar para cerrar conexiones activas con los clientes y confirmar o anular las transacciones de la base de datos de una manera limpia. En tu manifiesto de pods, puedes usar el campo spec.terminationGracePeriodSeconds para especificar cuánto tiempo debe esperar Kubernetes antes de destruir los contenedores en el Pod. Esto se encuentra predeterminado a 30 segundos. Puedes leer más sobre finalización de pods en la documentación de Kubernetes.

Primero, acordona los nodos en default-pool. Puedes ejecutar el siguiente comando para obtener una lista de nodos en este grupo de nodos:

kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool

Luego, acordona cada nodo mediante la ejecución de un comando kubectl cordon NODE (reemplaza NODE con los nombres del comando previo). El siguiente comando itera sobre cada nodo y los marca como no programados:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl cordon "$node";
done
Resultado:
node "gke-migration-tutorial-default-pool-56e3af9a-059q" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-0ng4" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-k6jm" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-lkrv" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-p9j4" cordoned

Ahora, deberías ver que los nodos default-pool tienen estado SchedulingDisabled en la lista de nodos:

kubectl get nodes
Resultado:
NAME                                                STATUS                     AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready                      1h        v1.5.7

A continuación, desvía los pods en cada nodo con éxito. Para realizar el desvío, usa el comando kubectl drain que desaloja Pods en cada nodo.

Puedes ejecutar kubectl drain --force NODE sustituyendo NODE con la misma lista de nombres aprobados para el comando kubectl cordon.

El siguiente comando de shell itera cada nodo en default-pool y los desvía desalojando los pods con un período de finalización con éxito asignado de 10 segundos:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl drain --force --ignore-daemonsets --delete-local-data --grace-period=10 "$node";
done

Una vez que se complete este comando, deberías ver que los pods se están ejecutando en los nodos larger-pool:

kubectl get pods -o=wide
Resultado:
NAME                   READY     STATUS    IP         NODE
web-2212180648-3n9hz   1/1       Running   10.8.9.4   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-88q1c   1/1       Running   10.8.7.4   gke-migration-tutorial-larger-pool-b8ec62a6-2rhk
web-2212180648-dlmjc   1/1       Running   10.8.9.3   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-hcv46   1/1       Running   10.8.5.4   gke-migration-tutorial-larger-pool-b8ec62a6-hs6p
web-2212180648-n0nht   1/1       Running   10.8.6.4   gke-migration-tutorial-larger-pool-b8ec62a6-7fl0
web-2212180648-s51jb   1/1       Running   10.8.8.4   gke-migration-tutorial-larger-pool-b8ec62a6-4bb2

Paso 5: borra el grupo de nodos antiguos

Una vez que Kubernetes reprograma todos los pods en la implementación web en larger-pool, es seguro borrar default-pool dado que ya no es necesario. Ejecuta el siguiente comando para borrar default-pool:

gcloud container node-pools delete default-pool --cluster migration-tutorial

Una vez que se complete esta operación, debes tener un solo grupo de nodos para tu clúster del contenedor, que es el larger-pool:

gcloud container node-pools list --cluster migration-tutorial
Resultado:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
larger-pool   n1-highmem-2   100           1.5.7

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  • Borrar el clúster del contenedor: en este paso, se borrarán los recursos que conforman el clúster del contenedor, como las instancias de procesamiento, discos y recursos de red.

    gcloud container clusters delete migration-tutorial

Pasos siguientes

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

Enviar comentarios sobre...

Instructivos de Kubernetes Engine