Aprovisionar Cloud Service Mesh en un clúster de Autopilot de GKE


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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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.

  1. 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.
  2. Install the Google Cloud CLI.

  3. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  5. 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 the resourcemanager.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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  9. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  10. 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 the resourcemanager.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.

  11. Verify that billing is enabled for your Google Cloud project.

  12. 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.
  13. Configurar un entorno

    Puedes configurar tu entorno con la CLI de gcloud o Terraform.

    gcloud

    1. Define las variables de entorno:

      PROJECT_ID=PROJECT_ID
      gcloud config set project ${PROJECT_ID}
      
    2. 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í*

    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

    1. Crea un clúster registrado como miembro de una flota:

      gcloud container clusters create-auto asm-cluster \
          --location="us-central1" \
          --enable-fleet
      
    2. 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.

    resource "google_container_cluster" "cluster" {
      name                = "asm-cluster"
      location            = var.region
      deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters
    
      enable_autopilot = true
      fleet {
        project = data.google_project.project.name
      }
    }
    
    data "google_project" "project" {}
    

    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

    1. Habilita la función de flota de Cloud Service Mesh en el proyecto:

      gcloud container fleet mesh enable
      
    2. 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.

    resource "google_project_service" "mesh_api" {
      service = "mesh.googleapis.com"
    
      disable_dependent_services = true
    }
    
    resource "google_gke_hub_feature" "feature" {
      name     = "servicemesh"
      location = "global"
    
      depends_on = [
        google_project_service.mesh_api
      ]
    }
    
    resource "google_gke_hub_feature_membership" "feature_member" {
      location   = "global"
      feature    = google_gke_hub_feature.feature.name
      membership = google_container_cluster.cluster.fleet.0.membership
      membership_location = google_container_cluster.cluster.location
      mesh {
        management = "MANAGEMENT_AUTOMATIC"
      }
    }
    

    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.

    1. Descarga las credenciales para poder acceder al clúster:

      gcloud container clusters get-credentials asm-cluster --location=us-central1
      
    2. Crea un espacio de nombres para la implementación de la pasarela:

      kubectl create namespace bank-gateways
      
    3. 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
      
    4. 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 en limits. El proyecto Istio publica información sobre el rendimiento y la escalabilidad.

    Desplegar la aplicación de ejemplo

    1. Crea un espacio de nombres de Kubernetes para la implementación:

      kubectl create namespace bank-sample
      
    2. 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
      
    3. 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/
      
    4. 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
      
    5. Crea recursos de Istio Gateway y VirtualService 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
      
    6. 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"
      
    7. 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.

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

    1. En la Google Cloud consola, ve a Cloud Service Mesh para ver los paneles de control de tu malla:

      Ir a Cloud Service Mesh

    2. 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 servicio frontend. Cloud Service Mesh envía automáticamente métricas, registros y (opcionalmente) trazas a Google Cloud Observability.

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

    1. Elimina la aplicación de ejemplo y las pasarelas:

      kubectl delete namespace bank-sample
      kubectl delete namespace bank-gateways
      
    2. Sigue las instrucciones para desinstalar Cloud Service Mesh.

    3. Elimina el clúster de GKE:

      gcloud container clusters delete --location us-central1 asm-cluster --quiet
      

    Terraform

    Elimina los recursos que has creado con Terraform:

      terraform destroy
    

    Siguientes pasos