Integra IAP en Anthos Service Mesh


En este instructivo, se describe cómo integrar Identity-Aware Proxy (IAP) en Anthos Service Mesh. La integración de IAP en Anthos Service Mesh te permite acceder de forma segura a los servicios según los principios de BeyondCorp de Google. IAP verifica la identidad del usuario y el contexto de la solicitud para determinar si el usuario debe tener acceso a una aplicación o un recurso. La integración de IAP en Anthos Service Mesh te brinda los siguientes beneficios:

  • Completa el control de acceso adaptado al contexto en las cargas de trabajo que se ejecutan en Anthos Service Mesh. Puedes configurar políticas de acceso detalladas según los atributos de la solicitud de origen, como la identidad del usuario, la dirección IP y el tipo de dispositivo. Puedes combinar tus políticas de acceso con restricciones según el nombre de host y la ruta de acceso de una URL de solicitud.

  • Habilita la compatibilidad con reclamaciones contextuales en la autorización de Anthos Service Mesh.

  • Proporciona acceso escalable, seguro y con alta disponibilidad a tu aplicación a través de un balanceador de cargas de Google Cloud. El balanceo de cargas de alto rendimiento proporciona protección integrada contra ataques de denegación de servicio distribuido (DSD) y compatibilidad con direcciones IP Anycast globales.

Objetivos

  • Prepárate:
    1. Configura tu proyecto de Google Cloud para otorgar los permisos y habilitar las API de Google que requiere IAP.
    2. Reserva una dirección IP estática externa y configura un nombre de dominio para usar la dirección IP que el balanceador de cargas necesita.
    3. Configura un nuevo clúster de Google Kubernetes Engine (GKE) con las opciones necesarias para integrar IAP en Anthos Service Mesh.
    4. Instala Anthos Service Mesh con las opciones necesarias para la integración.
    5. Implementar una aplicación de muestra
    6. Implementa el balanceador de cargas.
  • Habilita IAP

  • Habilita la compatibilidad con RCToken en la malla de servicios

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

Requisitos

  • Debes tener una licencia de prueba o una suscripción a Anthos. Consulta la guía de precios de Anthos para obtener más detalles.

  • El clúster de GKE debe cumplir con los siguientes requisitos:

    • Debe tener al menos cuatro nodos.
    • El tipo de máquina mínimo es e2-standard-4, que tiene cuatro CPU virtuales.
    • Usa un canal de versiones en lugar de una versión estática de GKE.
  • Para que se los incluya en la malla de servicios, los puertos de servicio deben tener un nombre, y ese nombre debe incluir el protocolo del puerto en la siguiente sintaxis: name: protocol[-suffix], en la que los corchetes indican un sufijo opcional que debe comenzar con un guion. Para obtener más información, Asigna nombres a puertos de servicio.

  • Si instalas Anthos Service Mesh en un clúster privado, debes agregar una regla de firewall para abrir el puerto 15017 si deseas usar la inserción automática del sidecar. Si no agregas la regla de firewall y la incorporación automática de sidecar está habilitada, recibirás un error cuando implementes las cargas de trabajo. Si deseas obtener más detalles sobre cómo agregar una regla de firewall, consulta Agrega reglas de firewall para casos de uso específicos.

  • Si creaste un perímetro de servicio en tu organización, es posible que debas agregar el servicio de CA de Mesh al perímetro. Para obtener más información, consulta Agrega la CA de Mesh a un perímetro de servicio.

Configura tu entorno

Para las instalaciones en Google Kubernetes Engine, puedes seguir las guías de instalación mediante Cloud Shell, una interfaz de línea de comandos en el navegador para tus recursos de Google Cloud o tu propia computadora mediante la ejecución de Linux o macOS.

Opción A: Usa 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 las herramientas de línea de comandos de gcloud, kubectl y helm 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.

Para usar Cloud Shell, sigue estos pasos:

  1. Ve a la consola de Google Cloud.
  2. Selecciona tu proyecto de Google Cloud.
  3. Haz clic en el botón Activar Cloud Shell en la parte superior de la consola de Google Cloud.

    Google Cloud Platform Console

    Se abrirá una sesión de Cloud Shell en un marco nuevo en la parte inferior de la consola de Google Cloud, que mostrará una ventana de la línea de comandos.

    Sesión de Cloud Shell

  4. Actualiza los componentes:

    gcloud components update
    

    El comando responderá con un resultado similar al siguiente:

    ERROR: (gcloud.components.update)
    You cannot perform this action because the gcloud CLI component manager
    is disabled for this installation. You can run the following command
    to achieve the same result for this installation:
    
    sudo apt-get update && sudo apt-get --only-upgrade install ...
  5. Copia el comando largo y pégalo para actualizar los componentes.

  6. Instala kubectl:

    sudo apt-get install kubectl
    
  7. Instala kpt:

    sudo apt-get install google-cloud-sdk-kpt
    

Opción B: Usa las herramientas de línea de comandos de manera local

En tu máquina local, instala e inicializa la CLI de gcloud.

  1. Autentica con Google Cloud CLI

    gcloud auth login
    
  2. Actualiza los componentes:

    gcloud components update
    
  3. Instala kubectl:

    gcloud components install kubectl
    
  4. Instala kpt:

    gcloud components install kpt
    

