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: |
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 |
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:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
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.
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
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.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
-
In the Google Cloud console, go to the IAM page.
Ir a IAM - Selecciona el proyecto.
- Haz clic en Conceder acceso.
-
En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, se trata de la dirección de correo de una cuenta de Google.
- En la lista Selecciona un rol, elige un rol.
- Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
- Haz clic en Guardar.
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.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 quekubectl
apunte a tu clúster.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
porhello-namespace
, el nombre del nuevo espacio de nombres que vas a crear.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
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, tuGSA_PROJECT
y tuGoogle CloudPROJECT_ID
son iguales.
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 CloudGSA_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"
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 CloudPROJECT_ID
: tu ID de proyecto Google CloudNAMESPACE
: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]"
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
Clona la aplicación de ejemplo del repositorio de GitHub en tu Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
Para iniciar el editor de Cloud Shell, haz clic en
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.
Abre el panel Explorador del editor de Cloud Shell y ve al directorio
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s
.Abre el archivo
deployment.yaml
y actualiza el camposerviceAccountName
. Para ello, sustituye<KSA_NAME>
porksa-helloapp
, el nombre de tu cuenta de servicio de Kubernetes.Imagen 1. Actualiza el nombre de la cuenta de servicio de Kubernetes en el archivo de implementación. Cierra el editor de Cloud Shell y vuelve al terminal de Cloud Shell.
En el terminal de Cloud Shell, ve al directorio
hello-app-cloud-spanner
:cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
Despliega la aplicación:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
Reemplaza
NAMESPACE
porhello-namespace
.Espera a que se implemente la aplicación con
STATUS
comoRunning
:kubectl get pods -n=NAMESPACE --watch
Reemplaza
NAMESPACE
porhello-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
Pulsa Ctrl+C en el teclado para volver al símbolo del sistema y ejecutar más comandos.
Despliega el balanceador de carga:
kubectl apply -f k8s/service.yaml -n=NAMESPACE
Reemplaza
NAMESPACE
porhello-namespace
.Comprueba que se ha asignado una dirección IP externa:
kubectl get service -n=NAMESPACE --watch
Reemplaza
NAMESPACE
porhello-namespace
.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.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.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
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
porhello-namespace
.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
Elimina la base de datos de Spanner:
gcloud spanner databases delete hello-database --instance=hello-instance
Elimina la instancia de Spanner:
gcloud spanner instances delete hello-instance
- Consulta cómo crear un clúster de GKE para tu instalación de Agones.
- Consulta las prácticas recomendadas para usar Spanner como base de datos de videojuegos.
- Consulta cómo desplegar una base de datos de PostgreSQL de alta disponibilidad en GKE.
- Consulta las prácticas recomendadas para desplegar bases de datos en GKE.
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.
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.
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
Grant the roles
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:
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.
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
.
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.
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.
Si has eliminado el proyecto, ya has terminado. Si no has eliminado el proyecto, elimina los recursos de GKE y Spanner.