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.
Configurar un entorno
Puedes configurar tu entorno con la CLI de gcloud o Terraform.
gcloud
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
Es necesario 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í*
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
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.
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
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.
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.
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.
Desplegar la aplicación de ejemplo
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.
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.
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
Puedes anular esta configuración creando recursos PeerAuthentication
en espacios de nombres específicos.
Consultar los paneles de control de Cloud Service Mesh
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.
Verificar que mTLS esté habilitado
Haga clic en el enlace de seguridad del panel para ver un resumen de la 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.