Usa Istio con Google Compute Engine

Istio es un marco de trabajo de código abierto para conectar, supervisar y proteger microservicios. Te permite crear una red o “malla” de servicios implementados con balanceo de cargas, autenticación de servicio a servicio, supervisión y mucho más, sin requerir ningún cambio en el código de servicio. Debes agregar la asistencia de Istio a los servicios mediante la implementación de un proxy especial de archivo adicional Envoy en cada uno de los pods de tu aplicación. El proxy Envoy intercepta toda la comunicación de red entre microservicios y se configura y administra mediante la funcionalidad del plano de control de Istio.

En la actualidad, el plano de control de Istio solo se puede instalar en implementaciones de Kubernetes como Google Kubernetes Engine, pero su característica de expansión de malla significa que puedes agregar servicios que se ejecuten en plataformas que no sean de Kubernetes en la malla de servicios, incluidos los que se ejecuten en VM de Compute Engine. Esto te permite controlar los servicios de Kubernetes y VM como una sola malla. En este instructivo, se muestra cómo configurar Istio para usar la expansión de malla y configurar las VM de Compute Engine de modo que se puedan agregar a una malla de Istio. Se supone que ya tienes una instalación de Istio existente en Kubernetes Engine.

Puedes encontrar mucha más información sobre Istio y su funcionamiento en su propio sitio web en istio.io. Si te interesa averiguar cómo funciona la configuración de expansión de malla usada en este instructivo, consulta la sección sobre cómo funciona, aunque no necesitas leer esto para completar el instructivo.

Objetivos

  • Actualizar una instalación existente de Istio en Kubernetes Engine para usar la expansión de malla
  • Configurar las VM de Compute Engine para unirse en una malla de servicios de Istio
  • Ejecutar un servicio de malla de Istio en una VM de Compute Engine

Costos

En este instructivo, se usan componentes facturables de Cloud Platform, incluido Compute Engine.

Los usuarios nuevos de Cloud Platform podrían calificar para una prueba gratuita.

Antes de comenzar

  • Debes tener una instalación de Istio existente en Kubernetes Engine: puedes averiguar cómo realizar la instalación, además de la configuración y los requisitos relevantes, en Instala Istio en Google Kubernetes Engine.
  • Debes tener la aplicación de muestra BookInfo instalada y en ejecución como se describe en Instala Istio en Google Kubernetes Engine, además de tener istioctl en tu PATH.
  • Debes tener suficiente cuota de servicio de backend y dirección IP para ejecutar cuatro balanceadores de cargas internos (un balanceador de cargas y una dirección IP cada uno) y el servicio de entrada de BookInfo (un balanceador de cargas y una dirección IP) del instructivo anterior.
  • Asegúrate de que tu contexto de kubectl esté establecido en tu clúster de Istio.

    kubectl config current-context              # Display the current-context
    kubectl config use-context [CLUSTER_NAME]   # set the default context to [CLUSTER_NAME]
    

Establece valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo en la escritura de las opciones de tu ID del proyecto y de la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Configura la malla para la expansión

