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 generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar 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. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

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

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

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

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

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 de Google 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

    kubectl apply -n bank-gateways \
        -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateway 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 consola de Google Cloud, ve a Cloud Service Mesh para ver los paneles de ta 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.

Limpia

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 cuenta de Google Cloud 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 --region us-central1 asm-cluster --quiet
    

Terraform

Borra los recursos que creaste con Terraform:

  terraform destroy

¿Qué sigue?