Migra de Compute Engine a Kubernetes Engine con Migrate for Anthos

1. Descripción general

Reescribir o rediseñar aplicaciones existentes para que funcionen en Kubernetes no siempre es posible o factible de hacer de forma manual. Migrate for Anthos puede ayudarte a modernizar tus aplicaciones existentes y ejecutarlas en Kubernetes. En este codelab, migrarás una app web existente alojada en Compute Engine a Kubernetes Engine con Migrate for Anthos.

Qué aprenderás

  • Cómo implementar Migrate for Anthos en un clúster de Kubernetes
  • Cómo crear un contenedor en un conjunto con estado a partir de una instancia existente de Compute Engine
  • Cómo implementar tu contenedor en Kubernetes y configurarlo con un balanceador de cargas

Requisitos

  • Un proyecto de Google Cloud con la facturación configurada Si no tienes una, debes crearla.

2. Cómo prepararte

Este codelab puede ejecutarse completamente en Google Cloud Platform sin ninguna instalación o configuración local.

Habilitar APIs

Antes de comenzar, asegúrate de habilitar las APIs necesarias en tu proyecto de Google Cloud:

Crea un servidor web de instancia de procesamiento

Creemos una instancia de procesamiento que usaremos para alojar nuestro servidor web nginx inicial, junto con las reglas de firewall que nos permitirán ver la página de destino predeterminada del servidor web. Existen varias formas de hacerlo, pero usaremos Cloud Shell para facilitar su uso.

Ejecute los siguientes comandos en Cloud Shell:

gcloud compute instances create webserver --zone=us-central1-a && \
gcloud compute firewall-rules create default-allow-http --allow=tcp:80 

La primera mitad de este comando creará una instancia de Google Cloud en la zona us-central1-a, mientras que la segunda mitad creará una regla de firewall llamada “default-allow-http”. que permitirá el tráfico http a nuestra red.

Cuando la instancia se haya creado correctamente, se mostrará una tabla con sus detalles. Toma nota de la IP externa, ya que la necesitaremos para verificar que el servidor web se esté ejecutando más adelante.

a08aa5bf924b107d.png

Una vez que la instancia esté en funcionamiento, podemos establecer una conexión SSH a nuestra instancia desde Cloud Shell para instalar Nginx y, luego, iniciar el servidor web:

gcloud compute ssh --zone us-central1-a webserver

Una vez que accedas a nuestra instancia de procesamiento, instala Nginx:

sudo apt install nginx

Sal de la sesión SSH con el comando logout

Comprobemos que el servidor web se esté ejecutando. Para ello, ingresa la IP externa de la instancia anterior en el navegador. Deberías ver la pantalla de bienvenida de nginx predeterminada:

8c08e3b2bd17e03.png

Este servidor web funcionará como la app web heredada que migraremos a Kubernetes con Migrate for Anthos.

3. Clúster de Kubernetes con Migrate for Anthos

A continuación, crearemos un clúster de GKE que es donde finalmente migraremos el servidor web de Compute Engine. En la consola de Cloud, ejecuta lo siguiente:

gcloud container clusters create my-gke-cluster \
  --zone us-central1-a \
  --cluster-version 1.13 \
  --machine-type n1-standard-4 \
  --image-type "UBUNTU" \
  --num-nodes 1 \
  --enable-stackdriver-kubernetes

Espera unos minutos para que se complete este comando. Una vez que se haya creado el clúster, recibirás un resultado con sus detalles:

c69778b8fb8ac72b.png

A continuación, navega a GCP Marketplace para implementar Migrate for Anthos:

45f5753cae53ccb5.png

En la página de Marketplace de Migrate for Anthos, haz clic en Configurar y, si se te solicita, selecciona tu proyecto de la lista. En la página siguiente, se presentará un formulario con algunos valores predeterminados ingresados. Asegúrate de que el clúster seleccionado sea el que acabamos de crear y haz clic en Implementar:

94dc6238b2affd16.png

Migrate for Anthos ahora debe implementarse en nuestro clúster de Kubernetes. Cuando se termine de implementar, verás el estado "OK". en la página Aplicaciones de Kubernetes Engine:

5bf601103a5335cf.png

4. De una instancia de procesamiento a un conjunto con estado

Tenemos un clúster de Kubernetes que ejecuta Migrate for Anthos, por lo que ahora podemos comenzar el proceso de migración. Para implementar nuestra instancia de procesamiento en un clúster de Kubenetes, apagaremos la instancia de Compute Engine para poder tomar instantáneas de los discos. Antes de continuar, ten en cuenta el ID de la instancia, que necesitaremos más adelante:

gcloud compute instances describe webserver --zone us-central1-a | grep ^id

Apaga nuestra instancia de procesamiento:

gcloud compute instances stop webserver --zone us-central1-a

Ahora que la instancia se detuvo, podemos tomar una instantánea de los discos de forma segura mediante la ejecución de la siguiente secuencia de comandos. Asegúrate de insertar tu ID del proyecto y tu ID de instancia:

