Implementa una app con GKE Autopilot y Cloud Spanner

En este instructivo, se describe cómo implementar una aplicación web en contenedores en un clúster de Google Kubernetes Engine (GKE) Autopilot y usar una base de datos de Google Spanner en el backend para almacenar datos. La aplicación de muestra administra una tabla de jugadores. Puedes agregar y borrar jugadores a través de la interfaz gráfica de usuario (GUI) de la app.

Spanner es un servicio de bases de datos relacional, distribuido de forma global y escalable de forma vertical completamente administrado que proporciona transacciones ACID y semántica de SQL sin comprometer el rendimiento y la alta disponibilidad.

Antes de leer esta página, asegúrate de estar familiarizado con Kubernetes.

Por qué usar GKE y Spanner

Como desarrollador, es posible que no desees dedicar tiempo a descubrir la cantidad de recursos de almacenamiento y procesamiento que necesita tu aplicación, o a predecir el consumo de RAM y CPU durante los períodos de fluctuación de las demandas o a preocuparte por las fallas de la aplicación en pico de carga.

Si usas GKE Autopilot como un servicio de Kubernetes completamente administrado y Spanner como un servicio de base de datos completamente administrado, puedes desarrollar e implementar apps más rápido en una infraestructura estable que simplifique la configuración y la administración de recursos. Autopilot de GKE controla la configuración y el escalamiento de la infraestructura para alojar tu app mediante la adición o eliminación de nodos hacia o desde el clúster, según los requisitos en el entorno de ejecución. De manera similar, Spanner puede escalar horizontalmente y de forma dinámica con una intervención manual mínima, a medida que cambian los requisitos de procesamiento o almacenamiento.

Por ejemplo, imagina que estás lanzando un juego que será el próximo éxito de ventas y esperas que se vuelva viral y atraiga mucho tráfico web durante su semana de lanzamiento. Spanner puede ayudarte a adaptarse a esta capacidad de procesamiento creciente. Para ello, proporciona la capacidad de aumentar, disminuir o reasignar los recursos de procesamiento de forma instantánea y, al mismo tiempo, mantener la disponibilidad máxima de la aplicación con GKE Autopilot.

Configura Spanner

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

Crear una instancia de Spanner

Una instancia de Spanner es una asignación de recursos que usan 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 procesamiento de 100 unidades de procesamiento.

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

Reemplaza COMPUTE_REGION por us-west1 para este instructivo.

Crear una base de datos de Spanner

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

Crea una base de datos de Spanner llamada hello-database con una tabla llamada Players usando el dialecto de 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)"

Crea un clúster de GKE Autopilot

Después de configurar Spanner, crea un clúster de Autopilot y usa la federación de identidades para cargas de trabajo para GKE para acceder a tu base de datos de manera segura y administrable.

Crea un clúster de Autopilot con el nombre hello-cluster: Los clústeres de Autopilot tienen la federación de identidades para cargas de trabajo para GKE habilitada de forma predeterminada.

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

Reemplaza lo siguiente:

  • CLUSTER_NAME: hello-cluster
  • CONTROL_PLANE_LOCATION: La región de Compute Engine del plano de control de tu clúster. Para este instructivo, 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 demorar entre 8 y 10 minutos.

El resultado es 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

Configura el clúster a fin de usar la federación de identidades para cargas de trabajo para GKE

Configura tu clúster para autenticarte en Google Cloud con la federación de identidades para cargas de trabajo para GKE antes de implementar la app.

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

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

    Reemplaza lo siguiente:

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

    Esto actualiza un archivo kubeconfig con las credenciales y la información del extremo adecuadas para dirigir kubectl a tu clúster.

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

    kubectl create namespace NAMESPACE
    

    Reemplaza NAMESPACE por hello-namespace, el nombre del nuevo espacio de nombres que estás creando.

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

    kubectl create serviceaccount KSA_NAME \
      --namespace NAMESPACE
    

    Reemplaza lo siguiente:

    • KSA_NAME: ksa-helloapp, el nombre de la nueva cuenta de servicio de Kubernetes que estás creando.
    • 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
    

    Reemplaza lo siguiente:

    • GSA_NAME: gsa-helloapp, el nombre de la nueva cuenta de servicio de IAM que estás creando.
    • GSA_PROJECT: ID del proyecto de Google Cloud. En este instructivo, crearás la cuenta de servicio de IAM en el mismo proyecto Google Cloud en el que implementarás la app de ejemplo. Por lo tanto, tu GSA_PROJECT yGoogle Cloud PROJECT_ID son iguales.
  5. Agrega una vinculación de política de IAM para que tu cuenta de servicio de IAM lea y escriba en Spanner:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto de 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. Para permitir que la cuenta de servicio de Kubernetes actúe en nombre de la cuenta de servicio de IAM, agrega una vinculación de política de IAM entre las dos. Esta vinculación permite que la cuenta de servicio de Kubernetes actúe como la cuenta de servicio de IAM para 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]"
    

    Reemplaza lo siguiente:

    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: El ID de tu proyecto de Google Cloud
    • PROJECT_ID: El ID de tu proyecto de 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 electrónico de la cuenta de servicio de IAM. Esto permite que tu app de ejemplo sepa qué cuenta de servicio usar para acceder a los servicios de Google Cloud . Por lo tanto, cuando la app usa cualquier biblioteca cliente estándar de la API de Google para acceder a los servicios de Google Cloud , usa esa cuenta de servicio de IAM.

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

    Reemplaza lo siguiente:

    • KSA_NAME: ksa-helloapp
    • NAMESPACE: hello-namespace
    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: El ID de tu proyecto de 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

Implementa la app de muestra en el clúster

Ahora que configuraste GKE y Spanner con los servicios y la autenticación necesarios, estás listo para implementar la app de muestra hello-app-cloud-spanner.

  1. Clona la app de muestra del repositorio de GitHub a tu Cloud Shell:

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

    Para obtener más información, consulta Descripción general de la interfaz de Editor de Cloud Shell.

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

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

    Edita el archivo YAML para actualizar KSA_NAME.
    Figura 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 regresa a la terminal de Cloud Shell.

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

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

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

    Reemplaza NAMESPACE por hello-namespace.

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

    kubectl get pods -n=NAMESPACE --watch
    

    Reemplaza NAMESPACE por hello-namespace.

    El resultado es 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. Presiona Ctrl+C en el teclado para regresar al símbolo del sistema y ejecutar más comandos.

Expón la app de muestra a Internet

Para exponer un servicio de Kubernetes fuera del clúster, debes crear un servicio de tipo LoadBalancer. Este tipo de servicio genera una dirección IP del balanceador de cargas externo para tus Pods, a la que se puede acceder a través de Internet.

  1. Implementa el balanceador de cargas:

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

    Reemplaza NAMESPACE por hello-namespace.

  2. Observa si se asigna una dirección IP externa:

    kubectl get service -n=NAMESPACE --watch
    

    Reemplaza NAMESPACE por hello-namespace.

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

  4. Puedes usar la GUI de la app para crear o borrar registros de jugadores, y estos se guardan en la base de datos de Spanner.

    Agrega o borra jugadores.
    Figura 2. Crea o borra jugadores en el registro.

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

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

    El resultado es similar a este:

    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