Capítulo 4. Implementación de Istio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Para familiarizarnos con el conjunto completo de capacidades de Istio, necesitamos ponerlo en marcha. Empecemos por conocer sus plataformas compatibles y preparar nuestro entorno para la implementación. Istio es un proyecto grande, que proporciona una serie de capacidades y bastantes opciones de implementación. En este capítulo, realizaremos una instalación básica en tu máquina local y desplegaremos unos cuantos servicios en la malla. En capítulos posteriores profundizaremos en diversos aspectos de la funcionalidad de Istio.

Preparar tu entorno para Istio

Además de Istio, desplegaremos su aplicación de ejemplo, Bookinfo. Nuestras Implementaciones de Istio y Bookinfo desplegarán una serie de contenedores. Utilizaremos Kubernetes como plataforma para gestionar estos contenedores. Kubernetes es un robusto sistema de orquestación de contenedores capaz de formar clusters (una colección de nodos) y programar contenedores entre nodos dentro de la flota de máquinas anfitrionas (nodos) que forman el cluster. Los nodos son servidores Linux o Windows capaces de ejecutar contenedores que tienen instalado un agente de Kubernetes, kubelet. Kubernetes es la primera plataforma subyacente y la mejor soportada. Por tanto, utilizamos Kubernetes en todos nuestros ejemplos. Para que quede claro, Istio no depende de Kubernetes. Diseñado para ser agnóstico respecto a las plataformas, Istio admite múltiples plataformas de implementación, incluidas las que no tienen un orquestador de contenedores.

Docker Desktop como entorno de instalación

Hay muchas opciones para la implementación de Kubernetes. En este libro, utilizamos Docker Desktop como una opción conveniente. Docker Desktop es una aplicación fácil de instalar en tu entorno Mac o Windows que te permite empezar a ejecutar Kubernetes e Istio desde tu máquina local.

Para instalar Docker Desktop y verificar que tienes un entorno Docker funcional, en la línea de comandos, ejecuta ++$ docker run hello-world++. Un mensaje "Hello from Docker!" confirma que Docker ha podido extraer imágenes, crear nuevas instancias y está funcionando como se esperaba.

Nota

Elegimos Docker Desktop como plataforma Kubernetes conveniente que requiere la implementación manual de Istio (para que puedas ver las entrañas de Istio sin necesidad de complicarte con la implementación del clúster Kubernetes). También puedes utilizar el plano de gestión, Meshery, que despliega rápidamente Istio y la aplicación de ejemplo, Bookinfo. Independientemente de la herramienta que utilices para desplegar Istio, los ejemplos utilizados aquí deberían funcionar en cualquier entorno Istio que se ejecute en Kubernetes. Para obtener una lista de las plataformas compatibles, consulta la documentación de Istio.

A partir de julio de 2018, Docker Desktop para Mac y Windows incluye soporte para ejecutar un servidor y un cliente Kubernetes independientes, así como integración con Docker CLI. Utilizamos Docker Desktop para ejecutar Kubernetes y Kubernetes como plataforma para implementar Istio. El servidor Kubernetes gestionado por Docker Desktop se ejecuta localmente dentro de tu instancia de Docker, no es configurable y es un clúster Kubernetes de un solo nodo.

La integración de Kubernetes en el Escritorio Docker para Mac proporciona el ejecutable CLI de Kubernetes en /usr/local/bin/kubectl. La integración de Kubernetes en el Escritorio Docker para Windows proporciona el ejecutable de la CLI de Kubernetes en C:\>Archivos de Programa\Docker\Docker\Resources\bin\kubectl.exe. Puede que esta ubicación no esté en la variable PATH de tu shell; si es así, escribe la ruta completa del comando o añádela a la variable PATH. Para más información sobre kubectl, consulta la documentación oficial.

Configurar Docker Desktop

Para asegurarte de que tu máquina virtual de escritorio Docker tiene suficiente memoria para ejecutar Kubernetes, Istio y la aplicación de ejemplo de Istio, Bookinfo, tendrás que configurar tu máquina virtual Docker con al menos 4 GB de memoria. Esta cantidad de memoria es necesaria para que se ejecuten todos los servicios de Istio y Bookinfo. Pilot, en concreto, podría tener problemas para ejecutarse, ya que solicita 2 GB de memoria en una implementación de Istio con la configuración predeterminada (para una revisión rápida de la finalidad de Pilot, consulta el Capítulo 3). El límite por defecto de Docker Desktop también es de 2 GB, por lo que Pilot podría negarse a iniciarse debido a la insuficiencia de recursos, si no se aumenta en tu instalación de Docker.

En lugar de aumentar la cantidad de memoria asignada a tu instalación de Docker Desktop, como se muestra en la Figura 4-1, podrías, alternativamente, reducir la cantidad de memoria que Pilot solicita a tu clúster de Kubernetes. Hay un par de formas de hacerlo, dependiendo de si utilizas un gestor de paquetes como Helm o simplemente archivos de especificaciones de Kubernetes directamente.

iuar 0401
Figura 4-1. Aumentar el límite de memoria de Docker en el panel Avanzado