python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \
  -p <project-id>   -i <instance-id> \
  -z us-central1-a \
  -T us-central1-a \
  -A webserver-statefulset \
  -o containerized-webserver.yaml

Con esas marcas, clone_vm_disks.py hará lo siguiente:

  • Verifica que tu instancia de GCE esté desactivada
  • Crea una instantánea a partir de cada uno de los discos de tu instancia
  • Crea un disco nuevo a partir de cada instantánea
  • Borrar las instantáneas que creó
  • Generar un archivo YAML en tu directorio de trabajo actual para implementar un conjunto con estado que alojará tu servidor web

El archivo yaml generado aprovisionará un conjunto con estado en nuestro clúster de Kubernetes, junto con las reclamaciones de volumen persistentes necesarias para activar los discos copiados en nuestro contenedor de servidor web. Podemos aplicar estos cambios con kubectl:

kubectl apply -f containerized-webserver.yaml

Verifica el estado de webserver-statefulset en la página Cargas de trabajo:

Es normal que el estado indique “Los Pods están pendientes” durante unos minutos después de ejecutar kubectl apply. Continúa cuando el estado diga "OK".

5. Exponer el clúster al balanceador de cargas

En este punto, el clúster de Kubernetes debería ejecutar el servidor web como un conjunto con estado, pero también tendremos que exponer su contenedor a un balanceador de cargas para acceder a nuestro servidor web a través de una dirección IP externa. En Cloud Shell, crea un archivo nuevo llamado loadbalancer.yaml con el siguiente contenido:

loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: webserver-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: webserver-statefulset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Ahora, aplícalo con kubectl:

kubectl apply -f loadbalancer.yaml

Podemos usar kubectl para recuperar la dirección IP externa del servicio webserver-container:

kubectl get services

Si ingresamos la dirección IP externa en nuestro navegador, deberíamos ver la misma pantalla de bienvenida de nginx predeterminada de antes:

5c08e3b2bd17e03.png

¡Ya lo logramos! Nuestro servidor web de GCE ahora está alojado en Kubernetes. ¡Genial!

6. Stackdriver Monitoring

Métricas

Como servicio administrado de Kubernetes, Kubernetes Engine está instrumentado automáticamente para el registro y la supervisión con Stackdriver. Veamos algunas de las métricas que Stackdriver captura automáticamente.

Haz clic en el vínculo de Monitoring en el menú de productos. Acceder a este sitio por primera vez desde tu proyecto puede tardar unos minutos mientras se configura tu lugar de trabajo.

Una vez cargado, coloca el cursor sobre Recursos en el panel izquierdo y selecciona "Kubernetes Engine NEW". en el menú.

4e62c8ad3f2b3fe9.png

Cada fila del panel que se presenta aquí representa un recurso de Kubernetes. Puedes cambiar entre la vista de la infraestructura, las cargas de trabajo o los servicios con los vínculos que se encuentran sobre el panel.

62066a9251d19843.png

En la vista Cargas de trabajo, expande “my-gke-cluster”. y desglosarla según la configuración predeterminada > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset. Haz clic en el contenedor de conjunto con estado de webserver. Aquí encontrarás algunas métricas listas para usar que captura Stackdriver, incluido el uso de memoria y de CPU.

d054778de301429e.png

Los gráficos que se muestran en este panel son los que podremos usar para crear un panel personalizado.

Paneles personalizados

Stackdriver nos permite crear paneles personalizados que podemos usar para organizar los gráficos de los datos de todas las métricas que tenemos disponibles. Creemos un panel personalizado para proporcionar una vista general de algunas de las métricas de nuestro servidor web.

En el panel de la izquierda, coloca el cursor sobre Paneles y, luego, haz clic en Crear panel.

56a0513efe60de3e.png

Ahora que tenemos nuestro panel vacío, podemos agregar métricas a las que queremos estar atentos. Le daremos un nombre útil a nuestro panel sin título, como “Mis contenedores de servidor web”. y haz clic en “Agregar gráfico” arriba a la derecha:

bd66ba91f3125028.png

¿Recuerdas las métricas listas para usar? Agreguemos un gráfico para el uso de CPU del contenedor. En el campo Título del gráfico, ingresa "Uso de CPU". En el cuadro de “Buscar tipo de recurso y métrica”, escribe request_utilization y selecciona Uso de solicitud de CPU en la lista filtrada. Esta selección propagará los campos Tipo de recurso y Métrica.

A continuación, deberemos filtrar por nuestro project_id (si tenemos varios proyectos) y container_name. En el cuadro Filtro, escribe project_id, selecciónalo en la lista filtrada y selecciona tu proyecto en el campo Valor. También necesitamos filtrar por container_name. En el cuadro Filtro, escribe container_name, selecciónalo en la lista filtrada y selecciona webserver-statefulset en el campo Valor. Haz clic en Guardar.

