Compila una malla de servicios de varios clústeres en GKE con una arquitectura de varias redes de plano de control con varias instancias principales

Last reviewed 2019-10-29 UTC

En este instructivo, se describe cómo implementar aplicaciones en varios clústeres de Kubernetes mediante una malla de servicios de varios clústeres de Istio. Una malla de servicios de varios clústeres de Istio permite que los servicios que se ejecutan en varios clústeres de Kubernetes se comuniquen de forma segura entre sí. Los clústeres de Kubernetes pueden ejecutarse en cualquier lugar, incluso en diferentes plataformas en la nube, por ejemplo, clústeres de Google Kubernetes Engine (GKE) que se ejecutan en Google Cloud o un clúster de Kubernetes en un centro de datos local.

Este instructivo está pensado para los operadores que desean crear una malla de servicios en clústeres de GKE en varias redes. Se requiere conocimiento básico de Kubernetes, como implementaciones, servicios, entrada, etcétera. Se recomienda tener conocimiento básico de Istio, pero no es obligatorio.

Istio es una implementación de código abierto de una malla de servicios que te permite descubrir servicios que se ejecutan en clústeres de Kubernetes y enrutar y conectarte de forma segura y dinámica a ellos. Istio también proporciona un framework basado en políticas de enrutamiento, balanceo de cargas, limitación, telemetría, interrupción de circuitos, autenticación y autorización de llamadas de servicio en la malla con pocos cambios, o ninguno, en el código de tu aplicación. Cuando Istio se instala en un clúster de Kubernetes, usa el registro de servicio de Kubernetes para descubrir y crear de forma automática una malla de servicios interconectados (o microservicios) que se ejecutan en varios clústeres de GKE. Istio usa proxies de sidecar de Envoy que se ejecutan en cada pod a fin de administrar el enrutamiento y la seguridad del tráfico entre pods, y proporcionar observabilidad para todos los microservicios y cargas de trabajo que se ejecutan en el clúster.

Puede que los microservicios que se ejecutan en un clúster de Kubernetes necesiten comunicarse con microservicios que se ejecutan en otros clústeres de Kubernetes. Por ejemplo, es posible que los microservicios necesiten comunicarse entre regiones y que los propietarios de entornos o microservicios deban mantener sus propios clústeres de Kubernetes. Istio te permite crear una malla de servicios más allá de un único clúster de Kubernetes para incluir microservicios que se ejecutan en clústeres remotos y microservicios externos que se ejecutan en VM, fuera de Kubernetes.

Istio proporciona dos opciones de configuración principales para implementaciones de varios clústeres:

En una configuración de plano de control con varias instancias, cada clúster tiene su propia instalación de plano de control de Istio y cada plano de control administra su propia malla de servicios local. Puedes configurar una única malla de servicios lógica compuesta por la participación de microservicios en cada clúster, mediante puertas de enlace de Istio, una autoridad certificadora (CA) raíz común y descubrimiento de servicios automáticos en varios clústeres de GKE. Como resultado, cada clúster administra su propia malla de servicios de varios clústeres y todo el acceso entrante del clúster pasa por la puerta de enlace este-oeste de Istio. Este enfoque no tiene requisitos de herramientas de redes especiales, siempre que se pueda acceder a las puertas de enlace este-oeste de Istio en todos los clústeres.

En este instructivo, implementarás Istio en dos clústeres de GKE con la arquitectura de plano de control con varias instancias principales. En este instructivo, usarás una aplicación de microservicios de demostración llamada Online Boutique que se divide en dos clústeres de GKE. Para ver el lenguaje de cada microservicio, consulta la página README.

Debes compilar la siguiente arquitectura dentro de un proyecto de Cloud.

Istio implementada en dos clústeres de GKE con la arquitectura de plano de control múltiple

En esta arquitectura, tienes un clúster west y un clúster central en dos redes (o VPC) independientes, cada una con una puerta de enlace de este. Los clústeres se comunican con varios microservicios de forma local (en el mismo clúster) y no local (en el otro clúster).

Objetivos

  • Crear dos clústeres de GKE, west y central, en dos regiones y VPC diferentes.
  • Instalar Istio en modo de varias instancias principales en ambos clústeres de GKE
  • Instalar la aplicación Online Boutique dividida en ambos clústeres
  • Inspeccionar la malla de servicios en ambos clústeres.

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

  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 and Cloud Source Repositories 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 and Cloud Source Repositories APIs.

    Enable the APIs

Configura tu entorno

