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.

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 un enlace 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