Desplegar una aplicación con Autopilot de GKE y Spanner


En este tutorial se describe cómo desplegar una aplicación web en un contenedor en un clúster Autopilot de Google Kubernetes Engine (GKE) y cómo usar una base de datos de Google Spanner en el backend para almacenar datos. La aplicación de ejemplo gestiona una tabla de jugadores. Puedes añadir y eliminar jugadores a través de la interfaz gráfica de usuario (GUI) de la aplicación.

Spanner es un servicio de base de datos relacional totalmente gestionado, escalable horizontalmente y distribuido en todo el mundo que proporciona transacciones ACID y semántica SQL sin poner en peligro el rendimiento ni la alta disponibilidad.

Antes de leer esta página, asegúrate de que conoces Kubernetes.

Por qué GKE y Spanner

Como desarrollador, puede que no quieras dedicar tiempo a calcular la cantidad de recursos de almacenamiento y computación que necesita tu aplicación, ni a predecir el consumo de RAM y CPU durante los periodos de fluctuación de la demanda, ni a preocuparte por los fallos de la aplicación en los momentos de mayor carga.

Si usas Autopilot de GKE como servicio de Kubernetes totalmente gestionado y Spanner como servicio de base de datos totalmente gestionado, puedes desarrollar y desplegar aplicaciones más rápido en una infraestructura estable que simplifica la configuración y la gestión de recursos. GKE Autopilot se encarga de configurar y escalar la infraestructura para alojar tu aplicación añadiendo o quitando nodos del clúster en función de los requisitos en tiempo de ejecución. Del mismo modo, Spanner puede escalar verticalmente de forma dinámica con una intervención manual mínima a medida que cambian los requisitos de almacenamiento o de computación.

Por ejemplo, supongamos que vas a lanzar el próximo juego de éxito, que crees que se hará viral y, por lo tanto, atraerá mucho tráfico web durante la semana del lanzamiento. Spanner puede ayudarte a gestionar este aumento del rendimiento proporcionándote la capacidad de aumentar, reducir o reasignar recursos de computación al instante, al tiempo que mantienes la máxima disponibilidad de la aplicación con Autopilot de GKE.

Objetivos

En este tutorial, aprenderás a hacer lo siguiente:

  • Crea una base de datos de Spanner que almacene un registro de jugadores.

  • Despliega una aplicación web de ejemplo llamada hello-app-cloud-spanner con una interfaz gráfica de usuario.

En la siguiente tabla se describen los Google Cloud recursos que creas o usas, las variables con las que se identifican y los valores prescritos para ellos en este tutorial:

Recurso Variable Valor
Google Cloud ID de proyecto PROJECT_ID

El ID de proyecto que se genera al crear un proyecto.

Ejemplo: my-gcp-project

Región de Compute COMPUTE_REGION

La región de Compute Engine en la que quieres crear la instancia de Spanner y el clúster de GKE. Te recomendamos que elijas la región más cercana a la ubicación geográfica de tus clientes, pero en este tutorial vamos a usar us-west1.

Instancia de Spanner - hello-instance
Base de datos de Spanner - hello-database
Clúster de Autopilot de GKE CLUSTER_NAME hello-cluster
Espacio de nombres de Kubernetes NAMESPACE hello-namespace
Cuenta de servicio de Kubernetes KSA_NAME ksa-helloapp
Cuenta de servicio de gestión de identidades y accesos GSA_NAME gsa-helloapp
ID de proyecto de la cuenta de servicio de gestión de identidades y accesos GSA_PROJECT Tu Google Cloud PROJECT_ID.

En este tutorial, te recomendamos que crees recursos nuevos, lo que te permitirá eliminarlos fácilmente y sin riesgos después de implementar la aplicación de ejemplo. Sin embargo, si tienes espacios de nombres, cuentas de servicio de IAM y cuentas de servicio de Kubernetes, puedes usarlos.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

Asegúrate de cumplir los siguientes requisitos previos:

Seleccionar o crear un proyecto