Ejecuta todos los comandos de terminal en este instructivo desde Cloud Shell.

  1. En la consola de Google Cloud, abre Cloud Shell.

    Abrir Cloud Shell

  2. Si deseas descargar los archivos necesarios para este instructivo, clona el siguiente repositorio de GitHub:

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/istio-multicluster-gke.git
    
  3. Convierte la carpeta de repositorio en tu carpeta $WORKDIR desde la que realizarás todas las tareas relacionadas con este instructivo:

    cd $HOME/istio-multicluster-gke
    WORKDIR=$(pwd)
    

    Puedes borrar la carpeta cuando termines con el instructivo.

  4. Instala kubectx/kubens:

    git clone https://github.com/ahmetb/kubectx $WORKDIR/kubectx
    export PATH=$PATH:$WORKDIR/kubectx
    

    Estas herramientas facilitan el trabajo con varios clústeres de Kubernetes, ya que cambian contextos o espacios de nombres.

Crea VPC y clústeres de GKE

En esta sección, crearás dos VPC y dos clústeres de GKE, uno en cada VPC. Necesitarás dos VPC distintas si quieres demostrar que no se necesitan requisitos de herramientas de redes adicionales para la implementación de varias instancias principales de Istio en varias redes. El tráfico de servicio a servicio entre clústeres fluye de forma segura a través de Internet. El enrutamiento de tráfico a través de la Internet pública entre clústeres ofrece las siguientes ventajas:

  • Admite direcciones IP superpuestas en clústeres. Las direcciones IP de nodo, pod y servicio pueden superponerse entre clústeres.
  • No requiere conectividad adicional entre clústeres. Tampoco requiere intercambio de tráfico, interconexión ni VPN entre redes de clústeres.
  • Permite que los clústeres existan en múltiples entornos. Esto significa que los clústeres pueden existir en Google Cloud y en centros de datos locales en los que los operadores no tengan control sobre las herramientas de redes o las direcciones IP, pero necesiten conectarse de forma segura a microservicios que se ejecutan en clústeres de Kubernetes.

Ten en cuenta que, incluso a través de clústeres, puedes ayudar a proteger la comunicación de servicio a servicio entre clústeres mediante el uso de conexiones mutuas de TLS (mTLS). Estas conexiones ayudan a evitar ataques de intermediarios mediante la verificación de los certificados válidos emitidos por Citadel.

Puedes usar direcciones IP privadas para comunicarte entre clústeres. Sin embargo, este enfoque requiere una consideración adicional de diseño de herramientas de redes. Por ejemplo, podrías incluir un direccionamiento IP que no se superponga entre todos los clústeres que participan en la malla de varios clústeres. También podrías garantizar que todos los pods puedan comunicarse a través del espacio de direcciones privado (RFC 1918), lo que significa reglas de firewall adecuadas dentro de una VPC global de Google Cloud, o dentro de una interconexión o VPN si te conectas a redes ajenas a Google Cloud. Para este instructivo, configurarás la arquitectura que se centra en la comunicación segura de servicio a servicio a través de la Internet pública, lo que te brinda una mayor flexibilidad de herramientas de redes.

  1. En Cloud Shell, crea las VPC:

    gcloud compute networks create vpc-west --subnet-mode=auto
    gcloud compute networks create vpc-central --subnet-mode=auto
    
  2. Establece la variable KUBECONFIG a fin de usar un nuevo archivo kubeconfig para este instructivo:

    export KUBECONFIG=${WORKDIR}/istio-kubeconfig
    
  3. Crea dos clústeres de GKE, uno llamado west en la zona us-west2-a en la red vpc-west, y otro llamado central en la zona us-central1-a en la red vpc-central:

    gcloud container clusters create west --zone us-west2-a \
        --machine-type "e2-standard-2" --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/compute",\
    "https://www.googleapis.com/auth/devstorage.read_only",\
    "https://www.googleapis.com/auth/logging.write",\
    "https://www.googleapis.com/auth/monitoring",\
    "https://www.googleapis.com/auth/servicecontrol",\
    "https://www.googleapis.com/auth/service.management.readonly",\
    "https://www.googleapis.com/auth/trace.append" \
        --num-nodes "4" --network "vpc-west" --async
    
    gcloud container clusters create central --zone us-central1-a \
        --machine-type "e2-standard-2" --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/compute",\
    "https://www.googleapis.com/auth/devstorage.read_only",\
    "https://www.googleapis.com/auth/logging.write",\
    "https://www.googleapis.com/auth/monitoring",\
    "https://www.googleapis.com/auth/servicecontrol",\
    "https://www.googleapis.com/auth/service.management.readonly",\
    "https://www.googleapis.com/auth/trace.append" \
        --num-nodes "4" --network "vpc-central"
    
  4. Espera unos minutos hasta que se creen ambos clústeres. Verifica que el estado de cada clúster sea RUNNING:

    gcloud container clusters list
    

    El resultado es similar al siguiente:

    NAME     LOCATION       MASTER_VERSION    MASTER_IP        MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
    central  us-central1-a  1.17.14-gke.1600  104.197.127.140  e2-standard-2  1.17.14-gke.1600  4          RUNNING
    west     us-west2-a     1.17.14-gke.1600  34.94.217.4      e2-standard-2  1.17.14-gke.1600  4          RUNNING
    
  5. Conéctate a ambos clústeres para generar entradas en el archivo kubeconfig:

    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    gcloud container clusters get-credentials west --zone us-west2-a --project ${PROJECT_ID}
    gcloud container clusters get-credentials central --zone us-central1-a --project ${PROJECT_ID}
    

    Crea un usuario y un contexto para cada clúster a fin de usar el archivo kubeconfig para crear la autenticación a los clústeres. Después de crear el archivo kubeconfig, puedes cambiar el contexto entre clústeres con rapidez.

  6. Usa kubectx a fin de cambiar el nombre de los contextos para mayor comodidad:

    kubectx west=gke_${PROJECT_ID}_us-west2-a_west
    kubectx central=gke_${PROJECT_ID}_us-central1-a_central
    
  7. Otorga a tu usuario de Google la función cluster-admin para ambos clústeres:

    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin --user=$(gcloud config get-value account) \
        --context west
    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin --user=$(gcloud config get-value account) \
        --context central
    

    Esta función te permite realizar tareas administrativas en estos clústeres.

