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.

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

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