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.
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.
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.
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 servicioratings
) -
reviews
v2 tiene valoraciones de 1 a 5 estrellas negras (llama al servicioratings
) -
reviews
v3 tiene valoraciones de 1 a 5 estrellas rojas (llama al servicioratings
)
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).
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.
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.
-
Descarga la última versión de Helm correspondiente a tu sistema operativo.
-
Descomprime el archivo descargado.
-
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.