Configura certificados en ambos clústeres

En Istio, Citadel es la autoridad certificadora (CA) de Istio y es responsable de firmar y distribuir certificados a todos los proxies Envoy (proxies de sidecar de cargas de trabajo y proxies de puerta de enlace de entrada, este-oeste y salida) en la malla de servicios. De forma predeterminada, Citadel genera un certificado raíz autofirmado y una clave, y los usa para firmar los certificados de carga de trabajo. Citadel también puede usar un certificado y una clave especificados por el operador para firmar certificados de carga de trabajo. En este instructivo, los clústeres west y central mantienen mallas de servicio separadas con servicios de Citadel independientes que firman sus respectivas cargas de trabajo.

Si deseas establecer confianza entre microservicios a través de los clústeres, ambos certificados de firma (CA) de Citadel deben estar firmados por una autoridad certificada raíz común (CA raíz). Además, las cargas de trabajo necesitan un archivo de cadena de certificado para verificar la cadena de confianza de todas las CA intermedias entre el certificado de firma de Citadel y la CA raíz. Esta configuración se realiza con un secreto en el clúster de Kubernetes. Los archivos de certificado se proporcionan como parte de este instructivo. En tu entorno de producción, puedes usar certificados generados por tus sistemas PKI o tu equipo de seguridad (por ejemplo, puedes actuar como tu propia CA). Citadel usa el secreto creado y tiene las siguientes propiedades:

  • El secreto debe llamarse cacert.
  • El secreto se crea a partir de cuatro archivos de certificado (proporcionados por el código de Istio para este instructivo), que se deben nombrar de la siguiente manera:
    • root-cert.pem contiene la CA raíz. Este archivo es el mismo para los servicios de Citadel en los clústeres west y central. Ambos certificados de Citadel están firmados por esta CA raíz.
    • ca-cert.pem y ca-key.pem son el certificado de firma (CA) y la clave privada para el servicio de Citadel. Ambos certificados de Citadel deben estar firmados por la CA raíz (root-cert.pem). ca-cert.pem se usa para firmar las cargas de trabajo dentro de cada clúster.
    • cert-chain.pem es la cadena de confianza entre los certificados de carga de trabajo y la CA raíz. En este ejemplo, cert-chain.pem contiene solo el certificado ca-cert.pem; por lo tanto, estos archivos son idénticos. Este archivo establece confianza entre microservicios que se ejecutan en clústeres.