El primer paso cuando se agregan servicios que no son de Kubernetes a una malla de Istio es configurar la instalación de Istio y generar los archivos de configuración que permitirán que las VM de Compute Engine lo usen. Tu descarga de Istio incluye una secuencia de comandos para ayudar con esto en Kubernetes Engine: la encontrarás en /install/tools/setupMeshEx.sh. Sigue estos pasos en la máquina en la que tienes tu directorio de instalación de Istio y tus credenciales de clúster: esta es tu máquina de administración de clústeres.

  1. Usa la implementación de mesh-expansion proporcionada a fin de configurar balanceadores de cargas internos para Pilot, Mixer, la autoridad certificada de Istio y el servidor DNS de Kubernetes. Esto garantiza que las VM podrán acceder a estos servicios.

    kubectl apply -f install/kubernetes/mesh-expansion.yaml
    
  2. Confirma que los servicios están en funcionamiento y que todos los ILB tienen valores de EXTERNAL-IP (es posible que debas esperar un minuto) antes de continuar con el siguiente paso:

    $ kubectl -n istio-system get services
    NAME              TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                                  AGE
    istio-ca-ilb      LoadBalancer   10.47.245.69    10.150.0.9       8060:32174/TCP                                           3m
    istio-egress      ClusterIP      10.47.252.251   <none>           80/TCP                                                   7m
    istio-ingress     LoadBalancer   10.47.254.41    35.197.249.113   80:31822/TCP,443:30637/TCP                               7m
    istio-mixer       ClusterIP      10.47.244.179   <none>           9091/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP   8m
    istio-pilot       ClusterIP      10.47.241.19    <none>           8080/TCP,443/TCP                                         7m
    istio-pilot-ilb   LoadBalancer   10.47.243.136   10.150.0.6       8080:30064/TCP                                           3m
    mixer-ilb         LoadBalancer   10.47.242.213   10.150.0.8       9091:31278/TCP                                           3m
  3. Desde el directorio de instalación de Istio, usa la secuencia de comandos auxiliar para generar la configuración cluster.env de Istio que se implementará en las VM y especifica tu propio nombre de clúster. Este archivo contiene los rangos de direcciones IP del clúster que deben interceptarse.

    install/tools/setupMeshEx.sh generateClusterEnv [CLUSTER_NAME]
    

    Esto crea un archivo con una sola línea como se muestra a continuación:

    $ cat cluster.env
    ISTIO_SERVICE_CIDR=10.63.240.0/20
  4. Ahora usa la misma secuencia de comandos para generar el archivo de configuración de DNS que se usará en las VM. Esto permitirá que las apps de la VM de Compute Engine resuelvan los nombres de los servicios del clúster mediante dnsmasq, que se interceptará mediante el archivo adicional y se reenviará.

    install/tools/setupMeshEx.sh generateDnsmasq
    

    Ejemplo de archivo generado:

    $ cat kubedns
    server=/svc.cluster.local/10.150.0.7
    address=/istio-mixer/10.150.0.8
    address=/istio-pilot/10.150.0.6
    address=/istio-ca/10.150.0.9
    address=/istio-mixer.istio-system/10.150.0.8
    address=/istio-pilot.istio-system/10.150.0.6
    address=/istio-ca.istio-system/10.150.0.9

Configura una VM de expansión de malla

