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.
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 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 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
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
.
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.
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.
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