Crear un clúster de GKE con Cloud Service Mesh y la CLI de gcloud
En este tutorial, aprovisionarás Cloud Service Mesh gestionado mediante la API Fleet de Google Kubernetes Engine (GKE) en un nuevo clúster público de GKE. En este tutorial se explica cómo hacer lo siguiente:
- Configura tu Google Cloud proyecto.
- Crear un clúster de GKE con el número mínimo de vCPUs que requiere Cloud Service Mesh.
- Registrar el clúster de GKE en la flota de tu proyecto.
- Aprovisionar Cloud Service Mesh gestionado en el clúster mediante la API Fleet.
- Desplegar una pasarela de entrada para exponer la aplicación.
- Implementar una aplicación de ejemplo para que puedas ver los datos de telemetría en los paneles de control de Cloud Service Mesh de la Google Cloud consola.
- Exponer y acceder a la aplicación de ejemplo.
API Fleet
En esta guía se da por supuesto que conoces las flotas, que son agrupaciones lógicas de clústeres de GKE y otros recursos que se pueden gestionar conjuntamente. Una flota es un concepto de GKE, no de Kubernetes. Al registrar un clúster en una flota, puedes aprovisionar Cloud Service Mesh gestionado en ese clúster mediante el comando gcloud container fleet mesh update
.
El uso de las flotas se habilita mediante la API Fleet (gkehub.googleapis.com
), que habilitarás al empezar este tutorial.
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.
Cuando termines esta guía de inicio rápido, puedes evitar que se te siga facturando eliminando el clúster. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
- 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.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
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.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. - Anota el ID del proyecto.
Cloud Shell incluye
gcloud
,kubectl
,git
y otras herramientas de línea de comandos que necesitas.Tu directorio $HOME de Cloud Shell tiene 5 GB de espacio de almacenamiento persistente.
Puedes elegir entre los siguientes editores de texto:
Editor de código, al que puedes acceder haciendo clic en edit en la parte superior de la ventana de Cloud Shell.
Emacs, Vim o Nano, a los que puedes acceder desde la línea de comandos de Cloud Shell.
Asegúrate de que tienes instaladas las siguientes herramientas:
Autentícate con Google Cloud CLI:
gcloud auth login --project PROJECT_ID
Actualiza los componentes:
gcloud components update
Ejecuta el siguiente comando para crear el clúster con el número mínimo de vCPUs que requiere Cloud Service Mesh. En el comando, sustituye los marcadores de posición por la siguiente información:
- CLUSTER_NAME: el nombre de tu clúster. El nombre solo puede contener caracteres alfanuméricos en minúscula y
-
, debe empezar por una letra y terminar por un carácter alfanumérico, y no puede tener más de 40 caracteres. - PROJECT_ID: el ID del proyecto en el que se creará el clúster.
- CLUSTER_LOCATION: la zona del clúster, como
us-central1-a
.
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
El proceso de creación del clúster tarda varios minutos. Mientras se crea el clúster, el comando
gcloud
muestra lo siguiente:Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
El resultado esperado si la creación se realiza correctamente es similar al siguiente:
Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID kubeconfig entry generated for CLUSTER_NAME. NAME: CLUSTER_NAME LOCATION: CLUSTER_LOCATION MASTER_VERSION: 1.20.10-gke.1600 MASTER_IP: 198.51.100.1 MACHINE_TYPE: e2-standard-4 NODE_VERSION: 1.20.10-gke.1600 NUM_NODES: 2 STATUS: RUNNING
- CLUSTER_NAME: el nombre de tu clúster. El nombre solo puede contener caracteres alfanuméricos en minúscula y
Obtén credenciales de autenticación para interactuar con el clúster.
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Resultado esperado:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
Define el contexto actual de
kubectl
en el clúster.kubectl config set-context CLUSTER_NAME
Resultado esperado:
Context "CLUSTER_NAME" created.
Habilita Cloud Service Mesh en la flota de tu proyecto.
gcloud container fleet mesh enable --project PROJECT_ID
La salida es similar a la siguiente:
Waiting for Feature Service Mesh to be created...done.
Registra el clúster en la flota del proyecto:
gcloud container fleet memberships register CLUSTER_NAME-membership \ --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
La salida es similar a la siguiente:
Waiting for membership to be created...done. Finished registering to the Fleet.
Aprovisiona Cloud Service Mesh gestionado en el clúster mediante la API Fleet:
gcloud container fleet mesh update \ --management automatic \ --memberships CLUSTER_NAME-membership \ --project PROJECT_ID
La salida es similar a la siguiente:
Waiting for Feature Service Mesh to be updated...done.
Verifica que Cloud Service Mesh gestionado se haya habilitado en el clúster y esté listo para usarse:
gcloud container fleet mesh describe --project PROJECT_ID
Cloud Service Mesh puede tardar unos 10 minutos en aprovisionarse y estar listo para usarse en el clúster. Si ves
controlPlaneManagement.state: DISABLED
ocontrolPlaneManagement.state: PROVISIONING
, tendrás que volver a ejecutar el comando anterior cada pocos minutos hasta que veascontrolPlaneManagement.state: ACTIVE
.La salida es similar a la siguiente:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/your-cluster-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/your-cluster-membership: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: 'Revision(s) ready for use: asm-managed.' updateTime: '2022-07-06T01:19:24.243993678Z' name: projects/your-project-id/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-07-06T01:19:27.475885687Z'
Crea un espacio de nombres para la pasarela de entrada si aún no tienes uno. Las pasarelas son cargas de trabajo de usuario y, como práctica recomendada, no deben desplegarse en el espacio de nombres del plano de control. Sustituye
GATEWAY_NAMESPACE
por el nombre de tu espacio de nombres.kubectl create namespace GATEWAY_NAMESPACE
Resultado esperado:
namespace/GATEWAY_NAMESPACE created
Habilita la inyección automática en la pasarela. Los pasos que debe seguir dependen de si quiere usar etiquetas de inyección predeterminadas (por ejemplo,
istio-injection=enabled
) o la etiqueta de revisión en el espacio de nombres de la pasarela. El webhook del inyector de sidecar usa la etiqueta de revisión y la etiqueta de revisión predeterminadas para asociar los proxies insertados con una revisión del plano de control concreta.Etiquetas de inyección predeterminadas
Aplica las etiquetas de inyección predeterminadas al espacio de nombres.
kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
Etiqueta de revisión
Usa el siguiente comando para localizar la etiqueta de revisión en
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
El comando muestra la etiqueta de revisión que corresponde a la versión de Cloud Service Mesh. Por ejemplo:
asm-11910-9
Aplica la etiqueta de revisión al espacio de nombres. En el siguiente comando,
REVISION
es el valor de la etiqueta de revisiónistiod
que has anotado en el paso anterior.kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
Resultado esperado:
namespace/GATEWAY_NAMESPACE labeled
Puedes ignorar el mensaje
"istio.io/rev" not found
en la salida. Esto significa que el espacio de nombres no tenía la etiquetaistio.io/rev
, que debería aparecer en las nuevas instalaciones de Cloud Service Mesh o en las nuevas implementaciones. Como la inyección automática falla si un espacio de nombres tiene las etiquetasistio.io/rev
yistio-injection
, todos los comandoskubectl label
de la documentación de Cloud Service Mesh especifican explícitamente ambas etiquetas.Si el espacio de nombres de la pasarela no está etiquetado, los pods
istio-ingressgateway
fallarán con un errorImagePullBackOff
cuando la pasarela intente extraer la imagenauto
. Esta imagen debe sustituirse por el webhook.Descarga el archivo de configuración .yaml de la pasarela de entrada de ejemplo del repositorio
anthos-service-mesh-packages
.Aplica la configuración .yaml de la pasarela de entrada de ejemplo tal cual o modifícala según sea necesario.
kubectl apply -n GATEWAY_NAMESPACE \ -f CONFIG_PATH/istio-ingressgateway
Resultado esperado:
deployment.apps/istio-ingressgateway created poddisruptionbudget.policy/istio-ingressgateway created horizontalpodautoscaler.autoscaling/istio-ingressgateway created role.rbac.authorization.k8s.io/istio-ingressgateway created rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created service/istio-ingressgateway created serviceaccount/istio-ingressgateway created
Crea los espacios de nombres de la aplicación:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Resultado esperado:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
Habilita la inyección automática de sidecars. El comando necesario depende de si quieres usar etiquetas de inyección predeterminadas (por ejemplo,
istio-injection=enabled
) o la misma etiqueta de revisión que usaste para anotar el espacio de nombres de la pasarela de entrada.Etiquetas de inyección predeterminadas
Aplica las etiquetas de inyección predeterminadas al espacio de nombres. En el siguiente comando, GATEWAY_NAMESPACE es el mismo valor que ha usado para anotar el espacio de nombres de la pasarela de entrada.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio-injection=enabled istio.io/rev- done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Etiqueta de revisión
Aplica la etiqueta de revisión a los espacios de nombres de la aplicación. En el siguiente comando, REVISION es el mismo valor que has usado para anotar el espacio de nombres de la pasarela de entrada.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Despliega la aplicación de ejemplo en el clúster.
Crea las cuentas de servicio y las implementaciones:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
Resultado esperado:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
Crea los servicios:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services
Resultado esperado:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
Crea las entradas de servicio:
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Despliega un
Gateway
y unVirtualService
para el servicio de frontendkubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
Resultado esperado:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Obtén la dirección IP externa de la puerta de enlace de entrada y sustituye los marcadores de posición por la siguiente información:
- GATEWAY_SERVICE_NAME: el nombre del servicio de pasarela de entrada. Si has desplegado la pasarela de ejemplo sin modificarla, sería
istio-ingressgateway
. - GATEWAY_NAMESPACE: el espacio de nombres en el que has implementado la pasarela de entrada:
kubectl get service GATEWAY_SERVICE_NAME \ -n GATEWAY_NAMESPACE
La salida es similar a la siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
En este ejemplo, la dirección IP de la pasarela de entrada es
35.239.7.64
.- GATEWAY_SERVICE_NAME: el nombre del servicio de pasarela de entrada. Si has desplegado la pasarela de ejemplo sin modificarla, sería
Visita la aplicación en tu navegador para confirmar la instalación:
http://EXTERNAL_IP/
En la Google Cloud consola, ve a Cloud Service Mesh.
Selecciona el Google Cloud proyecto en la lista desplegable de la barra de menú.
Si tienes más de una malla de servicios, selecciona la malla en la lista desplegable Malla de servicios.
Si quieres conservar tu clúster y eliminar la muestra de Online Boutique, sigue estos pasos:
Elimina los espacios de nombres de la aplicación:
kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Resultado esperado:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
Elimina las entradas de servicio:
kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
Si quieres evitar cargos adicionales, elimina el clúster:
Ejecuta el siguiente comando:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
En la petición ¿Quieres continuar (S/n)?, escribe s.
Al cabo de unos minutos, verás el siguiente resultado:
Deleting cluster CLUSTER_NAME...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
- Para obtener más información sobre Managed Cloud Service Mesh, consulta el artículo sobre cómo aprovisionar Managed Cloud Service Mesh.
- Para obtener una introducción rápida a la CLI de gcloud que se usa en este tutorial, consulta los comandos de
gcloud
. - Para saber cómo explorar Cloud Service Mesh en la Google Cloud consola, consulta el artículo Explorar Cloud Service Mesh en la Google Cloud consola.
- Para descubrir las funciones opcionales de Cloud Service Mesh, como Cloud Trace, las imágenes de proxy sin distribución y la autenticación de usuarios finales, consulta el artículo Habilitar funciones opcionales en Cloud Service Mesh gestionado.
- Para obtener más información sobre la seguridad en Cloud Service Mesh, consulta Información general sobre la seguridad de Cloud Service Mesh y Prácticas recomendadas de seguridad de Cloud Service Mesh.
- Para obtener más información sobre la telemetría en Cloud Service Mesh, consulta la información general sobre observabilidad.
Instalar las herramientas necesarias
Puedes ejecutar la herramienta en Cloud Shell o en tu máquina local. Cloud Shell preinstala todas las herramientas necesarias.
Cloud Shell
Cloud Shell aprovisiona una máquina virtual g1-small de Compute Engine que ejecuta un sistema operativo Linux basado en Debian. Estas son las ventajas de usar Cloud Shell:
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Ordenador local
Crear un clúster de GKE
Aprovisionar Cloud Service Mesh
Si no has cerrado esta página desde que creaste el clúster, los marcadores de posición tienen los valores que introdujiste en el comando gcloud container clusters create
.
Descargar el código de ejemplo
Clona el repositorio de Git que contiene el código de ejemplo utilizado en este tutorial:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
En las siguientes secciones de este tutorial se usa una variable DIR_PATH.
Asigna a esta variable la ruta del repositorio anthos-service-mesh-packages
que has clonado (por ejemplo, ./anthos-service-mesh-packages
).
Desplegar una pasarela de entrada
Cloud Service Mesh te ofrece la opción de desplegar y gestionar gateways como parte de tu malla de servicios. Una pasarela describe un balanceador de carga que opera en el perímetro de la malla y recibe conexiones HTTP o TCP entrantes o salientes. Las pasarelas son proxies de Envoy que te ofrecen un control pormenorizado del tráfico que entra y sale de la malla.
Más información sobre las prácticas recomendadas para las pasarelas
Desplegar el ejemplo Online Boutique
La aplicación de ejemplo Online Boutique del repositorio anthos-service-mesh-packages
se ha modificado a partir del conjunto original de manifiestos del repositorio microservices-demo
. Siguiendo las prácticas recomendadas, cada servicio se implementa en un espacio de nombres independiente con una cuenta de servicio única.
Exponer y acceder a la aplicación
Hay varias formas de exponer la aplicación. En esta guía, usaremos la pasarela de entrada que hemos implementado anteriormente para hacerlo. Para consultar otras formas de exponer la aplicación Online Boutique, consulta la sección Exponer y acceder a la aplicación de la guía Implementar la aplicación de ejemplo Online Boutique.
Ver los paneles de control de Service Mesh
Una vez que hayas desplegado cargas de trabajo en tu clúster con los proxies sidecar insertados, puedes consultar las páginas de Cloud Service Mesh en la Google Cloud consola para ver todas las funciones de observabilidad que ofrece Cloud Service Mesh. Ten en cuenta que los datos de telemetría tardan entre uno y dos minutos en mostrarse en la consolaGoogle Cloud después de implementar las cargas de trabajo.
El acceso a Cloud Service Mesh en la consola de Google Cloud se controla mediante Gestión de Identidades y Accesos (IAM). Para acceder a las páginas de Cloud Service Mesh, un propietario del proyecto debe asignar a los usuarios el rol Editor o Lector del proyecto, o bien los roles más restrictivos que se describen en el artículo sobre controlar el acceso a Cloud Service Mesh en la consola. Google Cloud
Para obtener más información, consulta el artículo sobre cómo explorar Cloud Service Mesh en la consola Google Cloud .
Limpieza
Antes de limpiar, si quieres obtener más información sobre TLS mutuo, consulta Anthos Service Mesh mediante ejemplo: mTLS.