Utilizando install/kubernetes/istio-demo.yaml como manifiesto de ejemplo, el Ejemplo 4-1 destaca qué sección de la especificación Pilot hay que editar para reducir los 2 GB de memoria solicitados por Pilot a algo menor, como 512 MB.

Ejemplo 4-1. istio-demo.yaml mostrando el recurso de memoria solicitado para el contenedor Piloto
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: istio-pilot
  namespace: istio-system
...
          resources:
            requests:
              cpu: 500m
              memory: 2048Mi
...

O puedes proporcionar una configuración personalizada cuando utilices Helm (un gestor de paquetes para Kubernetes) para desplegar Istio. Para personalizar la instalación de Istio utilizando Helm, utiliza la opción --set <key>=<value> en el comando Helm para anular uno o más valores, como se demuestra en el Ejemplo 4-2.

Ejemplo 4-2. Personalizar la configuración de Istio mediante Helm
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system
     --set pilot.resources.requests.memory="512Mi" | kubectl apply -f -

Implementación de Kubernetes

Si Kubernetes no está instalado en tu escritorio, habilítalo en las preferencias de Docker Desktop. Verifica la instalación de kubectl ejecutando el Ejemplo 4-3.

Ejemplo 4-3. Listado de los números de versión del cliente (binario kubectl) y del servidor (clúster Kubernetes)
$ kubectl version --short
Client Version: v1.13.0
Server Version: v1.13.0

Si ves los números de versión tanto del cliente como del servidor, tu cliente kubectl está instalado en tu PATH, y se puede acceder a un clúster de Kubernetes. Verifica la instalación de Kubernetes y tu contexto actual ejecutando $ kubectl get nodes (ver Ejemplo 4-4), lo que confirmará que tu kubeconfig (normalmente ubicado en ~/.kube/config) está correctamente configurado en el contexto docker-desktop y que tu clúster de un solo nodo está en marcha.

Ejemplo 4-4. Lista de nodos Kubernetes recuperada por kubectl
$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   32m   v1.13.0
Advertencia

Esta instalación crea usuarios, secretos, aplicaciones y otros objetos de ejemplo dentro de tu cluster. Los objetos creados en este tutorial sólo tienen fines ilustrativos y educativos. No ejecutes esta configuración en un entorno de producción.

Instalación del panel de control de Kubernetes

Kubernetes Dashboard es una interfaz de usuario basada en web para gestionar tu clúster y sus recursos. Puedes utilizarlo para implementar y solucionar problemas de aplicaciones en contenedores. Kubernetes Dashboard también proporciona información sobre el estado de los recursos de Kubernetes en tu clúster y sobre cualquier error que pueda haberse producido. El Dashboard es útil para reforzar tu comprensión de cómo funciona Istio. La forma más sencilla y habitual de acceder al clúster es a través de kubectl proxy, que crea un servidor web local que envía los datos de forma segura a Dashboard a través del Servidor API de Kubernetes. Implementa el Dashboard de Kubernetes ejecutando el siguiente comando:

$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/
        master/aio/deploy/recommended/kubernetes-dashboard.yaml

A continuación, accede a Dashboard utilizando la herramienta de línea de comandos kubectl ejecutando el siguiente comando:

$ kubectl proxy

Este comando crea un servidor web local que envía los datos de forma segura a Dashboard a través del Servidor API de Kubernetes. Comprende que sólo puedes acceder a Dashboard desde la máquina en la que se ejecuta el comando. Consulta kubectl proxy --help para más opciones y la documentación sobre el Dashboard de Kubernetes para más información. kubectl hace que el Dashboard esté disponible, como se ilustra en la Figura 4-2.

iuar 0402
Figura 4-2. Autenticación en el panel de control de Kubernetes

Para proteger los datos de tu clúster, Dashboard se implementa por defecto con una configuración mínima de control de acceso basado en roles (RBAC). Actualmente, Dashboard sólo admite el inicio de sesión con un token de portador. Puedes crear un usuario de ejemplo y utilizar su token o utilizar un token existente proporcionado por tu implementación de Docker Desktop, como se muestra aquí:

$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret |
      awk '/default-token/ {print $1}')

Esto imprime algo como el Ejemplo 4-5.

Ejemplo 4-5. Salida de la descripción de un secreto de Kubernetes
Name:         default-token-tktcn
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 3a0a68b1-4abd-11e9-8561-025...

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZp...

Copia el token y utilízalo para autenticarte en el Panel de control.

Instalación de Istio

Con Kubernetes desplegado y el Dashboard instalado, es hora de instalar nuestra malla de servicios. Puedes descargar la última versión de Istio ejecutando el siguiente comando:

$ curl -L https://git.io/getLatestIstio | sh -

Este script obtiene la última versión candidata de Istio y la desensambla.

Nota

Los usuarios de Mac y Linux deberían encontrar curl fácilmente disponible en su sistema. Los usuarios de Windows pueden necesitar descargar curl para Windows.

Para obtener una versión concreta de Istio, especifica el número de versión deseado, como se muestra aquí:

$ curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.1.0 sh -

Aunque Istio como proyecto proporciona compatibilidad con versiones anteriores de versión menor a versión menor (a menos que se indique en los registros de cambios de la versión), puede que quieras especificar ISTIO_VERSION=1.1.0 para asegurarte de que los ejemplos de este libro funcionan como se describe.

