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. Agrega 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 la 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 (GKE) , pero su función 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 las VM de Compute Engine. Esto te permite controlar los servicios de Kubernetes y de máquina virtual (VM) como una sola malla. En este instructivo, se muestra cómo configurar Istio para usar la expansión de malla y configurar las instancias de 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 GKE.

Para obtener más información sobre Istio y cómo funciona, consulta istio.io. Si te interesa averiguar cómo funciona la configuración de expansión de malla que se usa en este instructivo, consulta la sección Cómo funciona, aunque no necesitas leer esto para completar el instructivo.

Objetivos

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

Costos

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

New GCP users might be eligible for a free trial.

Antes de comenzar

  • Debes tener una instalación de Istio existente en GKE. Para obtener más información, consulta la sección Instala Istio en un clúster de GKE.
  • Debes tener la aplicación de muestra BookInfo instalada y en ejecución como se describe en la sección Instala Istio en un clúster de GKE y 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 el contexto de kubectl esté configurado en el 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 cuando escribes las opciones del ID del proyecto y 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

Cuando se agregan servicios que no son de Google Kubernetes Engine a una malla de Istio, lo primero que se debe hacer es configurar la instalación de Istio y generar los archivos de configuración que permitirán que las instancias de VM de Compute Engine lo usen. La descarga de Istio incluye una secuencia de comandos que ayuda con esto en GKE. La encontrarás en /install/tools/setupMeshEx.sh. Sigue estos pasos en la máquina en la que tienes el directorio de instalación de Istio y las credenciales del 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 Cloud DNS de GKE. Esto garantiza que las instancias de VM puedan 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):

    $ 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 instancias de 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 en el siguiente ejemplo:

    $ 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 Cloud DNS que se usará en las instancias de VM. Esto permitirá que las aplicaciones 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 instancias de VM de Compute Engine para unirse a la malla, lo que incluye la copia de tus archivos generados en las instancias de VM. A los fines de este instructivo, puedes volver a usar la secuencia de comandos setupMeshEx.sh que se proporciona para copiar archivos y configurar la máquina. Sin embargo, cuando agregues tus propias VM a una aplicación de malla real, deberás seguir los pasos de forma manual para integrar las instancias en los flujos de trabajo y el aprovisionamiento. 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 varios espacios de nombres de GKE. En este ejemplo, colocarás el servicio de VM (aunque no esté en GKE) en el espacio de nombres vm, dado que 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 los servicios de VM separados de los servicios regulares de GKE. 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 la máquina de administración de 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 las siguientes acciones:

    • Copia a la VM los archivos generados y la secuencia de comandos de configuración de la VM
    • Configura y verifica la configuración de Cloud DNS para que la VM pueda conectarse a los componentes de Istio
    • Copia a la VM los secretos de autenticación de Istio
    • 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 la herramienta de línea de comandos de 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 GKE. Por ejemplo, si ejecutas en el clúster de Kubernetes Engine el ejemplo de BookInfo de Instala Istio on GKE, deberías poder acceder al servicio de productpage con curl desde la VM, como se muestra en el siguiente ejemplo:

    $ 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

En el siguiente ejemplo, se muestra cómo ejecutar un servicio en una máquina de expansión de malla. En este ejemplo, usarás la VM que configuraste en la última sección para extender el ejemplo de BookInfo de Instala Istio on GKE con una base de datos de calificaciones de MySQL que se ejecuta en una VM de Compute Engine.

  1. Asegúrate de que istio-vm esté configurado 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. A continuación, 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 la máquina de administración de clústeres, ejecuta el siguiente comando y sustituye 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 la 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 de 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 de 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). Esto se configura en /var/lib/istio/envoy/sidecar.env cuando se agregan las siguientes tres líneas 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 calificaciones de la aplicación BookInfo debería usar la base de datos de expansión de malla nueva. 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 aplicación 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 instancia de VM quiere realizar una solicitud a otro servicio en la malla, usa Cloud DNS para resolver el nombre 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 GKE. La configuración de dnsmasq también agrega 127.0.0.1 a resolv.conf y, si es necesario, configura DHCP para insertar 127.0.0.1 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 Envoy. Luego, el proxy 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.

Realiza una limpieza

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 aplicación BookInfo en Próximos pasos, realiza las siguientes acciones:

  1. Borra los 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. Espera hasta que se borren todos los balanceadores de cargas mientras miras el resultado del siguiente comando:

    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
    

Próximos pasos

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

  • Enrutamiento inteligente: en este ejemplo, se muestra cómo usar las diferentes funciones de administración de tráfico de Istio con BookInfo, incluidas las reglas de enrutamiento que se utilizan 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 Mixer y el proxy de archivo adicional de Istio.