Crea un clúster de GKE con Cloud Service Mesh y la CLI de gcloud

En este instructivo, aprovisionarás Cloud Service Mesh administrado con el Google Kubernetes Engine (GKE) Flota en un clúster público de GKE nuevo. En este instructivo, se explica cómo realizar las siguientes acciones:

  1. Configurar tu proyecto de Google Cloud.
  2. Crea un clúster de GKE con la cantidad mínima de CPU virtuales que requiere Cloud Service Mesh.
  3. Registra el clúster de GKE en la flota de tu proyecto.
  4. Aprovisionar la malla de servicios de Cloud administrada en el clúster mediante la API de Fleet
  5. Implementar una puerta de enlace de entrada para exponer la aplicación
  6. Implementar una aplicación de ejemplo para que puedas ver los datos de telemetría en los paneles de Cloud Service Mesh en la consola de Google Cloud.
  7. Expón y accede a la aplicación de muestra

API de Fleet

En esta guía, se da por sentado que conoces las flotas, que son agrupaciones lógicas de clústeres de GKE y otros recursos que se pueden administrar juntos. Una flota es un concepto de GKE, no un modelo de Kubernetes concepto. Registrar un clúster en una flota te permite aprovisionar Cloud Service Mesh administrado en ese clúster mediante el comando gcloud container fleet mesh update. El uso de las flotas está habilitado por la API de Fleet (gkehub.googleapis.com) que habilitas cuando comienzas este instructivo.

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 esta guía de inicio rápido, puedes borrar el clúster para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  7. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  8. Toma nota de tu ID del proyecto.

Instala las herramientas requeridas

Puedes ejecutar la herramienta en Cloud Shell o en tu máquina local. Cloud Shell instala previamente todas las herramientas necesarias.

Cloud Shell

Cloud Shell aprovisiona una máquina virtual (VM) g1-small de Compute Engine que ejecuta un sistema operativo Linux basado en Debian. Las ventajas de usar Cloud Shell son las siguientes:

  • Cloud Shell incluye gcloud, kubectl, git y otras herramientas de línea de comandos que necesitas.

  • El directorio $HOME de Cloud Shell tiene 5 GB de espacio de almacenamiento persistente.

  • Puedes elegir entre los editores de texto:

    • El editor de código, al que puedes acceder desde  en la parte superior de la ventana de Cloud Shell

    • Emacs, Vim o Nano, a los que puedes acceder desde la línea de comandos en Cloud Shell.

In the Google Cloud console, activate Cloud Shell.

Activate Cloud Shell

At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

Computadora local

  1. Asegúrate de tener instaladas las siguientes herramientas:

  2. Autentica con Google Cloud CLI

    gcloud auth login --project PROJECT_ID
    
  3. Actualiza los componentes:

    gcloud components update
    

Cree un clúster de GKE

  1. Ejecuta el siguiente comando para crear el clúster con la cantidad mínima de CPU virtuales que requiere Cloud Service Mesh. En el comando, reemplaza los marcadores de posición por la siguiente información:

    • CLUSTER_NAME: El nombre de tu clúster. El nombre solo puede contener caracteres alfanuméricos en minúsculas y -, debe comenzar con una letra y terminar con un carácter alfanumérico, además, no debe tener más de 40 caracteres.
    • PROJECT_ID: es el ID del proyecto en el que se creará el clúster.
    • CLUSTER_LOCATION: es la zona del clúster, como us-central1-a.
    gcloud container clusters create CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION \
        --machine-type=e2-standard-4 \
        --num-nodes=2 \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    La creación del clúster tarda varios minutos. Mientras se crea el clúster, el comando gcloud muestra lo siguiente:

    Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
    

    El resultado esperado en la creación correcta es similar al siguiente:

    Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done.
    Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
    To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID
    kubeconfig entry generated for CLUSTER_NAME.
    NAME: CLUSTER_NAME
    LOCATION: CLUSTER_LOCATION
    MASTER_VERSION: 1.20.10-gke.1600
    MASTER_IP: 198.51.100.1
    MACHINE_TYPE: e2-standard-4
    NODE_VERSION: 1.20.10-gke.1600
    NUM_NODES: 2
    STATUS: RUNNING
    
  2. Obtén credenciales de autenticación para interactuar con el clúster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION
    

    Resultado esperado:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. Establece el contexto actual para kubectl en el clúster.

    kubectl config set-context CLUSTER_NAME
    

    Resultado esperado:

    Context "CLUSTER_NAME" created.
    

Aprovisiona Cloud Service Mesh