Puedes usar un proyecto que ya tengas o crear uno para este tutorial.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Habilitar las APIs

    Enable the Artifact Registry, Compute Engine, GKE, and IAM Service Account Credentials APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

    Configurar Cloud Shell

    En este tutorial, usarás Cloud Shell para ejecutar los comandos gcloud y kubectl. Cloud Shell es un entorno de shell para gestionar recursos alojados en Google Cloud. Viene preinstalado con la CLI de Google Cloud y la herramienta de línea de comandos kubectl.

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    Se abrirá una sesión de Cloud Shell en un marco de la parte inferior de la consola.

    Antes de ejecutar los comandos de este tutorial, asegúrate de que el proyecto predeterminado sea el ID del proyecto en el que quieras desplegar la aplicación de ejemplo. Si aún no lo has hecho, ejecuta el siguiente comando en Cloud Shell:

    gcloud config set project PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu proyecto.

    Otorgar roles de gestión de identidades y accesos

    Comprueba que tu Google Cloud cuenta tenga los roles de gestión de identidades y accesos necesarios para este tutorial.

    Make sure that you have the following role or roles on the project: roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Conceder acceso.
    4. En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, se trata de la dirección de correo de una cuenta de Google.

    5. En la lista Selecciona un rol, elige un rol.
    6. Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
    7. Haz clic en Guardar.
    8. Configurar Spanner

      Para configurar Spanner, debes crear una instancia y una base de datos de Spanner.

      Crear una instancia de Spanner

      Una instancia de Spanner es una asignación de recursos que utilizan las bases de datos de Spanner creadas en esa instancia.

      Crea una instancia de Spanner llamada hello-instance con una configuración regional y una capacidad de computación de 100 unidades de procesamiento.

      gcloud spanner instances create hello-instance \
          --config=regional-COMPUTE_REGION \
          --description="Spanner sample instance" \
          --processing-units=100
      

      En este tutorial, sustituye COMPUTE_REGION por us-west1.

      Crear una base de datos de Spanner

      Una base de datos de Spanner incluye tus tablas, vistas e índices. Una base de datos hereda las propiedades de su instancia principal, como su configuración (regional o multirregional), la capacidad de computación disponible y el almacenamiento.

      Crea una base de datos de Spanner llamada hello-database con una tabla llamada Players mediante el dialecto GoogleSQL. Ejecuta la siguiente consulta en Cloud Shell:

      gcloud spanner databases create hello-database \
          --instance=hello-instance \
          --database-dialect=GOOGLE_STANDARD_SQL \
          --ddl="CREATE TABLE Players (
              PlayerUuid STRING(36) NOT NULL,
              FirstName STRING(1024),
              LastName STRING(1024),
              BirthDate DATE) PRIMARY KEY(PlayerUuid)"
      

      Crear un clúster de Autopilot de GKE

      Una vez que hayas configurado Spanner, crea un clúster de Autopilot y usa Workload Identity Federation para GKE para acceder a tu base de datos de forma segura y gestionable.

      Crea un clúster de Autopilot llamado hello-cluster. Los clústeres de Autopilot tienen habilitada de forma predeterminada la federación de Workload Identity para GKE.

      gcloud container clusters create-auto CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
      

      Haz los cambios siguientes:

      • CLUSTER_NAME: hello-cluster
      • CONTROL_PLANE_LOCATION: la región de Compute Engine del plano de control de tu clúster. En este tutorial, usa la misma región, us-west1, en la que creaste la instancia de Spanner. Te recomendamos que crees la instancia de Spanner y el clúster de Autopilot de GKE en la misma región para reducir la latencia.

      La creación del clúster puede tardar entre 8 y 10 minutos.

      El resultado debería ser similar al siguiente:

      NAME: hello-cluster
      LOCATION: us-west1
      MASTER_VERSION: 1.26.5-gke.1200
      MASTER_IP: 192.0.2.1
      MACHINE_TYPE: e2-medium
      NODE_VERSION: 1.26.5-gke.1200
      NUM_NODES: 3
      STATUS: RUNNING
      

      Configurar el clúster para usar Workload Identity Federation for GKE

      Configura tu clúster para que se autentique en Google Cloud mediante la federación de identidades de carga de trabajo para GKE antes de implementar la aplicación.

      1. Obtén las credenciales para acceder al clúster:

        gcloud container clusters get-credentials CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
        

        Haz los cambios siguientes:

        • CLUSTER_NAME: hello-cluster
        • CONTROL_PLANE_LOCATION: us-west1

        De esta forma, se actualiza un archivo kubeconfig con las credenciales y la información de endpoint adecuadas para que kubectl apunte a tu clúster.

      2. Crea un espacio de nombres para usarlo en la cuenta de servicio de Kubernetes. También puedes usar el espacio de nombres predeterminado o cualquier espacio de nombres que ya tengas.

        kubectl create namespace NAMESPACE
        

        Sustituye NAMESPACE por hello-namespace, el nombre del nuevo espacio de nombres que vas a crear.

      3. Crea una cuenta de servicio de Kubernetes para que la use tu aplicación:

        kubectl create serviceaccount KSA_NAME \
          --namespace NAMESPACE
        

        Haz los cambios siguientes:

        • KSA_NAME: ksa-helloapp, el nombre de la nueva cuenta de servicio de Kubernetes que vas a crear.
        • NAMESPACE: hello-namespace
      4. Crea una cuenta de servicio de IAM para tu aplicación:

        gcloud iam service-accounts create GSA_NAME \
          --project=GSA_PROJECT
        

        Haz los cambios siguientes:

        • GSA_NAME: gsa-helloapp, el nombre de la nueva cuenta de servicio de gestión de identidades y accesos que vas a crear.
        • GSA_PROJECT: tu ID de proyecto Google Cloud. En este tutorial, vas a crear la cuenta de servicio de gestión de identidades y accesos en el mismo proyecto Google Cloud en el que vas a desplegar la aplicación de ejemplo. Por lo tanto, tu GSA_PROJECT y tuGoogle Cloud PROJECT_ID son iguales.
      5. Añade una vinculación de política de gestión de identidades y accesos a tu cuenta de servicio de gestión de identidades y accesos para leer y escribir en Spanner:

        gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/spanner.admin"
        

        Haz los cambios siguientes:

        • PROJECT_ID: tu ID de proyecto Google Cloud
        • GSA_NAME: gsa-helloapp

        Ejemplo:

        gcloud projects add-iam-policy-binding my-gcp-project \
          --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \
          --role "roles/spanner.admin"
      6. Permite que la cuenta de servicio de Kubernetes suplante la identidad de la cuenta de servicio de gestión de identidades y accesos (IAM) añadiendo un enlace de política de IAM entre las dos cuentas de servicio. Este enlace permite que la cuenta de servicio de Kubernetes actúe como la cuenta de servicio de gestión de identidades y accesos, de modo que la cuenta de servicio de Kubernetes pueda leer y escribir en Spanner.

        gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
        

        Haz los cambios siguientes:

        • GSA_NAME: gsa-helloapp
        • GSA_PROJECT: tu ID de proyecto Google Cloud
        • PROJECT_ID: tu ID de proyecto Google Cloud
        • NAMESPACE: hello-namespace
        • KSA_NAME: ksa-helloapp

        Ejemplo:

        gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
      7. Anota la cuenta de servicio de Kubernetes con la dirección de correo de la cuenta de servicio de gestión de identidades y accesos. De esta forma, tu aplicación de muestra sabrá qué cuenta de servicio debe usar para acceder a los servicios de Google Cloud . Por lo tanto, cuando la aplicación usa bibliotecas de cliente de las APIs de Google estándar para acceder a los servicios, usa esa cuenta de servicio de IAM. Google Cloud

        kubectl annotate serviceaccount KSA_NAME \
          --namespace NAMESPACE \
          iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
        

        Haz los cambios siguientes:

        • KSA_NAME: ksa-helloapp
        • NAMESPACE: hello-namespace
        • GSA_NAME: gsa-helloapp
        • GSA_PROJECT: tu ID de proyecto Google Cloud

        Ejemplo:

        kubectl annotate serviceaccount ksa-helloapp \
          --namespace hello-namespace \
          iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com

      Desplegar la aplicación de ejemplo en el clúster

      Ahora que has configurado GKE y Spanner con los servicios y la autenticación necesarios, puedes desplegar la aplicación de ejemplo hello-app-cloud-spanner.

      1. Clona la aplicación de ejemplo del repositorio de GitHub en tu Cloud Shell:

        git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
        
      2. Para iniciar el editor de Cloud Shell, haz clic en Botón Editor de código Abrir editor en la barra de herramientas de la ventana de terminal.

        Para obtener más información, consulta la descripción general de la interfaz del editor de Cloud Shell.

      3. Abre el panel Explorador del editor de Cloud Shell y ve al directorio kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

      4. Abre el archivo deployment.yaml y actualiza el campo serviceAccountName. Para ello, sustituye <KSA_NAME> por ksa-helloapp, el nombre de tu cuenta de servicio de Kubernetes.

        Edita el archivo YAML para actualizar KSA_NAME.
        Imagen 1. Actualiza el nombre de la cuenta de servicio de Kubernetes en el archivo de implementación.
      5. Cierra el editor de Cloud Shell y vuelve al terminal de Cloud Shell.

      6. En el terminal de Cloud Shell, ve al directorio hello-app-cloud-spanner:

        cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
        
      7. Despliega la aplicación:

        kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
        

        Reemplaza NAMESPACE por hello-namespace.

      8. Espera a que se implemente la aplicación con STATUS como Running:

        kubectl get pods -n=NAMESPACE --watch
        

        Reemplaza NAMESPACE por hello-namespace.

        El resultado debería ser similar al siguiente:

        NAME                                       READY   STATUS              RESTARTS   AGE
        hello-app-cloud-spanner-765c9b8779-lfcrc   0/1     ContainerCreating   0          87s
        hello-app-cloud-spanner-765c9b8779-lfcrc   1/1     Running             0          3m15s
        
      9. Pulsa Ctrl+C en el teclado para volver al símbolo del sistema y ejecutar más comandos.

      Exponer la aplicación de ejemplo en Internet

      Para exponer un servicio de Kubernetes fuera del clúster, crea un servicio de tipo LoadBalancer. Este tipo de servicio genera una dirección IP de balanceador de carga externa para tus pods, a la que se puede acceder a través de Internet.

      1. Despliega el balanceador de carga:

        kubectl apply -f k8s/service.yaml -n=NAMESPACE
        

        Reemplaza NAMESPACE por hello-namespace.

      2. Comprueba que se ha asignado una dirección IP externa:

        kubectl get service -n=NAMESPACE --watch
        

        Reemplaza NAMESPACE por hello-namespace.

      3. Una vez asignado, copia el EXTERNAL-IP (por ejemplo, 203.0.113.0) y ábrelo en un navegador. Se abre una interfaz web que muestra y gestiona la base de datos de jugadores.

      4. Puedes usar la interfaz gráfica de usuario de la aplicación para crear o eliminar registros de jugadores, que se guardan en la base de datos de Spanner.

        Añadir o eliminar jugadores.
        Imagen 2. Crear o eliminar jugadores en el registro.

        Ejecuta la siguiente consulta para verificar si la base de datos de Spanner se ha actualizado con tus entradas:

        gcloud spanner databases execute-sql hello-database \
          --instance=hello-instance \
          --sql="SELECT * FROM Players LIMIT 10"
        

        El resultado debería ser similar al siguiente:

        PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3
        FirstName: John
        LastName: Smith
        BirthDate: 1997-07-12
        
        PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e
        FirstName: Jane
        LastName: Doe
        BirthDate: 2013-07-12
        

      Limpieza

      Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

      Eliminar un proyecto

      La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para este tutorial.

    9. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    10. In the project list, select the project that you want to delete, and then click Delete.
    11. In the dialog, type the project ID, and then click Shut down to delete the project.
    12. Si has eliminado el proyecto, ya has terminado. Si no has eliminado el proyecto, elimina los recursos de GKE y Spanner.

      Eliminar recursos de GKE

      1. Elimina el servicio. De este modo, se desasigna el balanceador de carga Google Cloud creado para tu servicio:

        kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
        

        Reemplaza NAMESPACE por hello-namespace.

      2. Elimina el clúster de GKE. De esta forma, se eliminan los recursos que constituyen un clúster, como las instancias de computación, los discos y los recursos de red:

        gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
        

      Eliminar recursos de Spanner

      1. Elimina la base de datos de Spanner:

        gcloud spanner databases delete hello-database --instance=hello-instance
        
      2. Elimina la instancia de Spanner:

        gcloud spanner instances delete hello-instance
        

      Siguientes pasos