Configura el proyecto

  1. Obtén el ID del proyecto en el que se creará el clúster:

    gcloud

    gcloud projects list

    Consola

    1. En la consola de Google Cloud, ve a la página Panel:

      Ir a la página Panel

    2. Haz clic en la lista desplegable Seleccionar desde en la parte superior de la página. En la ventana Seleccionar una opción que aparece, elige tu proyecto.

      El ID del proyecto se muestra en la tarjeta de Información del proyecto del panel del proyecto.

  2. Crea una variable de entorno para el ID del proyecto:
    export PROJECT_ID=YOUR_PROJECT_ID
    
  3. Configura el ID del proyecto predeterminado para la herramienta de línea de comandos de gcloud:
    gcloud config set project ${PROJECT_ID}
  4. Crea una variable de entorno para el número de proyecto:
    export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")

  5. Configura las funciones de administración de identidades y accesos (IAM) requeridas. Si eres propietario del proyecto, tienes todos los permisos necesarios para completar la instalación y registrar el clúster con tu Environ. Si no eres un propietario del proyecto, necesitas que alguien te otorgue las siguientes funciones específicas de IAM. En el siguiente comando, cambia GCP_EMAIL_ADDRESS por la cuenta que usas para acceder a Google Cloud.
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
         --member user:GCP_EMAIL_ADDRESS \
         --role=roles/editor \
         --role=roles/compute.admin \
         --role=roles/container.admin \
         --role=roles/resourcemanager.projectIamAdmin \
         --role=roles/iam.serviceAccountAdmin \
         --role=roles/iam.serviceAccountKeyAdmin \
         --role=roles/gkehub.admin

    Para obtener más información sobre cómo otorgar funciones de IAM, consulta Otorga, cambia y revoca el acceso a los recursos. Si deseas obtener una descripción de estas funciones, consulta Permisos necesarios para instalar Anthos Service Mesh.

  6. Habilita las siguientes APIs:
    gcloud services enable \
        container.googleapis.com \
        compute.googleapis.com \
        monitoring.googleapis.com \
        logging.googleapis.com \
        cloudtrace.googleapis.com \
        meshca.googleapis.com \
        meshtelemetry.googleapis.com \
        meshconfig.googleapis.com \
        iamcredentials.googleapis.com \
        anthos.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        cloudresourcemanager.googleapis.com \
        iap.googleapis.com
    

    Habilitar las API puede tomar un minuto o más en completarse. Cuando las API están habilitadas, ves un resultado similar al siguiente:

    Operation "operations/acf.601db672-88e6-4f98-8ceb-aa3b5725533c" finished
    successfully.
    

Reserva una dirección IP estática y configura DNS

Para integrar Identity-Aware Proxy en Anthos Service Mesh, debes configurar un balanceador de cargas HTTP(S) de Google Cloud, que requiere un nombre de dominio que apunte a una dirección IP estática. Puedes reservar una dirección IP externa estática, que asigna la dirección a tu proyecto de forma indefinida hasta que se libere de manera explícita.

  1. Reserva una dirección IP externa estática:

    gcloud compute addresses create example-static-ip --global
    
  2. Obtén la dirección IP estática:

    gcloud compute addresses describe example-static-ip --global
    
  3. En tu registrador de nombres de dominio, configura un nombre de dominio completamente calificado (FQDN) con la dirección IP estática. Por lo general, agregas un registro A a tu configuración de DNS. Los pasos de configuración y la terminología necesarias a fin de agregar un registro A para un FQDN varían según el registrador de nombres de dominio.

  4. Establece el nombre de dominio en una variable de entorno:

    export DOMAIN_NAME=YOUR_DOMAIN_NAME

    La propagación de la configuración de DNS puede llevar entre 24 y 48 horas. Puedes seguir con los otros ajustes en este instructivo, pero no podrás probarla hasta que se propague la configuración del DNS.

Configura un clúster de GKE nuevo

