En esta guía se describe cómo configurar Cloud Service Mesh gestionado en un clúster Autopilot de Google Kubernetes Engine (GKE). Cloud Service Mesh es una malla de servicios totalmente gestionada basada en Istio.
En este tutorial se explica cómo configurar una malla de servicios lista para producción que se ejecute en un solo clúster de Autopilot de GKE con la configuración predeterminada. Te recomendamos que consultes la guía de aprovisionamiento de Cloud Service Mesh completa al diseñar tu entorno.
Ventajas de ejecutar Cloud Service Mesh gestionado con GKE Autopilot
Cuando usas GKE en el modo Autopilot, Google se encarga de configurar y gestionar tu clúster automáticamente. El modo Autopilot simplifica la experiencia de operar un clúster y te permite centrarte en tus aplicaciones. Del mismo modo, Cloud Service Mesh gestionado es una malla de servicios totalmente gestionada que puedes aprovisionar siguiendo unos pocos pasos.
- Puedes aprovisionar la malla de servicios de Cloud gestionada mediante la API Fleet, sin necesidad de usar herramientas del lado del cliente como
istioctl
. - Cloud Service Mesh inserta automáticamente proxies sidecar en las cargas de trabajo sin necesidad de conceder privilegios elevados a tus contenedores.
- Puedes ver paneles de control detallados de tu malla y tus servicios sin necesidad de configurar nada más. Después, puedes usar estas métricas para configurar objetivos de nivel de servicio (SLOs) y alertas para monitorizar el estado de tus aplicaciones.
- El plano de control gestionado de Cloud Service Mesh se actualiza automáticamente para que obtengas los parches de seguridad y las funciones más recientes.
- El plano de datos gestionado de Cloud Service Mesh actualiza automáticamente los proxies sidecar de tus cargas de trabajo, por lo que no tienes que reiniciar los servicios cuando haya disponibles actualizaciones de proxy y parches de seguridad.
- Cloud Service Mesh es un producto compatible que se puede configurar mediante las APIs de código abierto estándar de Istio. Consulta las funciones admitidas.
Objetivos
- Crear un clúster de Autopilot de GKE
- Aprovisionar Cloud Service Mesh gestionado mediante la API Fleet
- Desplegar pasarelas de entrada de malla en un espacio de nombres dedicado
- Desplegar una aplicación de ejemplo
- Configurar Cloud Service Mesh para aplicar la autenticación mTLS estricta en las comunicaciones entre servicios
- Consulta los paneles de control de Cloud Service Mesh y verifica que los servicios se conectan con mTLS
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 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
Cloud Shell tiene preinstalado el software que necesitas para este tutorial, como kubectl
, la CLI de gcloud, Helm y Terraform. Si no usas Cloud Shell, debes instalar la CLI de gcloud.
- 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.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select 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.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select 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.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/container.admin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID
: your project ID.USER_IDENTIFIER
: the identifier for your user account—for example,myemail@example.com
.ROLE
: the IAM role that you grant to your user account.
Define las variables de entorno:
PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}
Habilita la API Mesh:
gcloud services enable mesh.googleapis.com
Si habilitas mesh.googleapis.com, se habilitarán las siguientes APIs:
API Finalidad Se puede inhabilitar meshconfig.googleapis.com
Cloud Service Mesh usa la API Mesh Configuration para reenviar datos de configuración de tu malla a Google Cloud. Además, si habilitas la API Mesh Configuration, podrás acceder a las páginas de Cloud Service Mesh en la Google Cloud consola y usar la autoridad de certificación de Cloud Service Mesh. No meshca.googleapis.com
Relacionado con la autoridad de certificación de Cloud Service Mesh que usa Cloud Service Mesh gestionado. No container.googleapis.com
Obligatorio para crear clústeres de Google Kubernetes Engine (GKE). No gkehub.googleapis.com
Se requiere para gestionar la malla como una flota. No monitoring.googleapis.com
Obligatorio para recoger telemetría de cargas de trabajo de malla. No stackdriver.googleapis.com
Es necesario para usar la interfaz de usuario de los Servicios. No opsconfigmonitoring.googleapis.com
Es necesario para usar la interfaz de usuario de Servicios en clústeresGoogle Cloud desactivados. No connectgateway.googleapis.com
Es necesario para que el plano de control de Cloud Service Mesh gestionado pueda acceder a las cargas de trabajo de la malla. Sí* trafficdirector.googleapis.com
Habilita un plano de control gestionado de alta disponibilidad y escalable. Sí* networkservices.googleapis.com
Habilita un plano de control gestionado de alta disponibilidad y escalable. Sí* networksecurity.googleapis.com
Habilita un plano de control gestionado de alta disponibilidad y escalable. Sí* Crea un clúster registrado como miembro de una flota:
gcloud container clusters create-auto asm-cluster \ --location="us-central1" \ --enable-fleet
Verifica que el clúster esté registrado en la flota:
gcloud container fleet memberships list
El resultado debería ser similar al siguiente:
NAME: asm-cluster EXTERNAL_ID: LOCATION: us-central1
Anota el nombre de la pertenencia, ya que lo necesitarás para configurar Cloud Service Mesh.
Habilita la función de flota de Cloud Service Mesh en el proyecto:
gcloud container fleet mesh enable
Habilita la gestión automática de la malla:
gcloud container fleet mesh update \ --management=automatic \ --memberships=MEMBERSHIP_NAME \ --location=us-central1
Sustituye
MEMBERSHIP_NAME
por el nombre del miembro que se muestra cuando verificaste que tu clúster está registrado en la flota.Descarga las credenciales para poder acceder al clúster:
gcloud container clusters get-credentials asm-cluster --location=us-central1
Crea un espacio de nombres para la implementación de la pasarela:
kubectl create namespace bank-gateways
Añade una etiqueta al espacio de nombres para que el plano de control de Cloud Service Mesh inserte automáticamente la configuración de la pasarela en el despliegue.
kubectl label namespace bank-gateways istio-injection=enabled
Despliega la pasarela de entrada en el espacio de nombres:
Helm
helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update helm install --wait --namespace bank-gateways \ --set resources.requests.cpu=250m \ --set resources.requests.memory=512Mi \ --set resources.requests.ephemeral-storage=1Gi \ --set resources.limits.cpu=250m \ --set resources.limits.memory=512Mi \ --set resources.limits.ephemeral-storage=1Gi \ istio-ingressgateway istio/gateway
kubectl
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages kubectl apply -n bank-gateways \ -f ./anthos-service-mesh-packages/samples/gateways/istio-ingressgateway kubectl -n bank-gateways wait "deployment/istio-ingressgateway" \ --for=condition=available --timeout=240s
Asegúrate de definir solicitudes de recursos adecuadas cuando implementes en un entorno de producción. Autopilot de GKE solo tiene en cuenta los valores de recursos definidos en
requests
y no enlimits
. El proyecto Istio publica información sobre el rendimiento y la escalabilidad.Crea un espacio de nombres de Kubernetes para la implementación:
kubectl create namespace bank-sample
Añade una etiqueta al espacio de nombres para que Cloud Service Mesh inserte automáticamente proxies sidecar en los pods de ejemplo:
kubectl label namespace bank-sample istio-injection=enabled
Despliega la aplicación de ejemplo:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
Espera a que la aplicación esté lista. Tardará varios minutos.
watch kubectl -n bank-sample get pods
Cuando la aplicación esté lista, el resultado será similar al siguiente:
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4s
Crea recursos de Istio
Gateway
yVirtualService
para exponer la aplicación detrás de la pasarela de entrada:kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
Obtén un enlace a la aplicación de ejemplo:
INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"
En un navegador, sigue el enlace para abrir la aplicación de ejemplo. Inicia sesión con el nombre de usuario y la contraseña predeterminados para ver la aplicación.
Guarda el siguiente archivo de manifiesto como
mesh-peer-authn.yaml
:apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICT
Aplica el manifiesto al clúster:
kubectl apply -f mesh-peer-authn.yaml
En la Google Cloud consola, ve a Cloud Service Mesh para ver los paneles de control de tu malla:
Selecciona el proyecto en la lista desplegable de la barra de menú.
Verá una tabla de resumen con todos los microservicios de su malla y una visualización gráfica de las conexiones entre los microservicios. En el caso de cada microservicio, la tabla muestra tres de las "señales óptimas" de SRE:
- Tráfico: solicitudes por segundo
- Porcentaje de errores
- Latencia (milisegundos)
Estas métricas se basan en el tráfico real que gestionan los microservicios. Un cliente
loadgenerator
desplegado como parte de la aplicación de ejemplo envía automáticamente tráfico de prueba constante al serviciofrontend
. Cloud Service Mesh envía automáticamente métricas, registros y (opcionalmente) trazas a Google Cloud Observability.Haz clic en el servicio
frontend
de la tabla para ver un panel de control general del servicio. Verás métricas adicionales del servicio y una visualización de las conexiones entrantes y salientes. También puedes crear un objetivo de nivel de servicio (SLO) para monitorizar el servicio y recibir alertas.Elimina la aplicación de ejemplo y las pasarelas:
kubectl delete namespace bank-sample kubectl delete namespace bank-gateways
Sigue las instrucciones para desinstalar Cloud Service Mesh.
Elimina el clúster de GKE:
gcloud container clusters delete --location us-central1 asm-cluster --quiet
Configurar un entorno
Puedes configurar tu entorno con la CLI de gcloud o Terraform.
gcloud
Terraform
gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT
Crear un clúster de GKE
Crea un clúster de GKE en modo Autopilot.
gcloud
Terraform
Para crear un clúster de GKE, puedes usar el recurso google_container_cluster
. Define el fleet
para que el clúster se añada a una flota cuando se cree.
Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.
Aprovisionar Cloud Service Mesh gestionado
Puedes aprovisionar Cloud Service Mesh gestionado mediante la función servicemesh
en la pertenencia a la flota de tu clúster.
gcloud
Terraform
Para habilitar la API Mesh, puedes usar el recurso google_project_service
.
Utiliza los recursos google_gke_hub_feature
y google_gke_hub_feature_membership
para configurar Cloud Service Mesh gestionado en tu clúster.
Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.
Verificar que el plano de control esté activo
Espera hasta que el controlPlaneManagement.state
sea ACTIVE
. Este proceso puede tardar hasta 15 minutos.
watch -n 30 gcloud container fleet mesh describe
La salida es similar a la siguiente:
membershipSpecs:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
mesh:
management: MANAGEMENT_AUTOMATIC
membershipStates:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
servicemesh:
controlPlaneManagement:
details:
- code: REVISION_READY
details: 'Ready: asm-managed'
state: ACTIVE
dataPlaneManagement:
details:
- code: PROVISIONING
details: Service is provisioning.
state: PROVISIONING
state:
code: OK
description: 'Revision(s) ready for use: asm-managed.'
La sección dataPlaneManagement
permanece en el estado PROVISIONING
hasta que implementes la puerta de enlace de entrada, ya que los clústeres Autopilot no aprovisionan ningún nodo hasta que implementes una carga de trabajo.
Desplegar una pasarela de entrada de malla
En esta sección, desplegarás una pasarela de entrada de malla para gestionar el tráfico entrante de la aplicación de ejemplo. Una pasarela de entrada es un balanceador de carga que opera en el perímetro de la malla y recibe conexiones HTTP o TCP entrantes o salientes.
Despliega la pasarela en un espacio de nombres específico y etiqueta el despliegue para asegurarte de que el plano de control de Cloud Service Mesh pueda gestionar la pasarela de forma segura y actualizarla automáticamente.
Desplegar la aplicación de ejemplo
Implementar TLS mutuo
Asegúrate de que el modo TLS mutuo (mTLS) ESTRICTO esté habilitado. Aplica una política predeterminada
PeerAuthentication
a la malla en el espacio de nombres istio-system.
Puedes anular esta configuración creando recursos PeerAuthentication
en espacios de nombres específicos.
Consultar los paneles de control de Cloud Service Mesh
Verificar que mTLS esté habilitado
Haga clic en el enlace de seguridad del panel para ver un resumen de seguridad del servicio frontend
.
En la tabla y la visualización se muestra un icono de candado verde para cada una de las conexiones entrantes y salientes entre microservicios. Este icono indica que la conexión usa mTLS para la autenticación y el cifrado.
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.
Para evitar que se apliquen cargos en tu cuenta Google Cloud por los recursos utilizados en este tutorial, sigue estos pasos:
Eliminar el proyecto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Eliminar los recursos concretos
Si has usado un proyecto que ya existía y no quieres eliminarlo, elimina los recursos concretos.
gcloud
Terraform
Elimina los recursos que has creado con Terraform:
terraform destroy