También puedes descargar Istio desde la página de versiones de Istio. Puedes elegir entre las versiones para Windows, macOS y Linux. Independientemente del SO que utilices, una vez descargada la distribución para tu SO, extrae el archivo comprimido a un directorio y familiarízate con el contenido de la distribución.

Cada versión incluye istioctl (este binario será específico para tu SO), ejemplos de configuración, una aplicación de ejemplo, y recursos de instalación específicos para cada plataforma. También instalable a través de tu gestor de paquetes favorito, istioctl es una CLI importante para que los operadores de servicios depuren y diagnostiquen su malla de servicios Istio.

Consejo

Tras la descarga, asegúrate de mover la distribución de la versión a una carpeta donde no se borre.

Para explorar los contenidos de la versión en macOS o Linux, por ejemplo, cambia el directorio a istio-x.x.x, como se muestra aquí (en el momento de escribir esto, la última versión de Istio es la 1.1.7):

$ cd istio-1.1.0

Este directorio (véase el Ejemplo 4-6) contiene los archivos necesarios para instalar Istio, archivos de ejemplo y también istioctl.

Ejemplo 4-6. Contenido de la carpeta de nivel superior que contiene una versión de Istio
$ ls -l
total 48
-rw-r--r--   1 lee  staff  11343 Mar 18 16:08 LICENSE
-rw-r--r--   1 lee  staff   5921 Mar 18 16:08 README.md
drwxr-xr-x   3 lee  staff     96 Mar 18 16:08 bin
drwxr-xr-x   7 lee  staff    224 Mar 18 16:08 install
-rw-r--r--   1 lee  staff    602 Mar 18 16:08 istio.VERSION
drwxr-xr-x  16 lee  staff    512 Mar 18 16:08 samples
drwxr-xr-x  21 lee  staff    672 Mar 18 16:08 tools

El directorio de instalación contiene archivos YAML de instalación de Istio para Kubernetes en install/, aplicaciones de ejemplo en samples/, y el binario del cliente istioctl en el directorio bin/. El archivo de configuración istio.VERSION contiene una lista de componentes de Istio y sus números de versión para la distribución de la versión.

Puedes utilizar la CLI de istioctl para crear reglas y políticas de enrutamiento. También puedes utilizarla cuando inyectes manualmente Envoy como proxy de servicio. Otros usos incluyen crear, listar, modificar y eliminar recursos de configuración en el sistema Istio. Vamos a añadirlo a tu variable de entorno PATH:

$ export PATH=$PWD/bin:$PATH

Puedes verificar tu instalación de istioctl ejecutando:

$ istioctl version

Esto debería validar la ruta y las opciones del comando istioctl (ver Ejemplo 4-7). Si no es así, consulta la sección "Instalación, actualización y desinstalación de Istio".

Ejemplo 4-7. Confirmación de que istioctl se ejecuta en tu máquina
version.BuildInfo{
Version:"1.1.0", GitRevision:"82797c0c0649a3f73029b33957ae105260458c6e",
User:"root",
Host:"996cd064-49c1-11e9-813c-0a580a2c0506", GolangVersion:"go1.10.4",
DockerHub:"docker.io/istio",
BuildStatus:"Clean",
GitTag:"1.1.0-rc.6"
}

Ahora que hemos descargado una distribución de Istio y verificado que istioctl CLI funciona en nuestra máquina local, vamos a realizar una instalación básica.

Opciones de instalación de Istio

Hay muchos métodos de instalación y arquitecturas de implementación diferentes. Por lo general, las instalaciones suelen corresponder a las categorías de las siguientes subsecciones.

Elección de la configuración de seguridad

Instalar con autenticación mTLS estricta

Recomendado para un clúster Kubernetes nuevo. Este método impone la autenticación entre sidecars por defecto.

Instalar con autenticación mTLS permisiva entre sidecars
  • Esto se recomienda si tienes clusters y servicios existentes.

  • Utilízalo si tienes aplicaciones en las que los servicios con un sidecar Istio necesitan comunicarse con otros servicios Kubernetes que no sean Istio.

Implementaciones personalizadas que incluyen o excluyen determinados componentes predeterminados de Istio
  • Esto se recomienda si una función de uno de los componentes de Istio no es necesaria o deseada en tu entorno (por ejemplo, eliminar Citadel si no se va a utilizar mTLS).

Elección de la utilidad de implementación

Ten en cuenta lo siguiente cuando elija una utilidad de implementación:

  • ¿Realiza los manifiestos de Kubernetes directamente con kubectl?

  • ¿Es recomendable para entender los fundamentos de Istio de forma más explícita?

  • ¿Realizará manifiestos de Kubernetes con un sistema de gestión de paquetes/configuración como Helm o Ansible?

  • ¿Es recomendable para implementaciones en producción con configuración de plantillas?

Esta lista no es exhaustiva; sin embargo, independientemente del enfoque que adoptes para instalar Istio, cada uno incluirá la instalación de definiciones de recursos personalizadas de Kubernetes (CRD) para Istio. Las CRD permiten definir y registrar recursos de Kubernetes no predeterminados. Cuando se despliegan las CRD de Istio, los objetos de Istio se registran como objetos de Kubernetes, proporcionando una experiencia altamente integrada con Kubernetes como plataforma de implementación.