Para configurar un clúster nuevo, haz lo siguiente:

  1. Selecciona una zona, un tipo de máquina y un canal de versiones de GKE para el clúster nuevo. El tipo de máquina mínimo que requiere Anthos Service Mesh es n1-standard-4. Puedes usar cualquier opción del canal de versiones.

    • Para obtener una lista de las zonas de GCP disponibles, sigue estos pasos:

      gcloud compute zones list
      
    • Para obtener una lista de los tipos de máquina, ejecuta el siguiente comando:

      gcloud compute machine-types list | more
      
  2. Crea las siguientes variables de entorno:

    • Configura el nombre del clúster:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME

      El nombre del clúster solo debe contener caracteres alfanuméricos en minúscula y el signo “-”, debe comenzar con una letra y terminar con un carácter alfanumérico y no puede tener más de 40 caracteres.

    • Establece CLUSTER_LOCATION en la zona del clúster:

      export CLUSTER_LOCATION=YOUR_ZONE
    • Establece el grupo de cargas de trabajo:

      export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog
    • Establece el ID de la malla:

      export MESH_ID="proj-${PROJECT_NUMBER}"
  3. Crea el clúster con las opciones que requiere Anthos Service Mesh. El siguiente comando crea un clúster que contiene 4 nodos de tipo de máquina n1-standard-4, que tiene 4 CPU virtuales. Este es el tipo de máquina mínimo y la cantidad de nodos necesarios para Anthos Service Mesh. Puedes especificar otro tipo de máquina siempre que tenga al menos 4 CPU virtuales y aumentar la cantidad de nodos según sea necesario para los requisitos de tu sistema.

    gcloud beta container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID} \
        --zone=${CLUSTER_LOCATION} \
        --machine-type=n1-standard-4 \
        --num-nodes=4 \
        --workload-pool=${WORKLOAD_POOL} \
        --enable-stackdriver-kubernetes \
        --subnetwork=default \
        --labels mesh_id=${MESH_ID} \
        --addons=HttpLoadBalancing \
        --release-channel=regular
    

    El comando clusters create incluye lo siguiente:

    • workload-pool=${WORKLOAD_POOL}: Habilita Workload Identity, que es la forma recomendada de acceder de forma segura a los servicios de Google Cloud desde las aplicaciones de GKE.

    • enable-stackdriver-kubernetes: Habilita Cloud Monitoring y Cloud Logging en GKE.

    • subnetwork=default: Crea una subred predeterminada.

    • labels mesh_id=${MESH_ID}: Configura la etiqueta mesh_id en el clúster, que es necesario para que las métricas se muestren en las páginas de Anthos Service Mesh en la consola de Google Cloud.

    • El complemento HttpLoadBalancing habilita un controlador de balanceo de cargas de HTTP (L7) para el clúster.

    • release-channel regular: Registra el clúster en el canal de versiones regular, aunque puedes elegir stable si necesitas mayor estabilidad o rapid si deseas probar funciones de GKE nuevas (no compatibles).

Configura credenciales y permisos

  1. Inicializa tu proyecto a fin de prepararlo para la instalación. Entre otros aspectos, este comando crea una cuenta de servicio para permitir que los componentes de Istio, como el proxy de sidecar, accedan a los datos y a los recursos del proyecto de forma segura:
    curl --request POST \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --data '' \
      https://meshconfig.googleapis.com/v1alpha1/projects/${PROJECT_ID}:initialize

    El comando responde con llaves vacías: {}.

    Si instalas una versión nueva de Anthos Service Mesh en este clúster en el futuro, no es necesario que vuelvas a ejecutar el comando, pero volver a ejecutarlo no afectará la instalación.

  2. Obtén credenciales de autenticación para interactuar con el clúster:
    gcloud container clusters get-credentials ${CLUSTER_NAME}
  3. Otorga permisos de administrador de clúster al usuario actual. Estos permisos se requieren a fin de crear las reglas de control de acceso basado en funciones (RBAC) necesarias para Anthos Service Mesh:
    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"

    Si ves el error "cluster-admin-binding" already exists, puedes ignorarlo sin problemas y continuar con la vinculación del administrador del clúster existente.

Registra tu clúster

Debes registrar tu clúster en la flota del proyecto para obtener acceso a la interfaz de usuario unificada en la consola de Google Cloud. Una flota proporciona una forma unificada de ver y administrar los clústeres y sus cargas de trabajo, incluidos los clústeres fuera de Google Cloud.

Crea una cuenta de servicio de Google Cloud y un archivo de claves

Se requiere un archivo JSON que contenga las credenciales de la cuenta de servicio para registrar un clúster. Para seguir el principio de privilegio mínimo, te recomendamos que crees una cuenta de servicio distinta para cada clúster que registres.

