¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Kubernetes
  3. Mallado de servicios con Istio
Extrait - Kubernetes Administre la plataforma de despliegue de sus aplicaciones en contenedores
Extractos del libro
Kubernetes Administre la plataforma de despliegue de sus aplicaciones en contenedores
3 opiniones
Volver a la página de compra del libro

Mallado de servicios con Istio

Objetivos del capítulo y requisitos previos

Una malla de servicios es un mecanismo para conectar un conjunto de servicios, de tal manera que las relaciones entre cada uno de ellos forman una malla (mesh en inglés). Desde este punto de vista, Kubernetes cubre parcialmente esta necesidad al proponer mecanismos de servicios o network policies.

Istio permite ampliar las funciones que Kubernetes no cubre actualmente:

  • Instrumentación de tiempos de respuesta.

  • Cifrado de comunicaciones.

  • Captura de trazas de llamadas.

  • Gestión de fallos de comunicación (retry, timeout, etc.).

Este capítulo de introducción a Istio tiene como objetivo presentarle su funcionamiento y todas las posibilidades que ofrece este mecanismo.

Presentación de Istio

1. Microservicios y establecimiento de servicios en red

El desarrollo de aplicaciones en microservicios es un marco de desarrollo clásico. El principio es dividir la aplicación que se va a desarrollar en varios elementos independientes y débilmente acoplados. A continuación, la comunicación entre dos servicios se realiza mediante una API (a menudo basada en REST o gRPC).

La ventaja de este tipo de arquitectura es permitir que cada componente pueda ser utilizado de forma independiente por diferentes equipos.

En una arquitectura tradicional, una aplicación de microservicios puede ser difícil de mantener. Desde este punto de vista, Kubernetes se adapta perfectamente:

  • Facilidad para desplegar varios componentes pequeños e independientes con los objetos Deployment o StatefulSet.

  • Creación del balanceador de carga con la noción de servicio.

  • Publicación de componentes usando Ingress.

  • Restricción de comunicaciones entre componentes utilizando objetos NetworkPolicy.

Por otro lado, debido a este establecimiento en red facilitado, surgen nuevas preguntas:

  • ¿Quién se comunicó con quién?

  • ¿Cuánto tiempo duró la comunicación entre dos servicios?

  • ¿En qué servicios pasó tiempo la aplicación?

  • ¿La petición entre dos servicios se hace con los parámetros correctos?

2. Presentación...

Instarlar Istio

1. Configurar external-dns

En capítulos anteriores, se desplegó el componente external-dns para administrar la creación de entradas DNS para objetos Ingress. Istio ya no funciona con este mecanismo. Utiliza otro basado en objetos Gateway y VirtualService (este mecanismo se presentará más adelante).

Para que la creación de las entradas DNS se realice de forma automática, se va a modificar el chart external-dns. Esta modificación se realiza mediante la opción sources del chart. De forma predeterminada, esta variable es una tabla que contiene los valores service e ingress.

Para soportar las gateways Istio, se agregará a esta lista el valor istio-gateway

A continuación, se muestra la declaración de la configuración de external-dns con esta modificación para un clúster que utiliza los servicios de Google:

provider: google 
 
google: 
   project: "eni-kubernetes" 
   serviceAccountSecret: "cloud-dns-key" 
 
sources: 
   - service 
   - ingress  
   # add istio gateway as a source of DNS entries  
   - istio-gateway 

Adapte el campo provider en función del host del clúster de Kubernetes. No dude en consultar el capítulo Exponer aplicaciones en Internet.

Guarde esta declaración con el nombre external-dns.yaml y actualice el chart external-dns:

$ helm upgrade --install external-dns bitnami/external-dns \ 
               --namespace kube-system -f external-dns.yaml 

2. Repositorio de los charts Istio

Istio se puede instalar de varias formas:

  • Utilizando el comando istioctl.

  • Utilizando charts Hel.

  • Utilizando un operador dedicado.

En adelante, la instalación se realizará mediante los siguientes charts Helm:

  • istio/base: definición de recursos específicos de Istio.

  • istio/istiod: instalación de los componentes de Istio.