Registro de los recursos personalizados de Istio

Ahora que ya conoces la potencia y la comodidad de los recursos personalizados, vamos a registrar CustomResourceDefinitions de Istio en tu clúster de Kubernetes. Utiliza el siguiente comando para aplicar los objetos CustomResourceDefinition de Istio a tu clúster:

$ for i in install/kubernetes/helm/istio-init/files/crd*yaml;
      do kubectl apply -f $i; done

Esta instalación no utiliza Helm. El método generalmente preferido para cualquier instalación de Istio que pueda llegar a producción es utilizar Helm o Ansible; ambos están incluidos en la distribución que acabas de descargar. Con Helm o Ansible, ganas flexibilidad en cuanto a los componentes que instalas, y puedes personalizar las cosas al detalle.

Ejemplo 4-8. CRDs de Istio, cargados como recursos en kube-api y disponibles para la interacción
$ kubectl  api-resources | grep istio
meshpolicies         authentication.istio.io    false    MeshPolicy
policies             authentication.istio.io    true     Policy
adapters             config.istio.io            true     adapter
apikeys              config.istio.io            true     apikey
attributemanifests   config.istio.io            true     attributemanifest
authorizations       config.istio.io            true     authorization
bypasses             config.istio.io            true     bypass
checknothings        config.istio.io            true     checknothing
circonuses           config.istio.io            true     circonus
cloudwatches         config.istio.io            true     cloudwatch
...

Istio registra nuevos CRD (véase el Ejemplo 4-8), que puedes manipular (crear/actualizar/eliminar) como cualquier otro objeto de Kubernetes:

$ kubectl get crd | grep istio
adapters.config.istio.io               2019-03-24T03:17:08Z
apikeys.config.istio.io                2019-03-24T03:17:07Z
attributemanifests.config.istio.io     2019-03-24T03:17:07Z
authorizations.config.istio.io         2019-03-24T03:17:07Z
bypasses.config.istio.io               2019-03-24T03:17:07Z
checknothings.config.istio.io          2019-03-24T03:17:07Z
circonuses.config.istio.io             2019-03-24T03:17:07Z
cloudwatches.config.istio.io           2019-03-24T03:17:08Z
clusterrbacconfigs.rbac.istio.io       2019-03-24T03:17:07Z
deniers.config.istio.io                2019-03-24T03:17:07Z
destinationrules.networking.istio.io   2019-03-24T03:17:07Z
dogstatsds.config.istio.io             2019-03-24T03:17:08Z
edges.config.istio.io                  2019-03-24T03:17:08Z
envoyfilters.networking.istio.io       2019-03-24T03:17:07Z
...
Nota

Después de desplegar los CRD de Istio, puedes dirigirte a recursos de Istio a través de istioctl o kubectl, como se muestra en el Ejemplo 4-9.

Ejemplo 4-9. Utilizar istioctl para mostrar información sobre las pasarelas Istio
$ istioctl get gateway
Command "get" is deprecated, Use `kubectl get` instead (see https://kubernetes.io
     /docs/tasks/tools/install-kubectl)
No resources found.

Fíjate en el mensaje relativo a la desaparición de ciertos comandos de istioctl. Ten en cuenta que, aunque istioctl se sigue manteniendo y mejorando como CLI para gestionar Istio, kubectl es el método preferido de interacción con los recursos personalizados de Istio (consulta el Ejemplo 4-10). istioctl proporciona algunas utilidades específicas de Istio que no se encuentran en kubectl.

Ejemplo 4-10. Uso de kubectl para mostrar información sobre las pasarelas Istio
$ kubectl get gateway
NAME               AGE
No resources found.

Como alternativa al bucle a través de los manifiestos install/kubernetes/helm/istio-init/files/crd*yaml, podríamos aplicar istio-demo.yaml, que tiene incluidos estos mismos manifiestos CRD. El archivo istio-demo. yaml también incluye todos los componentes del plano de control de Istio (no sólo los CRD). Dentro de la carpeta install/ de tu carpeta de distribución de la versión, encontrarás archivos de instalación para diferentes plataformas compatibles para ejecutar Istio. Dado que Kubernetes es la plataforma que hemos elegido para trabajar en este libro, abre la carpeta install/kubernetes/. Allí encontrarás el archivo istio-demo.yaml, que contiene todos los componentes necesarios de Istio (en forma de CRDs, clusteroles, configmaps, servicios, HPAs, implementaciones, servicios, etc.) y algunos adaptadores útiles como Grafana y Prometheus.

Una vez que registres los recursos personalizados de Istio en Kubernetes, podrás instalar los componentes del plano de control de Istio.

Instalación de los componentes del plano de control de Istio

Utilizamos el archivo de especificación istio-demo.yaml, que contiene configuraciones de Istio que permiten a los servicios funcionar en modo mTLS permisivo. Se recomienda utilizar el modo mTLS permisivo si tienes servicios o aplicaciones existentes en tu clúster de Kubernetes. Sin embargo, si estás empezando con un clúster nuevo, las buenas prácticas de seguridad sugieren cambiar a istio-demo-auth.yaml para reforzar el cifrado del tráfico de servicios entre sidecars.