La instalación predeterminada de Citadel establece opciones de línea de comandos para configurar la ubicación de certificados y claves en función del secreto y los nombres de archivo predefinidos que se usan en el comando, es decir, un secreto llamado cacert, un certificado raíz en un archivo llamado root-cert.pem, una clave de Citadel en ca-key.pem, y así sucesivamente.

  1. En Cloud Shell, descarga Istio:

    cd ${WORKDIR}
    export ISTIO_VERSION=1.9.0
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} TARGET_ARCH=x86_64 sh -
    cd istio-${ISTIO_VERSION}
    export PATH=$PWD/bin:$PATH
    
  2. En Cloud Shell, crea el secreto con los archivos de certificado apropiados:

    for cluster in $(kubectx)
    do
      kubectl --context $cluster create namespace istio-system
      kubectl --context $cluster create secret generic cacerts -n istio-system \
        --from-file=${WORKDIR}/istio-${ISTIO_VERSION}/samples/certs/ca-cert.pem \
        --from-file=${WORKDIR}/istio-${ISTIO_VERSION}/samples/certs/ca-key.pem \
        --from-file=${WORKDIR}/istio-${ISTIO_VERSION}/samples/certs/root-cert.pem \
        --from-file=${WORKDIR}/istio-${ISTIO_VERSION}/samples/certs/cert-chain.pem;
      done
    

Instala Istio

En esta sección, instalarás Istio en los clústeres west y central.

  1. En Cloud Shell, configurarás la red predeterminada para el clúster west.

    kubectl --context=west label namespace istio-system topology.istio.io/network=network1
    
  2. Crea la configuración de Istio para el clúster west con una puerta de enlace dedicada al este-oeste:

    cd ${WORKDIR}
    cat <<EOF > istio-west.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      values:
        global:
          meshID: mesh1
          multiCluster:
            clusterName: west
          network: network1
      components:
        ingressGateways:
          - name: istio-eastwestgateway
            label:
              istio: eastwestgateway
              app: istio-eastwestgateway
              topology.istio.io/network: network1
            enabled: true
            k8s:
              env:
                # sni-dnat adds the clusters required for AUTO_PASSTHROUGH mode
                - name: ISTIO_META_ROUTER_MODE
                  value: "sni-dnat"
                # traffic through this gateway should be routed inside the network
                - name: ISTIO_META_REQUESTED_NETWORK_VIEW
                  value: network1
              service:
                ports:
                  - name: status-port
                    port: 15021
                    targetPort: 15021
                  - name: tls
                    port: 15443
                    targetPort: 15443
                  - name: tls-istiod
                    port: 15012
                    targetPort: 15012
                  - name: tls-webhook
                    port: 15017
                    targetPort: 15017
    EOF
    
  3. Aplica la configuración al clúster west:

    istioctl install --context=west -f istio-west.yaml
    

    Presiona y para continuar.

  4. Inspecciona las implementaciones en el espacio de nombres istio-system.

    kubectl --context=west -n istio-system get deployments
    

    El resultado luce de la siguiente manera:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    istio-eastwestgateway   1/1     1            1           2m11s
    istio-ingressgateway    1/1     1            1           8m43s
    istiod                  1/1     1            1           8m56s
    
  5. Espera a que se le asigne una dirección IP externa a la puerta de enlace este-oeste:

    kubectl --context=west get svc istio-eastwestgateway -n istio-system
    

    El resultado luce de la siguiente manera:

    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                                           AGE
    istio-eastwestgateway   LoadBalancer   10.3.241.43   34.94.214.249   15021:30369/TCP,15443:30988/TCP,15012:31358/TCP,15017:32625/TCP   3m42s
    
  6. Como los clústeres se encuentran en redes separadas, deberás exponer todos los servicios (*.local) en la puerta de enlace este-oeste en ambos clústeres. Dado que la puerta de enlace este-oeste es pública en Internet, solo los servicios que tengan un certificado mTLS y un ID de carga de trabajo de confianza podrán acceder a los servicios subyacentes, como si estuvieran en la misma red.

    kubectl --context=west apply -n istio-system -f \
    ${WORKDIR}/istio-${ISTIO_VERSION}/samples/multicluster/expose-services.yaml
    
  7. Configura la red predeterminada para el clúster central.

    kubectl --context=central label namespace istio-system topology.istio.io/network=network2
    
  8. Crea la configuración de Istio para el clúster central con una puerta de enlace dedicada al este-oeste:

    cd ${WORKDIR}
    cat <<EOF > istio-central.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      values:
        global:
          meshID: mesh1
          multiCluster:
            clusterName: central
          network: network2
      components:
        ingressGateways:
          - name: istio-eastwestgateway
            label:
              istio: eastwestgateway
              app: istio-eastwestgateway
              topology.istio.io/network: network2
            enabled: true
            k8s:
              env:
                # sni-dnat adds the clusters required for AUTO_PASSTHROUGH mode
                - name: ISTIO_META_ROUTER_MODE
                  value: "sni-dnat"
                # traffic through this gateway should be routed inside the network
                - name: ISTIO_META_REQUESTED_NETWORK_VIEW
                  value: network2
              service:
                ports:
                  - name: status-port
                    port: 15021
                    targetPort: 15021
                  - name: tls
                    port: 15443
                    targetPort: 15443
                  - name: tls-istiod
                    port: 15012
                    targetPort: 15012
                  - name: tls-webhook
                    port: 15017
                    targetPort: 15017
    EOF
    
  9. Aplica la configuración al clúster central:

    istioctl install --context=central -f istio-central.yaml
    

    Presiona y para continuar.

  10. Inspecciona las implementaciones en el espacio de nombres istio-system.

    kubectl --context=central -n istio-system get deployments
    

    El resultado luce de la siguiente manera:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    istio-eastwestgateway   1/1     1            1           2m11s
    istio-ingressgateway    1/1     1            1           8m43s
    istiod                  1/1     1            1           8m56s
    
  11. Espera a que se le asigne una dirección IP externa a la puerta de enlace este-oeste:

    kubectl --context=central get svc istio-eastwestgateway -n istio-system
    

    El resultado luce de la siguiente manera:

    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                                           AGE
    istio-eastwestgateway   LoadBalancer   10.3.250.201   35.232.125.62   15021:30810/TCP,15443:31125/TCP,15012:30519/TCP,15017:30743/TCP   37s
    
  12. Expón todos los servicios (*.local) en la puerta de enlace este-oeste en el clúster central.

    kubectl --context=central apply -n istio-system -f \
    ${WORKDIR}/istio-${ISTIO_VERSION}/samples/multicluster/expose-services.yaml
    