Para crear una cuenta de servicio y un archivo de claves, haz lo siguiente:

  1. Selecciona un nombre para la cuenta de servicio y crea una variable de entorno para ella:

    export SERVICE_ACCOUNT_NAME=SERVICE_ACCOUNT_NAME
    
  2. Crea la cuenta de servicio:

    gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME}
  3. Enumera todas las cuentas de servicio de un proyecto para confirmar que se creó la cuenta de servicio:

    gcloud iam service-accounts list
  4. Vincula la función de IAM gkehub.connect a la cuenta de servicio:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
       --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/gkehub.connect"
  5. Crea una variable de entorno para la ruta de archivo local en la que deseas guardar el archivo JSON. Te recomendamos nombrar el archivo con el nombre de la cuenta de servicio y el ID del proyecto, por ejemplo: /tmp/creds/${SERVICE_ACCOUNT_NAME}-${PROJECT_ID}.json

    export SERVICE_ACCOUNT_KEY_PATH=LOCAL_KEY_PATH
  6. Descarga el archivo JSON de claves privadas de la cuenta de servicio:

    gcloud iam service-accounts keys create ${SERVICE_ACCOUNT_KEY_PATH} \
       --iam-account=${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com

Registre el clúster

En el siguiente comando, reemplaza MEMBERSHIP_NAME por un nombre que solo represente el clúster que se registra en centro.

gcloud container hub memberships register MEMBERSHIP_NAME \
    --gke-cluster=${CLUSTER_LOCATION}/${CLUSTER_NAME} \
    --service-account-key-file=${SERVICE_ACCOUNT_KEY_PATH}

El comando responderá con un resultado similar al siguiente:

kubeconfig entry generated for CLUSTER_NAME.
Waiting for membership to be created...done.
Created a new membership [projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_NAME] for the cluster [MEMBERSHIP_NAME]
Generating the Connect Agent manifest...
Deploying the Connect Agent on cluster [MEMBERSHIP_NAME] in namespace [gke-connect]...
Deployed the Connect Agent on cluster [MEMBERSHIP_NAME] in namespace [gke-connect].
Finished registering the cluster [MEMBERSHIP_NAME] with the Hub.

Esta clave de la cuenta de servicio se almacena como un secreto llamado creds-gcp en el espacio de nombres gke-connect.

Para obtener más información sobre el registro de clústeres, consulta Cómo registrar un clúster en la documentación de Connect.

Descarga el archivo de instalación

Antes de continuar, verifica que la cuenta de servicio del plano de datos de la malla de ASM sea miembro del proyecto:

gcloud projects get-iam-policy ${PROJECT_ID} | grep -B 1 'roles/meshdataplane.serviceAgent'

Si el comando anterior no muestra nada, regresa a la sección Establece credenciales y permisos y ejecuta el comando curl.

    Linux

  1. Descarga el archivo de instalación de Anthos Service Mesh en el directorio de trabajo actual:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-linux.tar.gz
  2. Descarga el archivo de firma y usa openssl para verificar la firma:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-linux.tar.gz.1.sig
    openssl dgst -verify - -signature istio-1.5.10-asm.2-linux.tar.gz.1.sig istio-1.5.10-asm.2-linux.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    El resultado esperado es: Verified OK.

  3. Extrae el contenido del archivo a cualquier ubicación en tu sistema de archivos. Por ejemplo, para extraer el contenido en el directorio de trabajo actual, ingresa este comando:
    tar xzf istio-1.5.10-asm.2-linux.tar.gz

    El comando crea un directorio de instalación en tu directorio de trabajo actual llamado istio-1.5.10-asm.2 que contiene lo siguiente:

    • Aplicaciones de muestra en samples
    • Las siguientes herramientas del directorio bin:
      • istioctl: Usa istioctl para instalar Anthos Service Mesh.
      • asmctl: Usa asmctl para ayudar a validar la configuración de seguridad después de instalar Anthos Service Mesh. Por el momento, asmctl no es compatible con clústeres de Anthos alojados en VMware.

  4. macOS

  5. Descarga el archivo de instalación de Anthos Service Mesh en el directorio de trabajo actual:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-osx.tar.gz
  6. Descarga el archivo de firma y usa openssl para verificar la firma:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.5.10-asm.2-osx.tar.gz.1.sig istio-1.5.10-asm.2-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    El resultado esperado es: Verified OK.

  7. Extrae el contenido del archivo a cualquier ubicación en tu sistema de archivos. Por ejemplo, para extraer el contenido en el directorio de trabajo actual, ingresa este comando:
    tar xzf istio-1.5.10-asm.2-osx.tar.gz

    El comando crea un directorio de instalación en tu directorio de trabajo actual llamado istio-1.5.10-asm.2 que contiene lo siguiente:

    • Aplicaciones de muestra en samples
    • Las siguientes herramientas del directorio bin:
      • istioctl: Usa istioctl para instalar Anthos Service Mesh.
      • asmctl: Usa asmctl para ayudar a validar la configuración de seguridad después de instalar Anthos Service Mesh. Por el momento, asmctl no es compatible con clústeres de Anthos alojados en VMware.

  8. Windows

  9. Descarga el archivo de instalación de Anthos Service Mesh en el directorio de trabajo actual:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-win.zip
  10. Descarga el archivo de firma y usa openssl para verificar la firma:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.5.10-asm.2-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.5.10-asm.2-win.zip.1.sig istio-1.5.10-asm.2-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    El resultado esperado es: Verified OK.

  11. Extrae el contenido del archivo a cualquier ubicación en tu sistema de archivos. Por ejemplo, para extraer el contenido en el directorio de trabajo actual, ingresa este comando:
    tar xzf istio-1.5.10-asm.2-win.zip

    El comando crea un directorio de instalación en tu directorio de trabajo actual llamado istio-1.5.10-asm.2 que contiene lo siguiente:

    • Aplicaciones de muestra en samples
    • Las siguientes herramientas del directorio bin:
      • istioctl: Usa istioctl para instalar Anthos Service Mesh.
      • asmctl: Usa asmctl para ayudar a validar la configuración de seguridad después de instalar Anthos Service Mesh. Por el momento, asmctl no es compatible con clústeres de Anthos alojados en VMware.

  12. Asegúrate de estar en el directorio raíz de la instalación de Anthos Service Mesh.
    cd istio-1.5.10-asm.2
  13. Para mayor comodidad, agrega las herramientas que contiene el directorio /bin a tu ruta de acceso (PATH).
    export PATH=$PWD/bin:$PATH

Prepara los archivos de configuración de recursos

Cuando ejecutes el istioctl apply command para instalar Anthos Service Mesh, especifica -f istio-operator.yaml en la línea de comandos. Este archivo contiene información sobre su proyecto y clúster que se necesita para habilitar las funciones de seguridad y telemetría de Mesh. Debes descargar el archivo de configuración istio-operator.yaml y otros archivos de configuración de recursos, y configurar la información del proyecto y del clúster.

Para preparar los archivos de configuración de recursos, sigue estos pasos:

  1. Si aún no lo hiciste, instala kpt:

    gcloud components install kpt
    
  2. De forma opcional, crea un directorio nuevo para los archivos de configuración de recursos del paquete de Anthos Service Mesh. Si planeas configurar más de un clúster, puede usar el nombre del clúster como el nombre del directorio.

  3. Cambia al directorio en el que deseas descargar el paquete de Anthos Service Mesh.

  4. Descarga el paquete de Anthos Service Mesh en el directorio de trabajo actual:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.5-asm .
    

  5. Configura el nombre del clúster:

      kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}

  6. De forma opcional, personaliza los archivos de configuración de recursos con los métodos set kpt. De forma predeterminada, estos métodos set usan los valores predeterminados para gcloud config. Si estableces los valores predeterminados de gcloud config o si deseas cambiar los valores, ejecuta los siguientes métodos set:

    • Configura el ID del proyecto:

      kpt cfg set asm gcloud.core.project ${PROJECT_ID}
    • Establece la zona o región predeterminada:

      kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
  7. De forma opcional, puedes registrar los archivos de configuración de recursos en tu propio sistema de control de origen, como Cloud Source Repositories, para realizar un seguimiento de los cambios en los archivos.