$ kubectl apply -f install/kubernetes/istio-demo.yaml

Espera unos minutos para que la instalación se ejecute, las imágenes Docker se descarguen correctamente y las Implementaciones tengan éxito. La aplicación de este extenso archivo YAML permite a Kubernetes realizar muchos CRD nuevos.

El plano de control de Istio está instalado en su propio espacio de nombres istio-system, y desde este espacio de nombres gestiona los servicios que se ejecutan en todos los demás espacios de nombres que tienen servicios con proxies sidecar; o, en otras palabras, todos los demás espacios de nombres que tienen servicios en la malla. El plano de control actúa a nivel de todo el clúster, lo que significa que se comporta de forma monotributista, como se demuestra en el Ejemplo 4-11.

Ejemplo 4-11. Espacio de nombres istio-system creado para los componentes del plano de control de Istio
$ kubectl get namespaces
NAME           STATUS   AGE
default        Active   49d
docker         Active   49d
istio-system   Active   2m15s
kube-public    Active   49d
kube-system    Active   49d

Puedes verificar la instalación del plano de control en el espacio de nombres istio-system utilizando los comandos que se muestran en el Ejemplo 4-12. Si la instalación se ha realizado correctamente, deberías ver una salida similar.

Ejemplo 4-12. Servicios y pods del plano de control de Istio ejecutándose en el espacio de nombres istio-system
$ kubectl get svc -n istio-system
NAME          TYPE      CLUSTER-IP     EXTERNAL-IP PORT(S)           AGE

grafana       ClusterIP 10.108.237.105 <none>   3000/TCP             11d
istio-citadel ClusterIP 10.108.165.14  <none>   8060/TCP,15014/TCP   11d
istio-egressgateway ClusterIP 10.107.148.169 <none>   80/TCP,443/TCP,15443/TCP 11d
...

$ kubectl get pod -n istio-system
NAME                                      READY   STATUS      RESTARTS   AGE
grafana-57586c685b-jr2pd                  1/1     Running     0          5m45s
istio-citadel-645ffc4999-8j4v6            1/1     Running     0          5m45s
istio-cleanup-secrets-1.1.0-4c9pc         0/1     Completed   0          5m48s
istio-egressgateway-5c7fd57fdb-85g26      1/1     Running     0          5m46s
istio-galley-978f9447f-mj5xj              1/1     Running     0          5m46s
istio-grafana-post-install-1.1.0-g49gh    0/1     Completed   0          5m48s
istio-ingressgateway-8ccdc79bc-8mk4p      1/1     Running     0          5m46s
istio-pilot-649455846-klc8c               2/2     Running     0          5m45s
istio-policy-7b7d7f644b-sqsp8             2/2     Running     4          5m45s
istio-security-post-install-1.1.0-v4ffp   0/1     Completed   0          5m48s
istio-sidecar-injector-6dcc9d5c64-tklqz   1/1     Running     0          5m45s
istio-telemetry-6d494cd676-n6pkz          2/2     Running     4          5m45s
istio-tracing-656f9fc99c-nn9hd            1/1     Running     0          5m44s
kiali-69d6978b45-7q7ms                    1/1     Running     0          5m45s
prometheus-66c9f5694-2xzpm                1/1     Running     0          5m45s

Espera un segundo, te preguntarás, ¿por qué sólo hay una única réplica de cada componente del plano de control de Istio? ¿Cómo es que esto no es un único punto de fallo? Pues... tienes razón. Los componentes del plano de control con una única réplica son un problema para una implementación de producción. El plano de control de Istio debe desplegarse en una arquitectura de alta disponibilidad (HA) (con múltiples réplicas de cada componente) en cualquier entorno para el que el tiempo de inactividad no sea tolerable. ¿Te molesta que el plano de datos esté en línea? ¿Y si falla o pierde la conexión con el plano de control? Afortunadamente, el plano de datos tiene incorporada cierta capacidad de recuperación capaz de conservar la configuración y seguir funcionando en caso de que los componentes del plano de control fallen o se desconecten de él. A medida que avances en este libro, verás que Istio está diseñado para ser altamente resistente. Tiene que serlo. Los fallos en los sistemas distribuidos están casi garantizados.

Hasta ahora, sólo hemos desplegado la mitad de la malla de servicios: el plano de control. Antes de desplegar la aplicación de ejemplo y, en consecuencia, el plano de datos, podrías considerar que no hay proxies en ejecución; sin embargo, estarías pasando por alto el hecho de que ya hay dos proxies en ejecución. Tanto la pasarela de entrada como la de salida son instancias activas y en ejecución de nuestro proxy de servicio. Vamos a inspeccionarlas.

Nota

Nuestra sencilla implementación de demostración incluye una pasarela de salida con el fin de familiarizarse con Istio y facilitar su exploración. Esta pasarela opcional está desactivada por defecto a partir de la v1.1. Si necesitas controlar y asegurar tu tráfico saliente a través de la pasarela de salida, tendrás que habilitar manualmente gateways.istio-egressgateway.enabled=true en cualquier perfil de configuración de implementación que no sea de demostración.