Si no has cerrado esta página desde que creaste el clúster, los marcadores de posición tienen los valores que ingresaste para el comando gcloud container clusters create.

  1. Habilitar Cloud Service Mesh en la flota de tu proyecto.

    gcloud container fleet mesh enable --project PROJECT_ID
    

    El resultado es similar al siguiente:

    Waiting for Feature Service Mesh to be created...done.
    
  2. Registra el clúster en la flota del proyecto:

    gcloud container fleet memberships register CLUSTER_NAME-membership \
      --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \
      --enable-workload-identity \
      --project PROJECT_ID
    

    El resultado es similar al siguiente:

     Waiting for membership to be created...done.
     Finished registering to the Fleet.
    
  3. Aprovisiona Cloud Service Mesh administrado en el clúster con la API de Fleet:

    gcloud container fleet mesh update \
      --management automatic \
      --memberships CLUSTER_NAME-membership \
      --project PROJECT_ID
    

    El resultado es similar al siguiente:

    Waiting for Feature Service Mesh to be updated...done.
    
  4. Verifica que se haya habilitado Cloud Service Mesh administrado para el clúster y que esté listo para usarse:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Cloud Service Mesh puede tardar unos 10 minutos en aprovisionarse y estar listo para usarse en el clúster. Si ves controlPlaneManagement.state: DISABLED o controlPlaneManagement.state: PROVISIONING, deberás volver a ejecutar el comando anterior cada algunos minutos hasta que veas controlPlaneManagement.state: ACTIVE.

    El resultado es similar al siguiente:

    createTime: '2022-07-06T01:05:39.110120474Z'
    membershipSpecs:
      projects/123456789123/locations/global/memberships/your-cluster-membership:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/123456789123/locations/global/memberships/your-cluster-membership:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-07-06T01:19:24.243993678Z'
    name: projects/your-project-id/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-07-06T01:19:27.475885687Z'
    

Descarga el código de muestra

Clona el repositorio de Git que contiene el código de ejemplo que se usa en este instructivo:

   git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git

En las siguientes secciones de este instructivo, se usa una variable DIR_PATH. Configura esta variable en la ruta del repositorio anthos-service-mesh-packages que clonaste (por ejemplo, ./anthos-service-mesh-packages).

Implementa una puerta de enlace de entrada

Cloud Service Mesh te da la opción de implementar y administrar puertas de enlace como parte de tu malla de servicios. Una puerta de enlace describe un balanceador de cargas que opera en el perímetro de la malla que recibe conexiones HTTP/TCP entrantes o salientes. Las puertas de enlace son proxies de Envoy que te brindan un control detallado sobre el tráfico que entra y sale de la malla.

  1. Crea un espacio de nombres para la puerta de enlace de entrada si aún no tienes uno. Las puertas de enlace son cargas de trabajo de usuarios y, como práctica recomendada, no deben implementarse en el espacio de nombres del plano de control. Reemplaza GATEWAY_NAMESPACE por el nombre de tu espacio de nombres.

    kubectl create namespace GATEWAY_NAMESPACE
    

    Resultado esperado:

    namespace/GATEWAY_NAMESPACE created
    
  2. Habilita la inserción automática en la puerta de enlace. Los pasos necesarios dependen de si deseas usar etiquetas de inserción predeterminadas (por ejemplo, istio-injection=enabled) o la etiqueta de revisión en el espacio de nombres de la puerta de enlace. El webhook de inyector de archivo adicional usa la etiqueta de revisión predeterminada y la etiqueta de revisión predeterminadas para asociar los proxies insertados con una revisión específica del plano de control.

    Etiquetas de inserción predeterminadas

    Aplica las etiquetas de inserción predeterminadas al espacio de nombres.

    kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
    

    Etiqueta de revisión

    1. Usa el siguiente comando para encontrar la etiqueta de revisión en istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
        "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
      

      El comando genera la etiqueta de revisión que corresponde a la versión de Cloud Service Mesh, por ejemplo: asm-1187-26.

    2. Aplica la etiqueta de revisión a los espacios de nombres. En el siguiente comando, REVISION es el valor de la etiqueta de revisión istiod que anotaste en el paso anterior.

      kubectl label namespace GATEWAY_NAMESPACE \
        istio.io/rev=REVISION --overwrite
      

      Resultado esperado:

      namespace/GATEWAY_NAMESPACE labeled
      

    Puedes ignorar el mensaje "istio.io/rev" not found en el resultado. Esto significa que el espacio de nombres no tenía la etiqueta istio.io/rev, que debería aparecer en las nuevas instalaciones de Cloud Service Mesh o en implementaciones nuevas. Debido a que la inserción automática falla si un espacio de nombres tiene tanto la etiqueta istio.io/rev como la etiqueta istio-injection, todos los comandos kubectl label de la documentación de Cloud Service Mesh especifican ambas etiquetas de forma explícita.

    Si no se etiqueta el espacio de nombres de la puerta de enlace, los pods istio-ingressgateway fallarán con un error ImagePullBackOff cuando la puerta de enlace intente extraer la imagen auto. El webhook debe reemplazar esta imagen.

  3. Descarga el archivo de configuración .yaml de ejemplo de la puerta de enlace de entrada del repositorio anthos-service-mesh-packages.

  4. Aplica la configuración .yaml de la puerta de enlace de entrada de ejemplo tal como está o modifícala según sea necesario.

    kubectl apply -n GATEWAY_NAMESPACE \
      -f CONFIG_PATH/istio-ingressgateway
    

    Resultado esperado:

    deployment.apps/istio-ingressgateway created
    poddisruptionbudget.policy/istio-ingressgateway created
    horizontalpodautoscaler.autoscaling/istio-ingressgateway created
    role.rbac.authorization.k8s.io/istio-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created
    service/istio-ingressgateway created
    serviceaccount/istio-ingressgateway created
    