Instala Anthos Service Mesh

Instala Anthos Service Mesh y configura las opciones necesarias para integrar la malla de servicios de Anthos en IAP.

PERMISSIVE de mTLS

istioctl manifest apply --set profile=asm \
  -f asm/cluster/istio-operator.yaml \
  --set values.gateways.istio-ingressgateway.type=NodePort

STRICT de mTLS

istioctl manifest apply --set profile=asm \
  -f asm/cluster/istio-operator.yaml \
  --set values.gateways.istio-ingressgateway.type=NodePort \
  --set values.global.mtls.enabled=true

Especifica NodePort para el istio-ingressgateway, que configura {[mesh_name]} a fin de abrir un puerto específico en la malla de servicios. Esto te permite configurar un balanceador de cargas, que enruta el tráfico enviado a tu nombre de dominio a este puerto. Las otras opciones habilitan la autoridad certificada de Anthos Service Mesh (CA de Mesh).

Valida la instalación

Te recomendamos que uses la herramienta de análisis asmctl para validar la configuración básica del proyecto, el clúster y las cargas de trabajo. Si una prueba asmctl falla, asmctl recomienda soluciones, si es posible. El comando asmctl validate ejecuta pruebas básicas que verifican lo siguiente:

  1. Que las API requeridas por Anthos Service Mesh estén habilitadas en el proyecto
  2. Que Istio-Ingressgateway esté configurado de forma correcta para que llame a la CA de Mesh
  3. El estado general de Istiod e Istio-Ingressgateway

Si ejecutas el comando asmctl validate con la marca opcional --with-testing-workloads, además de las pruebas básicas, asmctl ejecuta pruebas de seguridad que verifican lo siguiente:

  1. Que la comunicación mutua de TLS (mTLS) está configurada de forma correcta.
  2. Que la CA de Mesh pueda emitir certificados.

Para ejecutar las pruebas de seguridad, asmctl implementa cargas de trabajo en un espacio de nombres de prueba ubicado en tu clúster, ejecuta las pruebas de comunicación de mTLS, muestra los resultados y borra el espacio de nombres de prueba.

Para ejecutar asmctl, sigue estos pasos:

  1. Asegúrate de que las credenciales predeterminadas de la aplicación de gcloud estén configuradas:

     gcloud auth application-default login
    
  2. Si aún no lo hiciste, obtén las credenciales de autenticación para interactuar con el clúster:

     gcloud container clusters get-credentials ${CLUSTER_NAME}
    
  3. Para ejecutar pruebas básicas y de seguridad (en el caso de que istio-1.5.10-asm.2/bin esté en tu PATH), ejecuta este comando:

    asmctl validate --with-testing-workloads
    

    Si se ejecuta de forma correcta, el comando responde con un resultado similar al siguiente:

    [asmctl version 0.3.0]
    Using Kubernetes context: example-project_us-central1-example-cluster
    To change the context, use the --context flag
    Validating enabled APIs
    OK
    Validating ingressgateway configuration
    OK
    Validating istio system
    OK
    Validating sample traffic
    Launching example services...
    Sent traffic to example service http code: 200
    verified mTLS configuration
    OK
    Validating issued certs
    OK
    

Implementa una aplicación de muestra

Antes de habilitar IAP, necesitas una aplicación que se ejecute en tu clúster de GKE para que puedas verificar que todas las solicitudes tengan una identidad. En esta guía, se usa el ejemplo de Bookinfo para demostrar cómo configurar el balanceador de cargas de HTTP(S) y habilitar IAP.

Inicia los servicios de la aplicación

  1. Cambia el directorio a la raíz del directorio de instalación de Anthos Service Mesh.

  2. Etiqueta el espacio de nombres default para usar la inserción automática del sidecar:

    kubectl label namespace default istio-injection=enabled
    
  3. Implementa la aplicación:

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    
  4. Confirma que se estén ejecutando todos los servicios de bookinfo:

    kubectl get services
    

    El resultado esperado es similar al siguiente:

    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31            9080/TCP             6m
    kubernetes                 10.0.0.1             443/TCP              7d
    productpage                10.0.0.120           9080/TCP             6m
    ratings                    10.0.0.15            9080/TCP             6m
    reviews                    10.0.0.170           9080/TCP             6m
  5. Confirma que se estén ejecutando todos los pods:

    kubectl get pods
    

    El resultado esperado es similar al siguiente:

    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  6. Confirme que la aplicación Bookinfo esté en ejecución:

    kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
    

    Resultado esperado:

    <title>Simple Bookstore App</title>
  7. Define la puerta de enlace de entrada y el servicio virtual para la aplicación:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    
  8. Confirma que se creó la puerta de enlace:

    kubectl get gateway
    

    El resultado esperado es similar al siguiente:

    NAME                AGE
    bookinfo-gateway    32s