Habilita la detección de extremos

  1. Instala un secreto remoto en el cluster west que proporcione acceso al servidor de API del cluster central.

    istioctl x create-remote-secret \
    --context=central \
    --name=central | \
    kubectl apply -f - --context=west
    
  2. Instala un secreto remoto en el cluster central que proporcione acceso al servidor de API del cluster west.

    istioctl x create-remote-secret \
    --context=west \
    --name=west | \
    kubectl apply -f - --context=central
    

Implementa la app de Online Boutique

En esta sección, instalarás la aplicación Online Boutique en ambos clústeres. Online Boutique consta de 10 microservicios escritos en diferentes lenguajes de programación. Debes dividir estos microservicios en los clústeres central y west, como se muestra en la siguiente arquitectura.

Los microservicios se dividen en los clústeres “central” y “oeste”, con mallas de servicio superpuestas. En el diagrama, servicio A

  1. Crea espacios de nombres para la app Online Boutique en ambos clústeres:

    kubectl --context central create namespace online-boutique
    kubectl --context west create namespace online-boutique
    
  2. Etiqueta los espacios de nombres para la inyección automática del proxy del archivo adicional de Istio:

    kubectl --context central label namespace online-boutique istio-injection=enabled
    kubectl --context west label namespace online-boutique istio-injection=enabled
    
  3. Implementa la app Online Bridge en los clústeres west y central:

    kubectl --context central -n online-boutique apply -f $WORKDIR/istio-multi-primary/central
    kubectl --context west -n online-boutique apply -f $WORKDIR/istio-multi-primary/west
    

    La app Online Boutique tarda unos minutos en poner en marcha todas las implementaciones.

  4. Espera hasta que todas las implementaciones estén disponibles en ambos clústeres.

    # In central cluster
    kubectl --context=central -n online-boutique wait --for=condition=available deployment emailservice --timeout=5m
    kubectl --context=central -n online-boutique wait --for=condition=available deployment checkoutservice --timeout=5m
    kubectl --context=central -n online-boutique wait --for=condition=available deployment shippingservice --timeout=5m
    kubectl --context=central -n online-boutique wait --for=condition=available deployment paymentservice --timeout=5m
    kubectl --context=central -n online-boutique wait --for=condition=available deployment adservice --timeout=5m
    kubectl --context=central -n online-boutique wait --for=condition=available deployment currencyservice --timeout=5m
    
    # In west cluster
    kubectl --context=west -n online-boutique wait --for=condition=available deployment frontend --timeout=5m
    kubectl --context=west -n online-boutique wait --for=condition=available deployment recommendationservice --timeout=5m
    kubectl --context=west -n online-boutique wait --for=condition=available deployment productcatalogservice --timeout=5m
    kubectl --context=west -n online-boutique wait --for=condition=available deployment cartservice --timeout=5m
    kubectl --context=west -n online-boutique wait --for=condition=available deployment redis-cart --timeout=5m
    kubectl --context=west -n online-boutique wait --for=condition=available deployment loadgenerator --timeout=5m
    

    El resultado de todas las implementaciones se verá de la siguiente manera:

    deployment.apps/frontend condition met
    