Ahora tenemos un panel con nuestro primer gráfico.

3d3d45e4357454e0.png

7. Verificación de tiempo de actividad y política de alertas

Con Stackdriver, podemos configurar alertas que nos notifiquen cuando alguna métrica alcanza los valores de umbral que especificamos. Por ejemplo, podemos hacer que Stackdriver nos envíe un correo electrónico cuando el uso de CPU del paso anterior supere un umbral determinado durante un período continuo, lo que puede indicar un problema con nuestra aplicación. Para demostrar cómo son estas alertas, configuremos una verificación de tiempo de actividad y, luego, simulemos una interrupción.

En el panel izquierdo, selecciona Verificaciones de tiempo de actividad y, luego, Descripción general de verificaciones de tiempo de actividad:

49368e5700274cf2.png

Como sugiere la página Verificaciones de tiempo de actividad, configuremos nuestra primera verificación de tiempo de actividad. Haz clic en el botón Add Uptime Check en la parte superior derecha de la página.

d884560f91011009.png

En el formulario que aparece a continuación, ingresa “Endpoint Uptime”. y la dirección IP externa del balanceador de cargas como nombre de host.

568a8f1e27ae8417.png

Haz clic en Guardar y se te pedirá que crees una Política de alertas complementaria:

f89d53a106a709f4.png

Haz clic en Crear política de alertas.

Asígnale el nombre “Política de tiempo de actividad del extremo”. En la sección Configuración, establece “La condición se activa si”. a "Cualquier serie temporal es una infracción" y haz clic en Guardar.

74609849348bd03e.png

Aún no hemos terminado. A continuación, especificaremos un canal de notificaciones para que se nos notifique cuando se incumplió nuestra política de alertas. En el menú desplegable Tipo de canal de notificaciones, selecciona Correo electrónico seguido de una dirección válida.

44c474e28a497659.png

Haz clic en Agregar canal de notificación. Por último, en la parte inferior del formulario, asígnale a la política el nombre “Tiempo de actividad de la aplicación web”. y haz clic en Guardar.

Para ver cómo se verá una alerta, abre Cloud Shell en la consola de Cloud. El siguiente comando detendrá el servicio nginx que se ejecuta en el Pod del servidor web:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

Después de unos minutos, deberías recibir un correo electrónico con una alerta sobre la interrupción:

808ac1d75ce3681f.png

Deshagamos eso. De vuelta en Cloud Shell, reiniciemos nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

Luego de unos minutos , recibirá otro correo electrónico de Stackdriver, pero esta vez con mejores noticias que antes:

5b8262fbbc4877c.png

8. Limpieza

Ahora que migramos de GCE a GKE con Migrate for Anthos, limpiemos nuestro proyecto de todos los recursos que creamos.

Borra el proyecto

Si lo prefieres, puedes borrar todo el proyecto. En GCP Console, ve a la página Cloud Resource Manager.

En la lista de proyectos, selecciona el proyecto en el que hemos estado trabajando y haz clic en Borrar. Se te pedirá que ingreses el ID del proyecto. Ingrésalo y haz clic en Cerrar.

Si prefieres borrar los diferentes componentes uno por uno, continúa con la siguiente sección.

Stackdriver

Panel

En la página de tu panel, haz clic en el ícono de configuración dc259295eb33cb42.png en la parte superior de la página y selecciona Borrar panel.

Política de alertas

En la página Políticas, selecciona Borrar en el menú Acciones 2ef75d82e76accaa.png a la derecha para cada política que creaste.

Verificación de tiempo de actividad

En la página Verificaciones de tiempo de actividad, selecciona Borrar en el menú Acciones a la derecha de cada verificación que hayas creado.

GCE y Kubernetes

Instancia de Google Compute Engine

gcloud compute instances delete webserver --zone=us-central1-a

Clúster de Kubernetes (incluye Migrate for Anthos, el conjunto con estado y el servicio de balanceador de cargas)

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

Discos

Nuestro conjunto con estado usó un disco que creamos. Usa el siguiente comando para recuperar el nombre:

gcloud compute disks list --filter=webserver

Usa el nombre de tu disco en lugar del mío y bórralo con lo siguiente:

gcloud compute disks delete vls-690d-webserver --zone=us-central1-a

Se borraron todos los elementos

9. ¡Felicitaciones!

¡Buen trabajo! Migraste tu servidor web de una instancia de GCE a un clúster de Kubernetes con Migrate for Anthos.

Temas abordados

  • Migramos un servidor web de GCE a un clúster de Kubernetes con Migrate for Anthos
  • Abrimos nuestro servidor web con estado al mundo exponiéndolo a través de un servicio de balanceador de cargas de Kubernetes.
  • Habilitamos Stackdriver y creamos un panel personalizado
  • Configuramos una verificación de tiempo de actividad junto con una política de alertas para informarnos cuando nuestro servidor web deja de funcionar.