Solicitudes externas

El recurso de puerta de enlace de Bookinfo (definido en samples/bookinfo/networking/bookinfo-gateway.yaml) usa istio-ingressgateway preconfigurado. Recuerda que cuando implementaste Anthos Service Mesh, especificaste NodePort para istio-ingressgateway, que abre un puerto específico en la malla de servicios. Hasta que no configures el balanceador de cargas, no podrás acceder a la aplicación Bookinfo fuera de tu clúster de GKE (como desde un navegador). Aunque los nodos de tu clúster tienen direcciones IP externas, las reglas de firewall de Google Cloud bloquean las solicitudes que provienen de afuera del clúster. Con IAP, la forma correcta de exponer esta aplicación en la Internet pública es mediante un balanceador de cargas. No expongas las direcciones del nodo mediante reglas de firewall, que podrían omitir IAP.

Para enrutar solicitudes a Bookinfo, configura un balanceador de cargas HTTP(S) en tu proyecto de Google Cloud. Debido a que el balanceador de cargas está en tu proyecto, está dentro del firewall y puede acceder a los nodos en tu clúster. Después de configurar el balanceador de cargas con la dirección IP estática y tu nombre de dominio, puedes enviar solicitudes al nombre de dominio, y el balanceador de cargas reenviará las solicitudes a los nodos del clúster.

Implementa el balanceador de cargas

Puedes usar un recurso Ingress para crear un balanceador de cargas de HTTP(S) con certificados SSL configurados de forma automática. Los certificados SSL administrados por Google se aprovisionan, renuevan y administran para tu dominio.

  1. Crea un recurso ManagedCertificate. Este recurso especifica el dominio para el certificado SSL. La lista spec.domains debe contener solo un dominio. No se admiten dominios comodines.

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.gke.io/v1beta1
    kind: ManagedCertificate
    metadata:
      name: example-certificate
      namespace: istio-system
    spec:
      domains:
        - ${DOMAIN_NAME}
    EOF
  2. Crea el balanceador de cargas mediante la definición del recurso Ingress.

    • Configura la anotación networking.gke.io/managed-certificates con el nombre del certificado que creaste en el paso anterior, example-certificate.

    • Configura la anotación kubernetes.io/ingress.global-static-ip-name con el nombre de la dirección IP estática que reservaste, example-static-ip.

    • Configura serviceName como istio-ingressgateway, que se usa en el recurso Gateway para la muestra de Bookinfo.

    cat <<EOF | kubectl create -f -
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example-ingress
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.global-static-ip-name: example-static-ip
        networking.gke.io/managed-certificates: example-certificate
    spec:
      backend:
        serviceName: istio-ingressgateway
        servicePort: 80
    EOF
  3. En la consola de Google Cloud, ve a la página Kubernetes Engine > Ingress y servicios.

    Ir a la página Ingress y Service

    Deberías ver el mensaje “Creando Ingress” en la columna Estado. Espera a que GKE aprovisione por completo el Ingress antes de continuar. Actualiza la página cada pocos minutos para obtener el estado más actualizado del Ingress. Después de aprovisionar el Ingress, es posible que veas el estado “Ok” o el error “Todos los servicios de backend están en EN MAL ESTADO”. Uno de los recursos que GKE aprovisiona es una verificación de estado predeterminada. Si ves el mensaje de error, significa que se aprovisiona el Ingress y que se ejecutó la verificación de estado predeterminada. Cuando veas el estado “Ok” o el error, continúa con la siguiente sección para configurar las verificaciones de estado del balanceador de cargas.

Configura las verificaciones de estado para el balanceador de cargas.