Normalmente se necesitan otros componentes: Gateway, Prometheus, Grafana, Kiali, Jaeger o Zipkin. Su instalación abordará un poco más adelante.

Primero añada la fuente que contiene estos paquetes:

$ helm repo add istio \ 
                 https://istio-release.storage.googleapis.com/charts...

Utilización de Istio

1. Inyectar pods en el mallado de servicios

Para integrar una aplicación en el servicio mesh, existen dos soluciones:

  • El uso de anotaciones (en el espacio de nombres o en el pod).

  • El uso del comando istioctl.

a. Instalar istioctl

El comando istioctl es un binario que permite realizar determinadas operaciones en el sistema Istio. La instalación se puede hacer usando el comando arkade siguiente:

$ arkade get istioctl 

En caso de ausencia de Arkade, su instalación se hace con el siguiente comando:

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

El comando debería devolver instrucciones como la siguiente:

Add /home/yannig/istio-1.13.2/bin to your path; e.g copy paste in 
your shell and/or ~/.profile: 
export PATH="$PATH:/home/yannig/istio-1.13.2/bin" 

 Añada la línea export PATH al archivo de perfil del usuario (~/.zshrc para zsh o ~/.bashrc para bash). Seguidamente, reinicie su sesión para tener en cuenta el cambio.

b. Inyectar el sidecar con istioctl

Una vez completada la modificación, la inyección de declaraciones se hace con el comando istioctl seguido de estas opciones:

  • La opción kube-inject.

  • La opción -f seguida de los recursos en los que inyectar la configuración de Istio.

A continuación, se muestra un ejemplo de ejecución de un archivo de despliegue: 

$ istioctl kube-inject -f deployment.yaml 

Tal como está, el comando solo muestra el contenido del archivo con los cambios añadidos.

 Para inyectar el resultado en Kubernetes, pase el resultado del comando a kubectl usando un pipe (|).

A nivel de kubectl, el comando se ejecutará con las siguientes opciones:

  • El verbo apply.

  • La opción -f - para inyectar la entrada del pipe directamente en Kubernetes.

A continuación, se muestra el comando completo que permite inyectar la configuración de Istio directamente en Kubernetes:

$ istioctl  kube-inject -f deployment.yaml | kubectl apply -f - 

c. Inyectar el sidecar por anotación

Otra técnica es realizar una inyección automática utilizando la etiqueta istio-injection=enabled en el espacio de nombres.

 Primero cree el espacio de nombres:

$ kubectl create namespace test-istio 

 Añada la etiqueta istio-injection=enabled en este espacio de nombres:

$ kubectl label namespace test-istio istio-injection=enabled 

La inyección...

Panel de control

1. Presentación de los diferentes componentes

Además del cifrado de extremo a extremo de Istio implementado anteriormente, Istio viene con un conjunto de componentes listos para usar: Kiali, Grafana y Jaeger.

El primero centraliza el acceso a Grafana y Jaeger, y ofrece paneles de control para ver las relaciones entre los pods.

Grafana se conecta a la instancia de Prometheus desplegada en el momento de la implementación de Istio.

Finalmente, Jaeger permite restaurar las capturas de tráfico realizadas con Zipkin entre los diferentes pods.

2. Interfaz Kiali

Por defecto, la aplicación no se expone en Internet. El acceso se realiza necesariamente con la instrucción kubectl y la opción port-forward.

A continuación, se muestra el comando completo que se debe utilizar para acceder al puerto 20001 del pod de kiali en el espacio de nombres istio-system:

$ kubectl -n istio-system port-forward deploy/kiali 20001 

Seguidamente, añada la dirección http://localhost:20001 en un navegador para acceder a la interfaz de Kiali.

A la izquierda, los enlaces presentes le permiten navegar a las siguientes pantallas: 

  • Overview: resumen de los servicios agrupados por espacios de nombres.

  • Graph: visualización de dependencias entre servicios.

  • Applications: lista de aplicaciones presentes.

  • Workloads: estado de los diferentes pods.

  • Services: lista de servicios presentes.

  • Istio Config: configuración...