Obtén más información sobre las prácticas recomendadas para las puertas de enlace.

Implementa la muestra de Online Boutique

La aplicación de ejemplo de Online Boutique en el repositorio anthos-service-mesh-packages se modifica a partir del conjunto original de manifiestos en el repositorio microservices-demo. De acuerdo con las prácticas recomendadas, cada servicio se implementa en un espacio de nombres distinto con una cuenta de servicio única.

  1. Crea los espacios de nombres para la aplicación:

    kubectl apply -f \
      DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
    

    Resultado esperado:

    namespace/ad created
    namespace/cart created
    namespace/checkout created
    namespace/currency created
    namespace/email created
    namespace/frontend created
    namespace/loadgenerator created
    namespace/payment created
    namespace/product-catalog created
    namespace/recommendation created
    namespace/shipping created
    
  2. Habilita la inserción automática del sidecar (inserción automática). El comando requerido depende de si deseas usar etiquetas de inserción predeterminadas (por ejemplo, istio-injection=enabled) o la misma etiqueta de revisión que usaste para anotar el espacio de nombres de la puerta de enlace de entrada

    Etiquetas de inserción predeterminadas

    Aplica las etiquetas de inserción predeterminadas al espacio de nombres. En el siguiente comando, GATEWAY_NAMESPACE es el mismo valor que usaste para anotar el espacio de nombres de la puerta de enlace de entrada.

    for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
      kubectl label namespace $ns istio-injection=enabled istio.io/rev-
    done;
    

    Resultado esperado:

    namespace/ad labeled
    namespace/cart labeled
    namespace/checkout labeled
    namespace/currency labeled
    namespace/email labeled
    namespace/frontend labeled
    namespace/loadgenerator labeled
    namespace/payment labeled
    namespace/product-catalog labeled
    namespace/recommendation labeled
    namespace/shipping labeled
    

    Etiqueta de revisión

    Aplica la etiqueta de revisión a los espacios de nombres de la aplicación. En el siguiente comando, REVISION es el mismo valor que usaste para anotar el espacio de nombres de la puerta de enlace de entrada.

    for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
      kubectl label namespace $ns istio.io/rev=REVISION --overwrite
    done;
    

    Resultado esperado:

    namespace/ad labeled
    namespace/cart labeled
    namespace/checkout labeled
    namespace/currency labeled
    namespace/email labeled
    namespace/frontend labeled
    namespace/loadgenerator labeled
    namespace/payment labeled
    namespace/product-catalog labeled
    namespace/recommendation labeled
    namespace/shipping labeled
    
  3. Implementa la aplicación de ejemplo en el clúster.

    1. Crea las implementaciones y cuentas de servicio:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
      

      Resultado esperado:

      serviceaccount/ad created
      deployment.apps/adservice created
      serviceaccount/cart created
      deployment.apps/cartservice created
      serviceaccount/checkout created
      deployment.apps/checkoutservice created
      serviceaccount/currency created
      deployment.apps/currencyservice created
      serviceaccount/email created
      deployment.apps/emailservice created
      serviceaccount/frontend created
      deployment.apps/frontend created
      serviceaccount/loadgenerator created
      deployment.apps/loadgenerator created
      serviceaccount/payment created
      deployment.apps/paymentservice created
      serviceaccount/product-catalog created
      deployment.apps/productcatalogservice created
      serviceaccount/recommendation created
      deployment.apps/recommendationservice created
      serviceaccount/shipping created
      deployment.apps/shippingservice created
      
    2. Crea los servicios:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/services
      

      Resultado esperado:

      service/adservice created
      service/cartservice created
      service/checkoutservice created
      service/currencyservice created
      service/emailservice created
      service/frontend created
      service/frontend-external created
      service/paymentservice created
      service/productcatalogservice created
      service/recommendationservice created
      service/shippingservice created
      
    3. Crea las entradas de servicio:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
      

      Resultado esperado:

      serviceentry.networking.istio.io/allow-egress-googleapis created
      serviceentry.networking.istio.io/allow-egress-google-metadata created
      