Una vez que configures la malla y generes los archivos de configuración relevantes, el siguiente paso es configurar las VM de Compute Engine para unirse a la malla, lo que incluye la copia de tus archivos generados a las VM. A los fines de este instructivo, puedes volver a usar la secuencia de comandos setupMeshEx.sh provista para copiar archivos y configurar la máquina. Sin embargo, cuando agregues tus propias VM a una aplicación de malla real, debes seguir los pasos de forma manual para integrarlas en tus propios flujos de trabajo y aprovisionamientos. Puedes encontrar los pasos detallados en la guía de expansión de malla de Istio y ver la secuencia de comandos que ejecuta setupMeshEx.sh en cada VM en /install/tools/setupIstioVM.sh.

  1. Primero, asegúrate de tener una VM de Compute Engine para usar como máquina de expansión de malla en el mismo proyecto y red que tu instalación de Istio. Si aún no tienes una, créala:

    gcloud compute instances create istio-vm
    
  2. Istio puede administrar servicios en múltiples espacios de nombres de Kubernetes: en este ejemplo, colocarás el servicio de VM (aunque no está en Kubernetes) en el espacio de nombres vm, porque es allí donde lo buscarán las reglas de enrutamiento de BookInfo proporcionadas. El uso de diferentes espacios de nombres de esta forma te ayuda a mantener tus servicios de VM separados de tus servicios regulares de Kubernetes. Para usar un espacio de nombres no predeterminado en una máquina de expansión de malla, debes especificarlo antes de ejecutar las secuencias de comandos de configuración. En el directorio de instalación de Istio en tu máquina de administración del clústeres, primero configura la variable SERVICE_NAMESPACE:

    export SERVICE_NAMESPACE=vm
    

    Luego, crea el espacio de nombres:

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. En la misma máquina de administración de clústeres, ejecuta el siguiente comando con la secuencia de comandos de configuración setupMeshEx.sh. Esto realiza lo siguiente:

    • Copia a la VM los archivos generados y la secuencia de comandos de configuración de la VM.
    • Realiza y verifica la configuración de DNS para que la VM pueda conectarse a los componentes de Istio.
    • Copia los secretos de autenticación de Istio en la VM.
    • Instala los archivos Debian de Istio en la VM, incluido el proxy de archivo adicional de Istio.
    install/tools/setupMeshEx.sh machineSetup istio-vm
  4. Ingresa mediante SSH a la VM de Compute Engine con gcloud o cualquier otra opción de la página Detalles de la instancia de VM en Console, que encontrarás vinculada desde tu página Instancias de VM:

    gcloud compute ssh istio-vm
    
  5. En la VM de Compute Engine, verifica que la máquina configurada pueda acceder a los servicios que se ejecutan en el clúster de Kubernetes Engine. Por ejemplo, si ejecutas en el clúster de Kubernetes Engine el ejemplo de BookInfo de Instala Istio en Google Kubernetes Engine, deberías poder acceder al servicio de productpage con curl desde la VM, como en el ejemplo siguiente:

    $ curl -v -w "\n" http://productpage.default.svc.cluster.local:9080/api/v1/products/0/ratings
    *   Trying 10.63.251.156...
    * Connected to productpage.default.svc.cluster.local (10.63.251.156) port 9080 (#0)
    > GET /api/v1/products/0/ratings HTTP/1.1
    > Host: productpage.default.svc.cluster.local:9080
    > User-Agent: curl/7.47.0
    > Accept: /
    >
    < HTTP/1.1 200 OK
    < content-type: application/json
    < content-length: 54
    < server: envoy
    < date: Sun, 15 Oct 2017 00:04:49 GMT
    < x-envoy-upstream-service-time: 17
    <

    • Connection #0 to host productpage.default.svc.cluster.local left intact {"ratings": {"Reviewer2": 4, "Reviewer1": 5}, "id": 0}
  6. Observa el uso de default en la URL de la página del producto aquí, ya que el ejemplo de BookInfo se creó en el espacio de nombres predeterminado en el instructivo anterior; si eliges usar un espacio de nombres diferente, sustitúyelo aquí.

  7. En la VM, verifica que los procesos de Istio estén en ejecución:

    $ sudo systemctl status istio-auth-node-agent
    istio-auth-node-agent.service - istio-auth-node-agent: The Istio auth node agent
      Loaded: loaded (/lib/systemd/system/istio-auth-node-agent.service; disabled; vendor preset: enabled)
      Active: active (running) since Fri 2017-10-13 21:32:29 UTC; 9s ago
      Docs: http://istio.io/
    Main PID: 6941 (node_agent)
      Tasks: 5
      Memory: 5.9M
      CPU: 92ms
      CGroup: /system.slice/istio-auth-node-agent.service
              └─6941 /usr/local/istio/bin/node_agent --logtostderr
    
    Oct 13 21:32:29 demo-vm-1 systemd[1]: Started istio-auth-node-agent: The Istio auth node agent.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469314    6941 main.go:66] Starting Node Agent
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469365    6941 nodeagent.go:96] Node Agent starts successfully.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.483324    6941 nodeagent.go:112] Sending CSR (retrial #0) ...
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.862575    6941 nodeagent.go:128] CSR is approved successfully. Will renew cert in 29m59.137732603s

Ejecuta un servicio en una máquina de expansión de malla