Accede a la aplicación de Online Boutique

Puedes acceder a la app Online Boutique desde la dirección IP pública istio-ingressgatway desde cualquiera de los clústeres.

  1. Obtén la dirección IP pública del servicio istio-ingressgateway de ambos clústeres.

    kubectl --context west get -n istio-system service istio-ingressgateway -o json | jq -r '.status.loadBalancer.ingress[0].ip'
    kubectl --context central get -n istio-system service istio-ingressgateway -o json | jq -r '.status.loadBalancer.ingress[0].ip'
    

    En el resultado, se muestra la dirección IP externa:

  2. Copia y pega la dirección IP de la puerta de enlace de entrada de Istio desde cualquier clúster en una pestaña del navegador web y, luego, actualiza la página. Verás la página principal de Online Boutique.

    Página principal de la app de Hipster que muestra imágenes de varios productos, como bicicletas, cámaras, máquinas de escribir, etcétera.

    Navega por la app, explora varios productos, colócalos en tu carrito, paga, y mucho más.

    Observa que la app Online Boutique es completamente funcional y se ejecuta en dos clústeres de Kubernetes en dos entornos.

Supervisa la malla de servicios

Puedes usar Kiali para supervisar y visualizar la malla de servicios. Kiali es una herramienta de observación de malla de servicios que se instala como parte de la instalación de Istio.

  1. Implementa Prometheus y Kiali en el clúster west.

    kubectl --context west apply -f https://raw.githubusercontent.com/istio/istio/release-${ISTIO_VERSION:0:3}/samples/addons/prometheus.yaml
    kubectl --context west apply -f https://raw.githubusercontent.com/istio/istio/release-${ISTIO_VERSION:0:3}/samples/addons/kiali.yaml
    

    Si la instalación de Kiali falla con errores, intente ejecutar el mismo comando nuevamente. Pueden existir algunos problemas de sincronización que se resolverán cuando el comando vuelva a ejecutarse.

  2. Asegúrate de que los Pods de Prometheus y Kiali estén en ejecución:

    kubectl --context west get pods -n istio-system
    

    El resultado luce de la siguiente manera:

    kiali-6d5c4bbb64-wpsqx                   1/1     Running   0          72s
    prometheus-6d87d85c88-h2cwl              2/2     Running   0          92s
    
  3. En Cloud Shell, expone Kiali en el clúster west:

    kubectl --context west port-forward svc/kiali 8080:20001 -n istio-system >> /dev/null &
    
  4. Abre la interfaz web de Kiali en el clúster west. En Cloud Shell, selecciona Vista previa en la web y, luego, Vista previa en el puerto 8080.

  5. En el menú de la izquierda, selecciona Gráfico.

  6. En la lista desplegable Seleccionar un espacio de nombres, selecciona online-boutique.

  7. En el menú Gráfico, selecciona Service graph.

  8. De manera opcional, desde el menú Display, selecciona Traffic Animation para ver como loadgenerator genera tráfico a la app.

    Captura de pantalla en la que se muestra una entrada de servicio interna con el símbolo de una cerradura junto a ella.

Instalaste con éxito una aplicación dividida en varios clústeres. Los microservicios se comunican de forma segura a través de los clústeres mediante la puerta de enlace este-oeste de Istio con mTLS. Cada clúster mantiene y controla su propio plano de control de Istio, lo que evita cualquier punto único de fallo.

Limpia

Una vez que completaste el instructivo, borra los recursos que creaste en Google Cloud a fin de que no se te cobre por ellos en el futuro. En las siguientes secciones, se describe cómo borrar estos recursos.

Borra el proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Restablece kubeconfig

  1. Restablece el archivo kubeconfig:

    unset KUBECONFIG
    rm istio-kubeconfig
    

¿Qué sigue?