Expón la aplicación y accede a ella

Existen varias formas de exponer la aplicación. En esta guía, usaremos la puerta de enlace de entrada que implementamos antes para hacerlo. Para conocer otras formas de exponer la aplicación Online Boutique, consulta la sección Expón y accede a la aplicación en la guía de implementación de la aplicación de muestra Online Boutique.

  1. Implementa Gateway y VirtualService para el servicio de frontend

    kubectl apply -f \
        DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
    

    Resultado esperado:

    gateway.networking.istio.io/frontend-gateway created
    virtualservice.networking.istio.io/frontend-ingress created
    
  2. Obtén la dirección IP externa de la puerta de enlace de entrada y reemplaza los marcadores de posición por la siguiente información:

    • GATEWAY_SERVICE_NAME: Es el nombre del servicio de puerta de enlace de entrada. Si implementaste la puerta de enlace de ejemplo sin modificaciones, sería istio-ingressgateway.
    • GATEWAY_NAMESPACE: Es el espacio de nombres en el que implementaste la puerta de enlace de entrada:
    kubectl get service GATEWAY_SERVICE_NAME \
        -n GATEWAY_NAMESPACE
    

    El resultado es similar al siguiente:

    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
    istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

    En este ejemplo, la dirección IP de la puerta de enlace de entrada es 35.239.7.64.

  3. Visita la aplicación en tu navegador para confirmar la instalación:

    http://EXTERNAL_IP/
    

Consulta los paneles de la malla de servicios

Después de implementar las cargas de trabajo en el clúster con los proxies de sidecar incorporados, puedes explorar las páginas de Cloud Service Mesh en la consola de Google Cloud para ver todas las funciones de observabilidad que ofrece Cloud Service Mesh. Ten en cuenta que los datos de telemetría toman uno o dos minutos en aparecer en la consola de Google Cloud después de implementar las cargas de trabajo.

El acceso a Cloud Service Mesh en la consola de Google Cloud se controla mediante la Administración de identidades y accesos (IAM). Para acceder a la en las páginas de Cloud Service Mesh, el Propietario del proyecto debe otorgar a los usuarios rol de editor o visualizador del proyecto, o los roles más restrictivos descritos en Controla el acceso a Cloud Service Mesh en la consola de Google Cloud.

  1. En la consola de Google Cloud, ve a Cloud Service Mesh.

    Ir a Cloud Service Mesh

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

  3. Si tienes más de una malla de servicios, selecciona la malla en la lista desplegable Malla de servicios.

Para obtener más información, consulta Explora Cloud Service Mesh en la consola de Google Cloud.

Limpia

Antes de limpiar, si te interesa obtener más información sobre TLS mutua, consulta Cloud Service Mesh por ejemplo: mTLS.

  • Si deseas conservar el clúster y quitar la muestra de Online Retail, realiza la siguiente acción:

    1. Borra los espacios de nombres de la aplicación:

      kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
      

      Resultado esperado:

      namespace "ad" deleted
      namespace "cart" deleted
      namespace "checkout" deleted
      namespace "currency" deleted
      namespace "email" deleted
      namespace "frontend" deleted
      namespace "loadgenerator" deleted
      namespace "payment" deleted
      namespace "product-catalog" deleted
      namespace "recommendation" deleted
      namespace "shipping" deleted
      
    2. Borra las entradas de servicio:

      kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
      

      Resultado esperado:

      serviceentry.networking.istio.io "allow-egress-googleapis" deleted
      serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
      
  • Si deseas evitar cargos adicionales, borra el clúster:

    1. Ejecuta el siguiente comando:

      gcloud container clusters delete CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION
      
    2. En el mensaje ¿Quieres continuar (y/n)?, ingresa y.

      Después de unos minutos, verás el siguiente resultado:

      Deleting cluster CLUSTER_NAME...done.
      Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
      

¿Qué sigue?