Utilizar el comando istioctl proxy-status te permite obtener una visión general de tu malla; éste es un ejemplo de una utilidad istioctl que no se encuentra en kubectl, como se muestra en el Ejemplo 4-13. Si sospechas que uno de tus sidecars no está recibiendo configuración o no está sincronizado, proxy-status te lo hará saber. Profundizaremos en el uso de istioctl para depurar Istio en el Capítulo 11.

Ejemplo 4-13. Confirmación de que las pasarelas de entrada y salida de Istio tienen proxies sidecar implementados y sincronizados mediante istioctl proxy-status
$ istioctl proxy-status
NAME                     CDS    LDS    EDS       RDS       PILOT           VERSION
istio-egressgateway-...  SYNCED SYNCED SYNCED... NOT SENT  istio-pilot-... 1.1.0
istio-ingressgateway-... SYNCED SYNCED SYNCED... NOT SENT  istio-pilot-... 1.1.0

Comprender cómo gestiona Istio la configuración de Envoy desplegados como pasarelas en el plano de control es esclarecedor en relación con cómo se gestionan las instancias de Envoy en el plano de datos. Si recuerdas, el plano de datos se compone de proxies inteligentes desplegados como sidecars junto a los servicios de aplicación. Despleguemos nuestro plano de datos. Lo haremos desplegando la aplicación de ejemplo Bookinfo.

Implementación de la aplicación de ejemplo Bookinfo

Despleguemos ahora nuestro primer conjunto de servicios (una aplicación) en la malla de servicios. Para ello, utilizaremos la aplicación de ejemplo de Istio, Bookinfo, diseñada para mostrar muchos aspectos de la propuesta de valor de las mallas de servicios. Los archivos de manifiesto de Kubernetes para Bookinfo se encuentran en tu carpeta de distribución de la versión, en samples/bookinfo/. Puesto que utilizamos Bookinfo como aplicación de ejemplo a lo largo de este libro, vamos a familiarizarnos con ella.

De izquierda a derecha en la Figura 4-3, los usuarios llaman al microservicio productpage, que a su vez llama a los microservicios de detalles y reseñas para rellenar la página. El microservicio details contiene información sobre el libro.

iuar 0403
Figura 4-3. Bookinfo, mostrando microservicios separados que muestran varias características de Istio

El microservicio reviews contiene reseñas de libros y posteriormente llama al microservicio ratings para recuperar las reseñas. El microservicio ratings contiene clasificaciones de libros en forma de reseñas de 1 a 5 estrellas. El microservicio reviews tiene tres versiones:

  • reviews v1 no tiene valoraciones (no llama al servicio ratings )

  • reviews v2 tiene valoraciones de 1 a 5 estrellas negras (llama al servicio ratings )

  • reviews v3 tiene valoraciones de 1 a 5 estrellas rojas (llama al servicio ratings )

El hecho de que cada uno de estos servicios de aplicación esté escrito en un lenguaje diferente -Python, Ruby, Java y Node.js- demuestra aún más el valor de una malla de servicios.

Nota

La mayoría de los proyectos de malla de servicios incluyen una aplicación de muestra. Lo hacen para que los adoptantes puedan aprender rápidamente cómo funciona la malla de servicios y demostrar el valor que aporta.

Ejecutar el ejemplo con Istio no requiere hacer cambios en la aplicación. En su lugar, simplemente configuramos y ejecutamos los servicios en un entorno habilitado para Istio con proxies de servicio como sidecars inyectados junto a cada servicio. Los proxies de servicio de Istio pueden inyectarse manual o automáticamente como sidecars a los servicios de la aplicación (ver Figura 4-4). Veamos cómo funciona la inyección automática de sidecares mientras desplegamos nuestra aplicación de ejemplo. (Examinaremos más a fondo la inyección sidecar manual en el Capítulo 5).

iuar 0404
Figura 4-4. Bookinfo desplegado en una malla Istio con proxies de servicio como sidecars

Implementación de la aplicación de ejemplo con inyección lateral automática

Para que Envoy se despliegue como sidecar en cada uno de nuestros servicios, Istio desplegará un inyector sidecar. En el Capítulo 5 se examina el inyector sidecar con más detalle. Por ahora, en el Ejemplo 4-14 vamos a comprobar la presencia del despliegue del inyector sidecar y su etiqueta de espacio de nombres utilizada para designar que los pods de un espacio de nombres concreto tendrán automáticamente inyectados sidecars en el momento de su implementación (admisión).

Ejemplo 4-14. Verificar la presencia del inyector Istio sidecar
$ kubectl -n istio-system get deployment -l istio=sidecar-injector
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
istio-sidecar-injector   1/1     1            1           82m

El NamespaceSelector decide si ejecuta el webhook en un objeto en función de si el espacio de nombres de ese objeto coincide con el selector.

Etiqueta el espacio de nombres por defecto con istio-injection=enabled:

$ kubectl label namespace default istio-injection=enabled

A continuación, confirma qué espacios de nombres tienen la etiqueta istio-injection:

$ kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    1h        enabled
Docker         Active    1h        enabled
istio-system   Active    1h        disabled
kube-public    Active    1h
kube-system    Active    1h

