Descubre la magia de la arquitectura de malla de servicios y observa cómo potencia tus sistemas distribuidos.
Sumérgete en Istio, la superestrella de la malla de servicios, y aprende cómo orquesta tu clúster de Kubernetes a la perfección.
Las aplicaciones monolíticas han evolucionado hacia servicios más pequeños e independientes. Este cambio ganó una inmensa popularidad con la computación en la nube y la arquitectura de microservicios. Herramientas como Docker y Kubernetes aceleraron esta tendencia.
Los microservicios en plataformas como Kubernetes ofrecen numerosos beneficios, pero también introducen complejidades. La gestión de la comunicación entre estos servicios distribuidos requiere un cuidadoso análisis del descubrimiento, el enrutamiento, los reintentos y la conmutación por error.
Desafíos adicionales incluyen la seguridad y la observabilidad.
Incorporar capacidades de comunicación en cada servicio lleva mucho tiempo, especialmente a medida que el panorama de servicios se expande. Aquí es donde brilla la malla de servicios. Maneja toda la comunicación de servicio a servicio dentro de un sistema distribuido.
La malla de servicios logra esto mediante el uso de proxies de red. Las solicitudes entre servicios se enrutan a través de estos proxies, que residen fuera de los servicios en la capa de infraestructura:
Estos proxies forman una red de malla para los servicios, de ahí el nombre. La malla de servicios controla todos los aspectos de la comunicación de servicio a servicio, lo que le permite abordar las ocho falacias de la computación distribuida.
¡Libera todo el potencial de tus servicios con una malla de servicios! Descubre cómo esta herramienta mágica puede transformar el panorama de tu aplicación.
Dividamos la magia en tres habilidades básicas: magia del tráfico, seguridad acorazada y visibilidad cristalina.
Una malla de servicios es tu policía de tráfico definitiva, que dirige las interacciones del servicio con precisión. Disfruta de un enrutamiento dinámico, un descubrimiento inteligente y características alucinantes como el sombreado y la división del tráfico para versiones canary sin problemas y experimentos de prueba A/B.
¡Dile adiós a las conexiones poco fiables! Una malla de servicios envuelve tus servicios en una acogedora manta de fiabilidad, ofreciendo reintentos, tiempos de espera, limitación de velocidad e interruptores de circuito para proteger tus aplicaciones del caos.
¡Protege tus servicios con una fortaleza impenetrable! Una malla de servicios cifra todas las comunicaciones con MTLS robusto, verifica las identidades con autenticación estricta y aplica reglas de acceso para la máxima protección.
¡Descubre superpoderes de seguridad ocultos! Aísla los servicios, rastrea cada movimiento para la auditoría y crea un perímetro seguro alrededor de tu aplicación con una malla de servicios.
¡Navega por las complejidades de tu sistema distribuido con facilidad! Una malla de servicios proporciona una visibilidad incomparable del funcionamiento interno de tu aplicación a través del rastreo distribuido.
Descubre información valiosa con una gran cantidad de métricas, registros y datos de rendimiento. Optimiza tus servicios y soluciona problemas como un profesional con una malla de servicios.
Istio, una malla de servicios de código abierto creada por IBM, Google y Lyft, mejora invisiblemente las aplicaciones distribuidas con gestión del tráfico, seguridad e información sobre el rendimiento.
Implementado de forma flexible on-premise, en la nube, dentro de Kubernetes o en máquinas virtuales, Istio brilla con microservicios en Kubernetes. Aunque es independiente de la plataforma, encaja perfectamente en entornos en contenedores.
En esencia, Istio implementa proxies Envoy como sidecars junto con cada microservicio:
Esta red de proxies forma el plano de datos de Istio, orquestado por el plano de control:
El plano de control, el cerebro de Istio, permite a los proxies Envoy realizar el descubrimiento, la configuración y la gestión de certificados.
Libera el potencial de Istio con una multitud de microservicios interconectados, donde los proxies sidecar tejen una sólida infraestructura de malla de servicios:
La adaptabilidad de Istio brilla a través de la integración perfecta con sistemas externos de registro, telemetría y políticas.
La arquitectura de Istio es un dúo dinámico: el plano de datos y el plano de control. Juntos, orquestan la magia detrás de las capacidades de Istio. Profundicemos en los componentes centrales que impulsan esta plataforma excepcional.
Prepárate para explorar los intrincados detalles de los componentes centrales de Istio.
El plano de datos de Istio es esencialmente una versión amplificada del proxy Envoy. Esta maravilla de código abierto maneja las complejidades de la red, liberando a las aplicaciones para que se centren en su negocio principal. Las aplicaciones interactúan sin problemas, ajenas a la compleja infraestructura de red.
En esencia, Envoy es un asistente de red que opera en las capas 3 y 4 del modelo OSI. Gestiona hábilmente las conexiones utilizando una cadena de filtros de red adaptables. Más allá de esto, el filtro de capa L7 de Envoy le permite manejar el tráfico HTTP con delicadeza. Y eso no es todo: es natural con los protocolos HTTP/2 y gRPC.
Muchas de las características destacadas de Istio son en realidad superpoderes heredados de las habilidades integradas de Envoy:
El verdadero potencial de Envoy brilla cuando se combina con Istio. Su extensibilidad, impulsada por WebAssembly, cambia las reglas del juego para la aplicación de políticas personalizadas y la telemetría. Además, la API de sandbox Proxy-Wasm de Istio abre las puertas a aún más personalizaciones de Envoy.
Conoce a istiod, el director de orquesta del plano de control de Istio. Este maestro transforma las reglas de enrutamiento de alto nivel y las directivas de gestión del tráfico en configuraciones amigables para Envoy, distribuyéndolas sin problemas a los sidecars.
¿Recuerdas la arquitectura anterior de Istio con sus componentes individuales? Bueno, para simplificar las cosas, estos componentes se fusionaron en el istiod unificado. Pero no temas, las funcionalidades principales permanecen intactas.
En esencia, istiod aprovecha el mismo código y API que sus predecesores. Pilot, por ejemplo, sigue siendo el maestro del descubrimiento de servicios, traduciendo los detalles específicos de la plataforma a un lenguaje universal que entienden los sidecars. Esta flexibilidad permite que Istio armonice con diversos entornos como Kubernetes y máquinas virtuales.
istiod también se encarga de la seguridad, estableciendo una sólida autenticación de servicio a servicio y de usuario final con su sistema integrado de gestión de identidades y credenciales. Aplica políticas de seguridad granulares basadas en la identidad del servicio con facilidad. Además, istiod funciona como una autoridad de certificación (CA) de confianza, emitiendo certificados para asegurar la comunicación entre servicios mediante TLS mutuo (MTLS).
Hemos explorado las características típicas de una malla de servicios y hemos analizado la arquitectura y los componentes centrales de Istio. Ahora, descubramos cómo Istio ofrece estas características utilizando sus componentes centrales.
Volveremos a visitar las mismas categorías de características que exploramos anteriormente.
La API de gestión del tráfico de Istio ofrece un control granular sobre el tráfico de la malla de servicios. Adapta las configuraciones de tráfico utilizando estas API y define los recursos de la API con las definiciones de recursos personalizados de Kubernetes (CRD). Los recursos clave de la API para el enrutamiento del tráfico son los servicios virtuales y las reglas de destino:
Un servicio virtual dicta cómo se enrutan las solicitudes a un servicio dentro de la malla de Istio. Comprende una o más reglas de enrutamiento que se evalúan secuencialmente. Después del enrutamiento del servicio virtual, se aplican reglas de destino para controlar el tráfico a un destino, como agrupar instancias de servicio por versión.
La base de seguridad de Istio son identidades sólidas para cada servicio. Los agentes de Istio junto con cada proxy Envoy colaboran con istiod para automatizar la rotación de claves y certificados:
Istio admite dos tipos de autenticación: autenticación de pares y autenticación de solicitudes. La autenticación de pares asegura la comunicación de servicio a servicio con la solución TLS mutua de Istio. La autenticación de solicitudes maneja la autenticación del usuario final a través de la validación de tokens web JSON (JWT) utilizando un proveedor de autenticación personalizado o un proveedor OpenID Connect (OIDC).
Istio aplica el control de acceso al servicio aplicando políticas de autorización. Estas políticas regulan el tráfico entrante en el proxy Envoy, lo que permite el control de acceso a nivel de malla, espacio de nombres y servicio.
Istio genera telemetría completa, que incluye métricas, seguimientos distribuidos y registros de acceso, para toda la comunicación de servicio dentro de la malla. Esta telemetría abarca métricas a nivel de proxy, orientadas al servicio y del plano de control.
Anteriormente, Mixer era el componente central de la arquitectura de telemetría de Istio. Sin embargo, Telemetry v2 reemplaza las funciones de Mixer con complementos de proxy Envoy:
Istio crea seguimientos distribuidos a través de proxies Envoy y admite varios backends de rastreo como Zipkin, Jaeger, Lightstep y Datadog. La frecuencia de muestreo de la generación de rastreo es configurable. Además, Istio genera registros de acceso para el tráfico de servicios en formatos personalizables.
Suficiente información general, ¡veamos Istio en acción! Instalaremos Istio en un clúster de Kubernetes y usaremos una aplicación de microservicios simple para mostrar su potencia.
Istio se instala de varias maneras, pero descargar y extraer la última versión para tu sistema operativo (como Windows) es lo más fácil. El paquete extraído incluye el cliente istioctl en la carpeta bin. Usa istioctl para instalar Istio en tu clúster de Kubernetes:
istioctl install --set profile=demo -y
Esto instala los componentes de Istio en el clúster de Kubernetes predeterminado utilizando el perfil de demostración. Cambia 'demo' por otro perfil específico del proveedor si es necesario.
A continuación, dile a Istio que inyecte automáticamente proxies sidecar Envoy al implementar aplicaciones en este clúster de Kubernetes:
kubectl label namespace default istio-injection=enabled
Estamos usando kubectl aquí, suponiendo que tienes un clúster de Kubernetes (como Minikube) y la CLI de Kubernetes kubectl configurada.
Imagina una aplicación de pedidos en línea simple para esta demostración. Consta de tres microservicios que funcionan juntos para completar los pedidos:
No profundizaremos en los detalles de los microservicios, pero son fáciles de crear con Spring Boot y API REST. Fundamentalmente, crea imágenes de Docker para estos microservicios para implementar en Kubernetes.
Implementar cargas de trabajo en contenedores en clústeres de Kubernetes como Minikube es simple. Usa los recursos de implementación y servicio para declarar y acceder a la carga de trabajo. Normalmente, defínelos en un archivo YAML:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: order-service
namespace: default
spec:
replicas: 1
template:
metadata:
labels:
app: order-service
version: v1
spec:
containers:
- name: order-service
image: kchandrakant/order-service:v1
resources:
requests:
cpu: 0.1
memory: 200
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: order-service
Esta es una definición básica de implementación y servicio para el servicio de pedidos. Crea archivos YAML similares para el servicio de inventario y el servicio de envío.
Implementa estos recursos usando kubectl fácilmente:
kubectl apply -f booking-service.yaml -f inventory-service.yaml -f shipping-service.yaml
Dado que habilitamos la inyección automática de proxies sidecar Envoy para el espacio de nombres predeterminado, todo está controlado. O inyecta manualmente proxies sidecar Envoy usando el comando kube-inject de istioctl.
Istio maneja principalmente el tráfico de malla. De forma predeterminada, el tráfico hacia o desde fuera de la malla está bloqueado. Istio utiliza puertas de enlace para gestionar el tráfico de malla entrante y saliente, lo que te da un control preciso sobre lo que entra o sale. Istio ofrece implementaciones de proxy de puerta de enlace preconfiguradas: istio-ingressgateway e istio-egressgateway.
Crea una puerta de enlace y un servicio virtual para tu aplicación:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: booking-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: booking
spec:
hosts:
- "*"
gateways:
- booking-gateway
http:
- match:
- uri:
prefix: /api/v1/booking
route:
- destination:
host: booking-service
port:
number: 8080
Estamos utilizando el controlador de entrada de Istio predeterminado aquí. Además, hemos definido un servicio virtual para enrutar las solicitudes al servicio de reservas.
También puedes definir una puerta de enlace de salida para el tráfico de malla saliente.
Hemos implementado una aplicación simple en Kubernetes con Istio. Exploremos las potentes funciones de Istio y veamos cómo pueden mejorar nuestra aplicación.
Imagina implementar múltiples versiones de un microservicio como el servicio de envío. Deseas introducir gradualmente nuevas funciones sin afectar a todos los usuarios. El enrutamiento de solicitudes te permite hacer esto dirigiendo una parte del tráfico a la última versión.
Utiliza reglas de enrutamiento de servicio virtual para lograr esto.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: shipping-service
spec:
hosts:
- shipping-service
http:
- route:
- destination:
host: shipping-service
subset: v1
weight: 90
- destination:
host: shipping-service
subset: v2
weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: shipping-service
spec:
host: shipping-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Las reglas de enrutamiento también pueden filtrar el tráfico en función de los encabezados u otros atributos. El campo de destino especifica el servicio de destino para las solicitudes coincidentes.
Evita fallos en cascada con interruptores de circuito. Este patrón detecta errores y detiene temporalmente el tráfico a los servicios que fallan, protegiendo la salud general de tu aplicación.
DestinationRule de Istio te permite configurar el comportamiento de interrupción del circuito para servicios como el servicio de inventario.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: inventory-service
spec:
host: inventory-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
Al limitar las conexiones máximas, las solicitudes pendientes y las solicitudes por conexión, puedes gestionar eficazmente el tráfico y evitar la sobrecarga.
El TLS mutuo garantiza una comunicación segura entre servicios al requerir que ambas partes se autentiquen. Istio habilita automáticamente el TLS mutuo para los servicios que utilizan sus proxies.
Si bien Istio aplica el TLS mutuo entre los servicios proxy, el tráfico de texto sin formato aún puede llegar a los servicios sin proxies. Utiliza las políticas de PeerAuthentication para aplicar el TLS mutuo en toda tu malla.
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
Puedes aplicar TLS mutuo a nivel de malla, espacio de nombres o servicio. Las políticas específicas del servicio anulan la configuración de todo el espacio de nombres.
Los tokens web JSON (JWT) son un estándar para transmitir de forma segura la información del usuario. Se utilizan ampliamente para la autenticación y autorización.
AuthorizationPolicy de Istio te permite controlar el acceso a servicios como el servicio de reservas en función de las reclamaciones de JWT.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
selector:
matchLabels:
app: booking-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["[email protected]/[email protected]"]
Requiere JWT válidos con reclamaciones específicas para el acceso autorizado. Istio crea un atributo requestPrincipal a partir de las reclamaciones del emisor y del sujeto del JWT.
Istio simplifica la gestión de los desafíos comunes en arquitecturas distribuidas de microservicios. Sin embargo, su complejidad puede agregar sobrecarga a las implementaciones. Como cualquier herramienta, Istio no es una solución mágica y requiere una evaluación cuidadosa.
Si bien las mallas de servicios ofrecen ventajas, ten en cuenta estos inconvenientes:
Las mallas de servicios ofrecen beneficios, pero es crucial una evaluación cuidadosa de la complejidad de tu aplicación. Sopesa las ventajas frente a la complejidad añadida.
Istio es una malla de servicios popular respaldada por líderes de la industria, pero no es la única opción. Aquí tienes una breve descripción general de Linkerd y Consul.
Linkerd es una malla de servicios de código abierto nativa de Kubernetes que está ganando popularidad. Es un proyecto de incubación de CNCF y funciona de manera similar a Istio, utilizando proxies TCP. El micro-proxy basado en Rust de Linkerd se llama Linkerd-proxy.
Linkerd es generalmente más simple que Istio debido a su enfoque en Kubernetes. Sin embargo, su conjunto de características se parece mucho al de Istio y su arquitectura central es similar. Linkerd consta de una interfaz de usuario, un plano de datos y un plano de control.
Consul es una malla de servicios de código abierto de HashiCorp que se integra con otras herramientas de infraestructura de HashiCorp. El plano de datos de Consul admite modelos de integración tanto proxy como nativos. Ofrece un proxy integrado pero también puede funcionar con Envoy.
Consul opera más allá de Kubernetes, admitiendo plataformas como Nomad. Utiliza agentes en cada nodo para verificaciones de estado y se comunica con los servidores de Consul para el almacenamiento y la replicación de datos. Si bien ofrece características estándar de malla de servicios, Consul es más complejo de implementar y gestionar.
Este tutorial ha explorado los fundamentos de la arquitectura de malla de servicios y las potentes capacidades de Istio. Hemos profundizado en la estructura central de Istio, los componentes y las aplicaciones prácticas. Al final, deberías tener una sólida comprensión de cómo instalar y utilizar Istio para escenarios comunes.
Comentarios de los Clientes
Las siguientes reseñas fueron recopiladas en nuestro sitio web.
¿Tienes Preguntas? ¡Encuentra Respuestas Aquí!
Nuestras Preguntas Más Frecuentes