Ahora veamos qué necesitas hacer para ejecutar un servicio en una máquina de expansión de malla. En este ejemplo, extenderás el ejemplo de BookInfo de Instala Istio en Google Kubernetes Engine con una base de datos de calificaciones de MySQL que se ejecuta en una VM de Compute Engine mediante la VM que configuraste en la sección anterior.

  1. Asegúrate de que istio-vm se configuró como una VM de expansión de malla para el clúster en el que se ejecuta BookInfo, como se describió antes.

  2. Instala un servidor MySQL en la VM de Compute Engine:

    sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
    
  3. A los fines de este instructivo (no hagas esto en la vida real), configura el servidor MySQL para que el usuario “root” tenga la contraseña “password”:

    sudo mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'; flush privileges"
    
  4. Luego, usa el esquema mysqldb-init.sql proporcionado para configurar la base de datos de calificaciones de BookInfo.

    curl https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/src/mysql/mysqldb-init.sql| mysql -u root --password=password -h 127.0.0.1
    
  5. Luego, registra el servicio nuevo con tu instalación de Istio mediante istioctl. Primero, obtén la dirección IP interna principal de la VM (la verás en la página Detalles de la instancia de VM en Console o mediante hostname --ip-address). Luego, en tu máquina de administración de clústeres, ejecuta el siguiente comando con la dirección IP adecuada:

    $ istioctl register -n vm mysqldb 10.150.0.5 3306
    I1014 22:54:12.176972   18162 register.go:44] Registering for service 'mysqldb' ip '10.150.0.5', ports list [{3306 mysql}]
  6. En tu máquina de administración de clústeres, actualiza la implementación de BookInfo con una versión del servicio de calificaciones que usa la base de datos MySQL y el enrutamiento para enviarle tráfico.

    $ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2-mysql-vm.yaml)
    deployment "ratings-v2-mysql-vm" created
    $ kubectl get pods -lapp=ratings
    NAME                                   READY     STATUS    RESTARTS   AGE
    ratings-v1-3016823457-mqbfx            2/2       Running   0          24m
    ratings-v2-mysql-vm-1319199664-9jxkp   2/2       Running   0          19s
    $ istioctl create -f samples/bookinfo/kube/route-rule-ratings-mysql-vm.yaml
    Created config route-rule/default/ratings-test-v2-mysql-vm at revision 4398
    Created config route-rule/default/reviews-test-ratings-v2-vm at revision 4399
  7. Por último, de vuelta en la VM Compute Engine, configura el archivo adicional de proxy de Istio istio-vm para interceptar el tráfico en el puerto relevante (3306 en nuestro ejemplo, como se especifica cuando se registra el servicio). Para configurar esto en /var/lib/istio/envoy/sidecar.env, se agregan las tres líneas siguientes al archivo.

    $ sudo vi /var/lib/istio/envoy/sidecar.env
    ...
    ISTIO_INBOUND_PORTS=3306
    ISTIO_SERVICE=mysqldb
    ISTIO_NAMESPACE=vm
    

    Debes reiniciar el archivo adicional después de cambiar la configuración.

    sudo systemctl restart istio
    
  8. Después de completar todo esto, el servicio de calificación de la aplicación BookInfo debería usar la nueva base de datos de expansión de malla. Intenta cambiar los valores en la base de datos de calificaciones en la VM y observa cómo aparecen en las páginas de productos de la app BookInfo.

    $ mysql -u root -h 127.0.0.1 --password=password test -e "select * from ratings"
    +----------+--------+
    | ReviewID | Rating |
    +----------+--------+
    |        1 |      5 |
    |        2 |      4 |
    +----------+--------+
    # Change to 1 star:
    $ mysql -u root --password=password test -e "update ratings set rating=1 where reviewid=1"
    

    Calificaciones actualizadas en la IU

Cómo funciona

Cuando la aplicación en la VM quiere hacer una solicitud a otro servicio en la malla, debe resolver el nombre mediante DNS y recuperar la IP del servicio (o IP del clúster, el VIP asignado al servicio). En la configuración de la VM de expansión de malla especial de Istio, la aplicación de VM usa dnsmasq para resolver el nombre, lo que redirecciona todas las direcciones .cluster.local a Kubernetes. La configuración de dnsmasq también agrega 127.0.0.1 a resolv.conf y, si es necesario, configura DHCP para insertar eso después de cada resolución de DHCP.

Cuando la aplicación realiza la solicitud real, la configuración de VM de Istio usa ipnames para redireccionar la solicitud a través del proxy de Envoy. El proxy luego se conecta al servicio de Istio-Pilot para obtener la lista de extremos y reenvía la solicitud al extremo de malla adecuado después de aplicar las reglas.

Limpia

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Si no deseas continuar con la exploración de la app BookInfo en Pasos siguientes, haz lo siguiente:

  1. Borra los diversos balanceadores de cargas internos que se usaron en el ejemplo:

    kubectl -n istio-system delete service --all
    kubectl -n kube-system delete service dns-ilb
    
  2. Observa el resultado del siguiente comando para esperar hasta que se borren todos los balanceadores de cargas:

    gcloud compute forwarding-rules list
    
  3. Borra el clúster de contenedor:

    gcloud container clusters delete [CLUSTER_NAME]
    
  4. Borra la base de datos de VM:

    gcloud compute instances delete istio-vm
    

Pasos siguientes

El sitio de Istio contiene más guías y muestras con usos de ejemplo operativos para Istio con los que puedes experimentar. Estos incluyen los siguientes:

  • Enrutamiento inteligente: en este ejemplo, se muestra cómo usar las diversas capacidades de administración de tráfico de Istio con BookInfo, incluidas las reglas de enrutamiento usadas en la última sección de este instructivo.

  • Telemetría en profundidad: en este ejemplo, se muestra cómo obtener métricas, registros y seguimientos uniformes en todos los servicios de BookInfo mediante el Mixer de Istio y el proxy del archivo adicional de Istio.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Compute Engine