La implementación istio-demo.yaml que ejecutamos tiene configurada la inyección automática.

Ahora que ya tenemos el inyector sidecar con el webhook de admisión mutante y el espacio de nombres etiquetado para la inyección sidecar automática, podemos implementar la aplicación de ejemplo. Para obtener una descripción detallada de los webhooks de admisión mutante de Kubernetes, consulta "Inyección automática de sidecar". A continuación, entrega el manifiesto de Bookinfo a Kubernetes para la implementación de nuestra aplicación de muestra:

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

Con la aplicación de ejemplo desplegada, puedes confirmar que la inyección sidecar automática funciona en tu entorno inspeccionando cualquiera de los pods de Bookinfo y observando el contenedor istio-proxy como una nueva adición al pod de la aplicación:

$ kubectl describe po/productpage-v1-....
...
istio-proxy:
    Container ID:  docker://f28abdf1f0acf92687711488f7fcca8cc5968e2ed39d…
    Image:         docker.io/istio/proxyv2:1.1.7
    Image ID:      docker-pullable://istio/proxyv2@sha256:e6f039115c7d5e…
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
      proxy
      sidecar
...
Nota

Las sidecars pueden eliminarse de los pods de aplicación aunque el espacio de nombres lleve la etiqueta sidecar-injection. Cubrimos este procedimiento en el Capítulo 5.

Trabajar en red con la aplicación de ejemplo

Ahora que los servicios de Bookinfo están en funcionamiento, tienes que hacer que la aplicación sea accesible desde fuera de tu clúster de Kubernetes; por ejemplo, desde un navegador. Para ello utilizamos una Pasarela Istio. Tendrás que definir la pasarela de entrada para la aplicación:

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

Confirma que se ha creado la pasarela:

$ kubectl get gateway

NAME               AGE
bookinfo-gateway   7m

Para interactuar con la aplicación recién implementada, busca dónde se ha expuesto el productpage como un servicio disponible para recibir peticiones originadas fuera del clúster. Esto se puede ver en el Ejemplo 4-15.

Ejemplo 4-15. Identificar la dirección IP y el número de puerto de la aplicación de muestra expuesta en la pasarela de entrada de Istio
$ echo "http://$(kubectl get nodes -o template --template='{{range.items}}
     {{range.status.addresses}}{{if eq .type "InternalIP"}}{{.address}}{{end}}{{end}}
     {{end}}'):$(kubectl get svc istio-ingressgateway
     -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')/
     productpage"

http://x.x.x.x:31380/productpage

También querrás asegurarte de que tus aplicaciones no utilizan los mismos puertos de red que utilizan los componentes de Istio. La Tabla 4-1 enumera los puertos que utiliza Istio.

Tabla 4-1. Puertos de red utilizados por Istio
Puerto Protocolo Utilizado por Descripción

8060

HTTP

Ciudadela

Servidor GRPC

9090

HTTP

Prometeo

Prometeo

9091

HTTP

Mezclador

Política/Telemetría

9093

HTTP

Ciudadela

Servidor TCP

15000

TCP

Enviado

Puerto de administración de Envoy (comandos/diagnósticos)

15001

TCP

Enviado

Enviado

15004

HTTP

Mezclador, Piloto

Política/Telemetría - mTLS

15010

HTTP

Piloto

Servicio piloto - piloto XDS - descubrimiento

15011

TCP

Piloto

Servicio piloto - mTLS - Proxy - descubrimiento

15014

HTTP

Ciudadela, Mezclador, Piloto

Monitoreo del plano de control

15030

TCP

Prometeo

Prometeo

15090

HTTP

Mezclador

Proxy

42422

TCP

Mezclador

Telemetría - Prometheus

Con nuestra aplicación en funcionamiento y accesible, podemos empezar a manipular el tráfico del servicio. La posibilidad de acceder a nuestra aplicación es una forma sencilla de confirmar cómo estamos afectando a la aplicación, pero la exposición de una aplicación a la malla no es un requisito para manipular su tráfico.

Desinstalar Istio

Eliminar el espacio de nombres istio-system no desinstalará Istio. Es un error común pensar que sí lo hace, pero al eliminar se eliminan los componentes del plano de control de Istio, dejando los CRD, sidecars y otros artefactos residentes en tu clúster. La lógica aquí es que los CRDs contienen la configuración en tiempo de ejecución establecida por los operadores de servicio. Teniendo esto en cuenta, se deduce que a los operadores de servicios les conviene más que se les haga borrar explícitamente los datos de configuración del tiempo de ejecución, en lugar de tener partes inesperadas con ellos. En nuestro caso, no estamos sujetos a nuestra instalación, por lo que desinstalar Istio es tan sencillo como ejecutar este comando desde tu carpeta de lanzamiento de Istio: istio-system

$ kubectl delete -f install/kubernetes/istio-demo.yaml

Sin embargo, esto no eliminará todos los CRD de Istio, la configuración de malla y la aplicación de ejemplo. Para eliminarlos, ejecuta lo siguiente:

$ for i in install/kubernetes/helm/istio-init/files/crd*yaml;
     do kubectl delete -f $i; done
$ kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl delete -f samples/bookinfo/networking/bookinfo-gateway.yaml

Puedes comprobar que Istio y Bookinfo se han eliminado correctamente ejecutando lo siguiente:

$ kubectl get crds
$ kubectl get pods

Si sigues obteniendo CRDs después de intentar desinstalar, consulta el Capítulo 11 para obtener algunas sugerencias de depuración.

Instalaciones basadas en el timón

En general, se recomiendan gestores de paquetes como Helm (sin Tiller) o gestores de configuración como Ansible para facilitar la idempotencia como práctica deseable al implementar Istio en entornos de producción. Se está desarrollando un operador de Istio para sustituir la instalación de Helm Tiller como utilidad recomendada por el proyecto para controlar las actualizaciones.

Instalar Helm

Necesitarás tener acceso a un sistema con Helm instalado. Puedes instalar Helm colocando el binario en tu PATH, o con tu gestor de paquetes favorito.

  1. Descarga la última versión de Helm correspondiente a tu sistema operativo.

  2. Descomprime el archivo descargado.

  3. Localiza Helm y muévelo a la ubicación deseada (por ejemplo, /usr/local/bin/helm).

O puedes añadir el directorio desempaquetado a tu PATH navegando hasta él en la CLI y utilizando el siguiente comando:

export PATH=$PWD:$PATH

Para instalar en tu sistema local (macOS), alternativamente, puedes utilizar Homebrew para instalar, como se muestra en el Ejemplo 4-16.

Ejemplo 4-16. Instalar Helm en macOS con Homebrew
$ brew install kubernetes-helm

Para otros sistemas, consulta la documentación de instalación de Helm.

Con Helm instalado, puedes proceder con Tiller (instalación de Helm) o sin Tiller (plantilla de Helm). Tiller es el componente del lado servidor de Helm que se ejecuta en tu clúster. Tiller interactúa directamente con el Servidor API de Kubernetes para instalar, actualizar, consultar y eliminar recursos de Kubernetes. También almacena los objetos que representan las versiones.

Instalar con Plantilla Helm

Recorramos enérgicamente la implementación de una plantilla Helm (sin Tiller). Crea un espacio de nombres para los componentes del plano de control de Istio y, a continuación, instala todos los CRD de Istio. Renderiza los componentes principales de Istio en un manifiesto de Kubernetes llamado istio.yaml utilizando el siguiente comando desde el directorio de lanzamiento de Istio:

$ kubectl create namespace istio-system
$ helm template install/kubernetes/helm/istio-init --name istio-init
     --namespace istio-system | kubectl apply -f -
$ helm template install/kubernetes/helm/istio --name istio
     --namespace istio-system | kubectl apply -f -

Parte de la ventaja de utilizar un método de implementación basado en Helm es que puedes personalizar con relativa facilidad la configuración de Istio añadiendo una o varias opciones de instalación de --set <key>=<value> al comando Helm, de este modo:

$ helm install install/kubernetes/helm/istio --name istio
     --namespace istio-system \
  --set global.controlPlaneSecurityEnabled=true \
  --set mixer.adapters.useAdapterCRDs=false \
  --set grafana.enabled=true --set grafana.security.enabled=true \
  --set tracing.enabled=true \
  --set kiali.enabled=true

Las opciones de instalación de Istio ponen de manifiesto lo configurables que son las Implementaciones de Istio. Las Implementaciones de producción suelen aprovechar un gestor de paquetes o de configuración como Helm o Ansible. Las Implementaciones de Istio realizadas inicialmente con estas herramientas también deben actualizarse a nuevas versiones de Istio utilizando esa misma herramienta.

Confirmación de una instalación basada en Helm

Al igual que cuando realizaste la instalación utilizando kubectl, las instalaciones basadas en Helm despliegan Istio en su propio espacio de nombres de Kubernetes, istio-system. Para comprobar si Istio está desplegado y ver también todas las piezas desplegadas, ejecuta lo siguiente:

$ kubectl get svc -n istio-system

Asegúrate de que estos servicios se están ejecutando:

$ kubectl get pods -n istio-system

Desinstalar una instalación basada en Helm

Para desinstalar Istio después de haberlo implementado utilizando la plantilla Helm, ejecuta los siguientes comandos para eliminar Istio de tu clúster Kubernetes:

$ helm template install/kubernetes/helm/istio --name istio
     --namespace istio-system | kubectl delete -f -
$ kubectl delete -f install/kubernetes/helm/istio-init/files
$ kubectl delete namespace istio-system

Otros entornos

No todo es Kubernetes. Se admiten otras plataformas para la implementación. Expansión de la malla es el término que utiliza la comunidad Istio para describir la incorporación de servicios existentes a la malla de servicios. En este libro no repasaremos todas las formas en que puedes ampliar la malla de servicios Istio, pero señalaremos que entre las plataformas admitidas se incluyen las siguientes:

  • Bare metal y VMs

  • Apache Mesos y Cloud Foundry

  • Nómada y Cónsul

  • Eureka

Además, hay una serie de ofertas de servicios gestionados Istio ofrecidas por varias nubes públicas y proveedores de servicios gestionados.

Get Istio: En marcha now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.