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.comSi habilitas mesh.googleapis.com, se habilitarán las siguientes APIs:
API Finalidad Se puede inhabilitar meshconfig.googleapis.comCloud 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.comRelacionado con la autoridad de certificación de Cloud Service Mesh que usa Cloud Service Mesh gestionado. No container.googleapis.comObligatorio para crear clústeres de Google Kubernetes Engine (GKE). No gkehub.googleapis.comEs necesario para gestionar la malla como una flota. No monitoring.googleapis.comObligatorio para recoger telemetría de cargas de trabajo de malla. No stackdriver.googleapis.comEs necesario para usar la interfaz de usuario de los servicios. No opsconfigmonitoring.googleapis.comEs necesario para usar la interfaz de usuario de Servicios en clústeresGoogle Cloud desactivados. No connectgateway.googleapis.comEs 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.comHabilita un plano de control gestionado de alta disponibilidad y escalable. Sí* networkservices.googleapis.comHabilita un plano de control gestionado de alta disponibilidad y escalable. Sí* networksecurity.googleapis.comHabilita 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-fleetVerifica que el clúster esté registrado en la flota:
gcloud container fleet memberships listEl resultado debería ser similar al siguiente:
NAME: asm-cluster EXTERNAL_ID: LOCATION: us-central1Anota 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 enableHabilita la gestión automática de la malla:
gcloud container fleet mesh update \ --management=automatic \ --memberships=MEMBERSHIP_NAME \ --location=us-central1Sustituye
MEMBERSHIP_NAMEpor 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-central1Crea un espacio de nombres para la implementación de la pasarela:
kubectl create namespace bank-gatewaysAñ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=enabledDespliega 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/gatewaykubectl
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=240sAsegú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
requestsy 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-sampleAñ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=enabledDespliega 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 podsCuando 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 3m4sCrea recursos de Istio
GatewayyVirtualServicepara exponer la aplicación detrás de la pasarela de entrada:kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yamlObté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: STRICTAplica 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
loadgeneratordesplegado 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
frontendde 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.