Para configurar las verificaciones de estado, debes obtener el ID de la verificación de estado predeterminada creada por el Ingress y, luego, actualizar la verificación de estado a fin de usar la ruta de acceso y el puerto de verificación de estado de istio-ingress.

  1. Obtén credenciales de usuario nuevas para usar con las credenciales predeterminadas de la aplicación:

      gcloud auth application-default login

  2. Para obtener el ID de la verificación de estado predeterminada creada por el Ingress, sigue estos pasos:

    1. Configura las siguientes variables de entorno:

      • Servicio de backend: Conecta varios grupos de instancias en un servicio NodePort determinado.

        BACKEND_SERVICE=$(gcloud compute url-maps list | grep example-ingress | awk '{print $2}' | cut -d'/' -f 2)

      • Verificación de estado: Esta es la verificación de estado predeterminada que se crea de forma automática cuando se implementa el Ingress.

        HC=$(gcloud compute backend-services describe ${BACKEND_SERVICE} --global | grep healthChecks | cut -d'/' -f 10 | tail -n 1)

      • Puerto de entrada de la verificación de estado: Este es el puerto de verificación de estado de istio-ingress.

        export HC_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')

      • Ruta de acceso de la verificación de estado de la entrada: Esta es la ruta de la verificación de estado de istio-ingress.

        export HC_INGRESS_PATH=$(kubectl -n istio-system get deployments istio-ingressgateway -o jsonpath='{.spec.template.spec.containers[?(@.name=="istio-proxy")].readinessProbe.httpGet.path}')

      • API de verificación de estado: Esta es la API a la que llamas para configurar la verificación de estado.
        export HC_API=https://compute.googleapis.com/compute/v1/projects/${PROJECT_ID}/global/healthChecks/${HC}

    2. Obtén la verificación de estado predeterminada en un archivo JSON mediante una llamada a la API de healthChecks:

      curl --request GET  --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" ${HC_API} > health_check.json
  3. Actualiza la verificación de estado para usar la ruta de acceso y el puerto de verificación de estado de istio-ingress:

    1. Actualiza el archivo health_check.json de la siguiente manera:

      • Establece httpHealthCheck.port con el valor ${HC_INGRESS_PORT}.
      • Establece httpHealthCheck.requestPath con el valor ${HC_INGRESS_PATH}.
      • Agrega el siguiente atributo y configúralo en una string vacía: httpHealthCheck.portSpecification="".

      La manera más fácil de hacerlo es usar jq, que viene preinstalado en Cloud Shell:

      jq ".httpHealthCheck.port=${HC_INGRESS_PORT} | .httpHealthCheck.requestPath=\"${HC_INGRESS_PATH}\" | .httpHealthCheck.portSpecification=\"\"" health_check.json > updated_health_check.json

      Si ejecutas cat en el archivo updated_health_check.json resultante, el resultado será similar al siguiente:

      {
      "id": "5062913090021441698",
      "creationTimestamp": "2019-11-12T10:47:41.934-08:00",
      "name": "${HC}",
      "description": "Default kubernetes L7 Loadbalancing health check.",
      "checkIntervalSec": 60,
      "timeoutSec": 60,
      "unhealthyThreshold": 10,
      "healthyThreshold": 1,
      "type": "HTTP",
      "httpHealthCheck": {
        "port": 32394,
        "requestPath": "/healthz/ready",
        "proxyHeader": "NONE",
        "portSpecification": ""
      },
      "selfLink": "https://www.googleapis.com/compute/v1/projects/${PROJECT_ID}/global/healthChecks/${HC}",
      "kind": "compute#healthCheck"
      }
      

      Si editaste el archivo JSON de forma manual en lugar de usar el comando jq, guarda el archivo como updated_health_check.json para que coincida con el nombre del archivo en el siguiente comando.

    2. Actualiza la verificación de estado:

      curl --request PATCH --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" --header "Content-Type: application/json" --data @updated_health_check.json ${HC_API}

    GKE se tomará varios minutos para actualizar la verificación de estado. En la consola de Google Cloud, actualiza la página Kubernetes Engine > Ingress y servicios cada minuto aproximadamente hasta que el estado del Ingress cambie a “Ok”.

  4. Prueba el balanceador de cargas. Apunta el navegador con el siguiente comando:

    http://YOUR_DOMAIN_NAME/productpage

    En el ejemplo anterior, YOUR_DOMAIN_NAME es el nombre de dominio que configuraste con la dirección IP estática externa.

    Deberías ver la productpage de la aplicación Bookinfo. Si actualizas la página varias veces, deberías ver diferentes reseñas, en un estilo round robin: estrellas rojas, estrellas negras, sin estrellas.

    También debes probar el acceso de https a Bookinfo.

Habilita IAP

En los siguientes pasos, se describe cómo habilitar IAP.

  1. Para verificar si ya tienes una marca existente, usa el comando list. Solo puedes tener una marca por proyecto.

    gcloud iap oauth-brands list
    

    El siguiente es un ejemplo de respuesta de gcloud, si la marca existe:

    name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID]
    applicationTitle: [APPLICATION_TITLE]
    supportEmail: [SUPPORT_EMAIL]
    orgInternalOnly: true
    
  2. Si no existe una marca, usa el comando create:

    gcloud iap oauth-brands create --application_title=APPLICATION_TITLE --support_email=SUPPORT_EMAIL
    

    Los campos anteriores son obligatorios cuando se llama a esta API:

    • supportEmail: Es el correo electrónico de asistencia que se muestra en la pantalla de consentimiento de OAuth. Esta dirección de correo electrónico puede ser la dirección de un usuario o un alias de Grupos de Google. Si bien las cuentas de servicio también tienen una dirección de correo electrónico, no son direcciones de correo electrónico válidas reales y no se pueden usar cuando se crea una marca. Sin embargo, una cuenta de servicio puede ser propietaria de un Grupo de Google. Crea un Grupo de Google nuevo o configura un grupo existente y configura la cuenta de servicio deseada como propietaria del grupo.

    • applicationTitle: Es el nombre de la aplicación que se muestra en la pantalla de consentimiento de OAuth.

    La respuesta contiene los siguientes campos:

    name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID]
    applicationTitle: [APPLICATION_TITLE]
    supportEmail: [SUPPORT_EMAIL]
    orgInternalOnly: true
    

