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.

Fondo

Un grupo de nodos es un subconjunto de máquinas que tienen 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 nuevo y, luego, migrar tus cargas de trabajo al nuevo grupo de nodos nuevo.

Para migrar tus cargas de trabajo sin incurrir en tiempo de inactividad, sigue estos pasos:

  • 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 de manera automática los pods expulsados al nuevo grupo de nodos a medida que desvía el grupo de nodos existente.

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Consulta 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 de este instructivo:

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

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

Para ahorrar tiempo cuando escribes las opciones del ID del proyecto y de la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

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. Mediante el siguiente comando, se 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 replicada

Con el siguiente comando, se 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 llamado 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 [machine type] diferente o alcances de autenticación diferentes, necesitas crear un grupo de nodos nuevo.

Mediante el siguiente comando, se crea un nuevo grupo de nodos denominado larger-pool con cinco instancias de memoria alta con tipo de máquina n1-highmem-2 (un tipo de máquina más grande que el valor predeterminado de GKE n1-standard-1):

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 todavía seguirán en ejecución en 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. Acordona 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. Desvía el grupo de nodos existente: esta operación expulsa las cargas de trabajo que se ejecutan en los nodos del grupo de nodos existente (default-pool) con facilidad.

Si sigues los pasos anteriores, harás que los pods que se ejecutan en tu grupo de nodos existentes se finalicen de forma correcta y Kubernetes los reprograme 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 finalice 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 el manifiesto del pod, puedes usar el campo spec.terminationGracePeriodSeconds para especificar cuánto debe esperar Kubernetes antes de finalizar los contenedores del pod. Esto se encuentra predeterminado a 30 segundos. Puedes leer más sobre la finalización de pods en la documentación de Kubernetes.

Primero, acordona los nodos en el 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 (sustituye NODE por los nombres del comando anterior). 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 el 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 expulsa pods en cada nodo.

Puedes ejecutar kubectl drain --force NODE si sustituyes NODE por la misma lista de nombres pasados al comando kubectl cordon.

El siguiente comando de shell itera todos los nodos en default-pool y los desvía; para eso, desaloja 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 reprogramó 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

Realiza una 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:

  • Borra 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, los discos y los 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