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

En esta guía, se describe cómo configurar Cloud Service Mesh administrado en un clúster de Google Kubernetes Engine (GKE) Autopilot. Cloud Service Mesh es una malla de servicios completamente administrada basada en Istio.

En este instructivo, se muestra cómo configurar una malla de servicios lista para producción que se ejecute en un solo clúster de GKE Autopilot con la configuración predeterminada. Te recomendamos que también consultes la Guía de aprovisionamiento de Cloud Service Mesh cuando diseñes tu entorno.

Ventajas de ejecutar Cloud Service Mesh administrado con GKE Autopilot

Cuando usas GKE en modo Autopilot, Google se encarga de la configuración y la administración de tu clúster automáticamente. El modo Autopilot optimiza la experiencia de operar un clúster y te permite enfocarte en tus aplicaciones. De la misma manera, Cloud Service Mesh administrado es un servicio mesh completamente administrado al que puedes aprovisionar siguiendo algunos pasos.

  • Aprovisionas Cloud Service Mesh administrado mediante la API de Fleet, sin la necesidad de usar herramientas del lado del cliente como istioctl.
  • Cloud Service Mesh inserta proxies de sidecar automáticamente en las cargas de trabajo sin necesidad de otorgar privilegios elevados a tus contenedores.
  • Puedes ver paneles enriquecidos para la malla y los servicios sin ninguna configuración adicional y, luego, usar estas métricas para configurar objetivos de nivel de servicio (SLO) y alertas para supervisar el estado de las aplicaciones
  • El plano de control de Cloud Service Mesh administrado se actualiza automáticamente para garantizar que obtengas los parches de seguridad y las funciones más recientes.
  • El plano de datos administrado de Cloud Service Mesh actualiza automáticamente los proxies de sidecar en las cargas de trabajo para que no debas reiniciar los servicios cuando haya actualizaciones de proxy y parches de seguridad disponibles
  • Cloud Service Mesh es un producto compatible y se puede configurar mediante las APIs de código abierto de Istio estándar. Consulta características compatibles.

Objetivos

  • Crea un clúster de GKE Autopilot
  • Aprovisiona Cloud Service Mesh administrado mediante la API de Fleet
  • Implementa puertas de enlace de entrada de la malla en un espacio de nombres dedicado
  • Implementa una aplicación de ejemplo
  • Configura Cloud Service Mesh para aplicar una autenticación mutua estricta de TLS (mTLS) para la comunicación de servicio a servicio
  • Visualiza los paneles de Cloud Service Mesh y verifica que los servicios se conecten con mTLS

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para obtener una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Antes de comenzar