Crea un cliente de OAuth para IAP

  1. Usa el comando create para crear un cliente. Usa la marca name del paso anterior:

    gcloud iap oauth-clients create projects/PROJECT_NUMBER/brands/BRAND-ID --display_name=NAME
    

    La respuesta contiene los siguientes campos:

    name: projects/[PROJECT_NUMBER]/brands/[BRAND_NAME]/identityAwareProxyClients/[CLIENT_ID]
    secret: [CLIENT_SECRET]
    displayName: [NAME]
    

Activa IAP para el servicio

Usa el siguiente comando a fin de activar IAP para tu servicio. Reemplaza CLIENT_ID y CLIENT_SECRET por tu ID de cliente de OAuth y el secreto del cliente que creaste antes.

gcloud beta iap web enable \
    --oauth2-client-id=CLIENT_ID \
    --oauth2-client-secret=CLIENT_SECRET \
    --resource-type=backend-services \
    --service=${BACKEND_SERVICE}

Configura la lista de acceso de IAP

Agrega un usuario a la política de acceso de IAP:

gcloud beta iap web add-iam-policy-binding \
    --member=user:EMAIL_ADDRESS \
    --role=roles/iap.httpsResourceAccessor \
    --resource-type=backend-services \
    --service=$BACKEND_SERVICE

En el ejemplo anterior, EMAIL_ADDRESS es la dirección de correo electrónico completa del usuario, como alice@example.com.

Habilita la compatibilidad con RCToken en la malla de servicios

De forma predeterminada, IAP genera un token web JSON (JWT) con alcance para el cliente de OAuth. Para Anthos Service Mesh, puedes configurar IAP a fin de generar un RequestContextToken (RCToken), que es un JWT pero con un público configurable. Los RCToken te permiten configurar el público del JWT en una string arbitraria, que se puede usar en las políticas de Anthos Service Mesh para obtener una autorización detallada.

Para configurar el RCToken, haz lo siguiente:

  1. Crea una variable de entorno para tu número de proyecto. Este es el número que se generó y asignó de forma automática a tu proyecto cuando lo creaste (no es lo mismo que el ID del proyecto):

    export PROJECT_NUMBER=YOUR_PROJECT_NUMBER
  2. Crea una variable de entorno para el público del RCToken. Puede ser cualquier string que desees:

    export RCTOKEN_AUD="your-rctoken-aud"
    
  3. Recupera la configuración de IAP:

    gcloud beta iap settings get --format json \
    --project=${PROJECT_NUMBER} --resource-type=compute \
    --service=${BACKEND_SERVICE} > iapSettings.json
    
  4. Actualiza IapSettings con el público del RCToken:

    cat iapSettings.json | jq --arg RCTOKEN_AUD_STR $RCTOKEN_AUD \
    '. + {applicationSettings: {csmSettings: {rctokenAud: $RCTOKEN_AUD_STR}}}' \
    > updatedIapSettings.json
    
    gcloud beta iap settings set updatedIapSettings.json --format json \
    --project=${PROJECT_NUMBER} --resource-type=compute --service=${BACKEND_SERVICE}
    
  5. Habilita la autenticación de RCToken en la puerta de enlace de entrada de Istio:

    cat <<EOF | kubectl apply -f -
    apiVersion: "authentication.istio.io/v1alpha1"
    kind: "Policy"
    metadata:
      name: "ingressgateway"
      namespace: istio-system
    spec:
      targets:
      - name: "istio-ingressgateway"
      origins:
      - jwt:
          issuer: "https://cloud.google.com/iap"
          jwksUri: "https://www.gstatic.com/iap/verify/public_key-jwk"
          audiences:
          - "$RCTOKEN_AUD"
          jwt_headers:
          - "ingress-authorization"
          trigger_rules:
          - excluded_paths:
            - exact: /healthz/ready
      principalBinding: USE_ORIGIN
    EOF
  6. Asegúrate de que las solicitudes a la productpage de Bookinfo aún tengan éxito:

    http://DOMAIN_NAME/productpage

Para probar la política, haz lo siguiente:

  1. Crea un objeto de solicitud IapSettings, pero establece rctokenAud en una string diferente:

    echo $(cat <<EOF
    {
       "name": "projects/${PROJECT_NUMBER}/iap_web/compute/services/${BACKEND_SERVICE}",
       "applicationSettings": {
         "csmSettings": {
           "rctokenAud": "some-other-arbitrary-string"
         }
       }
     }
    EOF
    ) > request.txt
  2. Llama a la API de IapSettings para configurar el público del RCToken:

    curl --request PATCH --header "Authorization: Bearer $(gcloud beta auth application-default print-access-token)" ${IAP_SETTINGS_API}
  3. Realiza una solicitud a la productpage de Bookinfo, que debería fallar:

    http://DOMAIN_NAME/productpage

Realice una limpieza

Después de completar este instructivo, quita los siguientes recursos para evitar que se realicen cargos no deseados en tu cuenta:

  1. Borra el certificado administrado:

    kubectl delete managedcertificates example-certificate
  2. Borra el Ingress, lo que quita la asignación de los recursos del balanceo de cargas:

    kubectl -n istio-system delete ingress example-ingress

  3. Borra la dirección IP estática:

    gcloud compute addresses delete example-static-ip --global

    Si haces esto, asegúrate de borrar la dirección IP del registrador de tu dominio.

  4. Borra el clúster, lo que borrará los recursos que conforman el clúster, como las instancias de procesamiento, los discos y los recursos de red:

    gcloud container clusters delete ${CLUSTER_NAME}