Cloud Shell tiene preinstalado el software que necesitas para este instructivo, incluido kubectl, gcloud CLI, Helm y Terraform. Si no usas Cloud Shell, debes instalar gcloud CLI.

  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 usas un proveedor de identidad externo (IdP), primero debes Acceder a la gcloud CLI 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 role (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 usas un proveedor de identidad externo (IdP), primero debes Acceder a la gcloud CLI 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 role (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. Configura tu entorno

    Puedes configurar tu entorno con la gcloud CLI o Terraform.

    gcloud

    1. Establece las variables de entorno:

      PROJECT_ID=PROJECT_ID
      gcloud config set project ${PROJECT_ID}
      
    2. Habilita la API de Mesh:

      gcloud services enable mesh.googleapis.com
      

      Habilitar mesh.googleapis.com habilita las siguientes APIs:

      API Objetivo Se puede inhabilitar
      meshconfig.googleapis.com Cloud Service Mesh usa la API de configuración de malla para retransmitir datos de configuración de tu malla a Google Cloud. Además, habilitar la API de configuración de malla te permite acceder a las páginas de Cloud Service Mesh en la consola de Google Cloud y usar la autoridad certificadora de Cloud Service Mesh. No
      meshca.googleapis.com Se relaciona con la autoridad certificadora de Cloud Service Mesh que usa Cloud Service Mesh administrado. No
      container.googleapis.com Obligatorio para crear clústeres de Google Kubernetes Engine (GKE). No
      gkehub.googleapis.com Es obligatorio para administrar la malla como una flota. No
      monitoring.googleapis.com Se requiere para capturar la telemetría de las cargas de trabajo en malla. No
      stackdriver.googleapis.com Obligatorio para usar la IU de los servicios. No
      opsconfigmonitoring.googleapis.com Se requiere para usar la IU de servicios en clústeres fuera deGoogle Cloud. No
      connectgateway.googleapis.com Es obligatorio para que el plano de control de Cloud Service Mesh administrado pueda acceder a las cargas de trabajo de la malla. Sí*
      trafficdirector.googleapis.com Habilita un plano de control administrado escalable y con alta disponibilidad. Sí*
      networkservices.googleapis.com Habilita un plano de control administrado escalable y con alta disponibilidad. Sí*
      networksecurity.googleapis.com Habilita un plano de control administrado escalable y con alta disponibilidad. Sí*

    Terraform

    gcloud config set project PROJECT_ID
    GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_PROJECT
    

    Crea un clúster de GKE

    Crear 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 es similar al siguiente:

      NAME: asm-cluster
      EXTERNAL_ID:
      LOCATION: us-central1
      

      Anota el nombre de la membresía, ya que lo necesitas para configurar Cloud Service Mesh.

    Terraform

    Para crear un clúster de GKE, puedes usar el recurso google_container_cluster. Establece el bloque fleet para que el clúster se agregue 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" {}
    

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    Aprovisiona Cloud Service Mesh administrado

    Puedes aprovisionar Cloud Service Mesh administrado con la función servicemesh en la membresía de la flota para tu clúster.

    gcloud

    1. Habilita la característica de flota de Cloud Service Mesh en el proyecto:

      gcloud container fleet mesh enable
      
    2. Habilita la administración automática de la malla:

      gcloud container fleet mesh update \
          --management=automatic \
          --memberships=MEMBERSHIP_NAME \
          --location=us-central1
      

      Reemplaza MEMBERSHIP_NAME por el nombre de membresía que aparece cuando verificaste que tu clúster está registrado en la flota.

    Terraform

    Para habilitar la API de malla, puedes usar el recurso google_project_service.

    Usa los recursos google_gke_hub_feature y google_gke_hub_feature_membership para configurar Cloud Service Mesh administrado 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"
      }
    }
    

    Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

    Verifica que el plano de control esté activo

    Espera hasta que el controlPlaneManagement.state esté ACTIVE. Este proceso puede llevar hasta 15 minutos.

    watch -n 30 gcloud container fleet mesh describe
    

    El resultado es similar al 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 implementas la puerta de enlace de entrada, ya que los clústeres de Autopilot no aprovisionan nodos hasta que implementes una carga de trabajo.

    Implementa una puerta de enlace de entrada de la malla

    En esta sección, implementarás una puerta de enlace de entrada de la malla para controlar el tráfico entrante para la aplicación de ejemplo. Una puerta de enlace de entrada es un balanceador de cargas que opera en el perímetro de la malla y recibe conexiones HTTP/TCP entrantes o salientes.

    Implementa la puerta de enlace en un espacio de nombres dedicado y etiqueta la implementación para asegurarte de que el plano de control de Cloud Service Mesh pueda administrar y actualizar de forma automática la puerta de enlace.

    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 puerta de enlace:

      kubectl create namespace bank-gateways
      
    3. Agrega una etiqueta al espacio de nombres para que el plano de control de Cloud Service Mesh inserte de forma automática la configuración de la puerta de enlace en la implementación.

      kubectl label namespace bank-gateways istio-injection=enabled
      
    4. Implementa la puerta de enlace 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 configurar solicitudes de recursos adecuadas cuando realices la implementación en un entorno de producción. Autopilot de GKE solo considera los valores de recursos establecidos en requests y no en limits. El proyecto de Istio publica información sobre rendimiento y escalabilidad.

    Implementa la aplicación de ejemplo

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

      kubectl create namespace bank-sample
      
    2. Agrega una etiqueta al espacio de nombres para que Cloud Service Mesh inserte de forma automática proxies de sidecar en los Pods de muestra:

      kubectl label namespace bank-sample istio-injection=enabled
      
    3. Implementa 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 es 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 los recursos Gateway y VirtualService de Istio para exponer la aplicación detrás de la puerta de enlace de entrada:

      kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
      
    6. Obtén un vínculo 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 vínculo para abrir la aplicación de ejemplo. Accede con el nombre de usuario y la contraseña predeterminados para ver la aplicación.

    Aplica TLS mutua

    Asegúrate de que esté habilitado el modo de TLS mutua (mTLS) STRICT. Aplica una política PeerAuthentication predeterminada para la malla en el espacio de nombres istio-system.

    1. Guarda el siguiente 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 de PeerAuthentication en espacios de nombres específicos.

    Explora los paneles de Cloud Service Mesh

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

      Ir a Cloud Service Mesh

    2. Selecciona el proyecto en la lista desplegable de la barra de menú.

      Verás una tabla de descripción general con todos los microservicios en tu malla y una visualización gráfica de las conexiones entre los microservicios. Para cada microservicio, en la tabla se muestran tres de los SRE "Golden signals":

      • Tráfico: solicitudes por segundo
      • Tasa de error: un porcentaje
      • Latencia - milisegundos

      Estas métricas se basan en el tráfico real que controlan los microservicios. El tráfico de prueba constante se envía automáticamente al frontend por un cliente de loadgenerator implementado como parte de la aplicación de ejemplo. Cloud Service Mesh envía de forma automática métricas, registros y seguimientos (de forma opcional) a Google Cloud Observability.

    3. Haz clic en el servicio frontend de la tabla para ver un panel de descripción general del servicio. Verás las métricas adicionales para el servicio y una visualización de los estados de las conexiones entrantes y salientes. También puedes crear un Objeto de nivel de servicio (SLO) para supervisar y generar alertas sobre el servicio.

    Verifica que la mTLS esté habilitada

    Haz clic en el vínculo de seguridad en el panel para ver una descripción general de seguridad del servicio frontend. En la tabla y la visualización, se muestra un ícono de bloqueo verde para cada una de las conexiones entrantes y salientes entre microservicios. Este ícono indica que la conexión usa mTLS para la autenticación y encriptación.

    Realiza una limpieza

    Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

    Para evitar que se generen cargos en tu Google Cloud cuenta por los recursos que se usaron en este instructivo, sigue estos pasos:

    Borra el proyecto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Borra los recursos individuales

    Si usaste un proyecto existente y no quieres borrarlo, borra los recursos individuales.

    gcloud

    1. Borra la aplicación de ejemplo y las puertas de enlace:

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

    3. Borra el clúster de GKE:

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

    Terraform

    Borra los recursos que creaste con Terraform:

      terraform destroy
    

    ¿Qué sigue?