La Puerta de Entrada: Instalación de Istio en Kubernetes
Hemos construido nuestro servidor y montado el clúster de Kubernetes con MicroK8s. Ahora, necesitamos una forma inteligente, segura y controlada de exponer nuestros servicios a Internet. Aquí es donde entra en juego Istio, nuestro Service Mesh.
Istio es mucho más que un simple Ingress Controller; es una capa de infraestructura completa que se encarga de la seguridad, la observabilidad y la gestión del tráfico entre nuestros microservicios. En este artículo, instalaremos los componentes esenciales de Istio, desplegaremos su Ingress Gateway y, lo más importante, lo aseguraremos con un certificado TLS para habilitar HTTPS.
Prerrequisitos
Section titled “Prerrequisitos”Antes de comenzar, asegúrate de tener todo lo siguiente listo.
Conocimientos Previos
Section titled “Conocimientos Previos”Es recomendable tener una comprensión básica de los siguientes conceptos. No te preocupes si no eres un experto; iremos explicando sobre la marcha y crearemos artículos de profundización más adelante.
- Kubernetes Básico: Entender qué son los Pods, Services, Namespaces y Deployments.
- Helm: Saber qué es un Chart de Helm y cómo se utiliza para instalar aplicaciones en Kubernetes.
- Istio (Conceptual): Tener una idea general de qué es un Service Mesh y para qué sirve (Gateway, VirtualService).
- Línea de Comandos: Sentirte cómodo trabajando en una terminal como Windows PowerShell o Bash.
Herramientas Necesarias
Section titled “Herramientas Necesarias”Asegúrate de tener estas herramientas instaladas en tu máquina de desarrollo.
- kubectl: La herramienta de línea de comandos para interactuar con clústeres de Kubernetes.
- Helm: El gestor de paquetes para Kubernetes.
- (Opcional) Certificados TLS/SSL: Para configurar HTTPS en nuestro Gateway, necesitaremos certificados.
- Lens: Una herramienta visual para gestionar Kubernetes. Aunque no es estrictamente necesaria, facilita mucho la visualización y gestión de recursos.
Parte 1: Configurando el Acceso Local a Kubernetes
Section titled “Parte 1: Configurando el Acceso Local a Kubernetes”En el artículo anterior, usamos Lens para conectarnos. Ahora, vamos a configurar kubectl
en nuestra máquina Windows para gestionar el clúster desde la terminal.
-
Obtener y Guardar el Kubeconfig Nos conectamos por SSH a nuestro servidor y ejecutamos
microk8s config
. Este comando nos muestra la configuración necesaria para conectarnos. Copiamos todo el contenido.En nuestra máquina Windows, navegamos a la carpeta de nuestro usuario (
C:\Users\tu_usuario
), entramos al directorio.kube
y pegamos el contenido en un archivo llamadoconfig
. -
Verificar la Conexión Abrimos una terminal (Windows PowerShell) y ejecutamos un par de comandos para confirmar que
kubectl
puede ver nuestro clúster de MicroK8s.Terminal window kubectl config get-contextskubectl get nodesSi ves tu contexto actual y el nodo “vm-microk8s” con estado “Ready”, ¡la conexión es un éxito!
Parte 2: Instalación de Istio con Helm
Section titled “Parte 2: Instalación de Istio con Helm”Istio se instala en varios componentes. Usaremos Helm para desplegarlos de forma ordenada.
-
Añadir el Repositorio de Helm de Istio Primero, le decimos a Helm dónde encontrar los charts de Istio.
Terminal window helm repo add istio https://istio-release.storage.googleapis.com/charts -
Instalar
istio-base
Este chart instala losCustom Resource Definitions
(CRDs) de Istio. Son las “definiciones” que le enseñan a nuestro clúster a entender nuevos tipos de recursos comoGateway
yVirtualService
.Terminal window helm install istio-base istio/base -n istio-system --create-namespaceEl estado “deployed” nos confirma que ha sido exitoso.
En Lens, bajo la sección de “Releases”, podemos ver
istio-base
desplegado en su propio namespaceistio-system
. -
Instalar
istiod
(Plano de Control) Este es el “cerebro” de Istio.istiod
se encarga de configurar todos los proxies, gestionar los certificados y aplicar las políticas de tráfico que definamos.Terminal window helm install istiod istio/istiod -n istio-system --waitUsamos
--wait
para que Helm espere a que el despliegue esté completamente listo.En Lens, ahora vemos la release de
istiod
junto a la deistio-base
. -
Instalar
istio-ingress
(Plano de Datos) Este es el “portero”. Despliega un proxy Envoy que se encargará de recibir todo el tráfico externo y dirigirlo hacia nuestros servicios.Terminal window helm install istio-ingress istio/gateway -n istio-ingress --create-namespaceLo instalamos en su propio namespace,
istio-ingress
, para mantenerlo aislado.Verificamos la release en Lens.
Parte 3: Verificación y Creación del Gateway
Section titled “Parte 3: Verificación y Creación del Gateway”-
Verificar los Pods de Istio Si vamos a la vista de Pods en Lens y filtramos por todos los namespaces, veremos el pod
istiod
enistio-system
y el nuevo podistio-ingress
en el namespaceistio-ingress
, ambos en estado “Running”. -
Verificar el Servicio del Ingress Este es el momento “¡Aha!”. Si navegamos a “Network > Services”, veremos el servicio
istio-ingress
. Fíjate en dos cosas:- Type:
LoadBalancer
- External IP:
192.168.0.30
¡Esa es una de las IPs del rango que le dimos a MetalLB en el artículo anterior! MetalLB ha hecho su trabajo y le ha asignado una IP de nuestra red LAN al servicio de Istio, haciéndolo accesible.
- Type:
-
Crear el Recurso
Gateway
El podistio-ingress
está corriendo, pero no sabe qué hacer. Necesitamos decírselo creando un recursoGateway
. Este archivo YAML es una configuración que le ordena al Ingress que escuche en el puerto 443 (HTTPS) para los dominios que alojaremos.Creamos un archivo
inventory-gateway.yaml
:apiVersion: networking.istio.io/v1kind: Gatewaymetadata:name: istio-inventory-gatewaynamespace: istio-ingressspec:selector:istio: ingressservers:- port:number: 443name: httpsprotocol: HTTPStls:mode: SIMPLEcredentialName: tls-inventoryhosts:- vault.codedesignplus.app- rabbitmq.codedesignplus.app- services.codedesignplus.appapiVersion: networking.istio.io/v1kind: Gatewaymetadata:name: istio-inventory-gatewaynamespace: istio-ingressspec:selector:istio: ingressservers:- port:number: 80name: httpprotocol: HTTPhosts:- vault.codedesignplus.app- rabbitmq.codedesignplus.app- services.codedesignplus.appY lo aplicamos con
kubectl
:Terminal window kubectl apply -f .\inventory-gateway.yaml -
Verificar la Creación del Gateway En Lens, si vamos a la sección de recursos de Istio (
Network > Gateway
), veremos nuestroistio-inventory-gateway
creado correctamente.
Parte 4: Creando el Secreto TLS en Kubernetes
Section titled “Parte 4: Creando el Secreto TLS en Kubernetes”Con nuestros certificados generados en el artículo Creando Certificados con Let’s Encrypt, ahora debemos cargarlos en nuestro clúster de una forma segura. Kubernetes gestiona este tipo de datos sensibles a través de un recurso llamado Secret.
-
Preparar los Archivos de Certificado Primero, asegúrate de tener los archivos generados por Let’s Encrypt en tu máquina de desarrollo. Deberías haberlos transferido de forma segura desde el servidor (usando
scp
, por ejemplo). -
Crear el Secreto con
kubectl
Abre una terminal en el directorio donde tienes los archivos del certificado. Usaremos el comandokubectl create secret
para empaquetar nuestra clave y certificados en un secreto de Kubernetes.Terminal window kubectl create secret tls tls-inventory --cert=0000_cert.pem --key=inventory.key -n istio-ingressDesglosemos este comando:
create secret tls
: Le dice akubectl
que cree un secreto de tipo TLS.tls-inventory
: Es el nombre que le damos a nuestro secreto. Debe coincidir exactamente con elcredentialName
que especificamos en nuestro recursoGateway
.--cert=0000_cert.pem
: Especifica el archivo que contiene el certificado del servidor. Nota: Aunque el archivo se llame0000_cert.pem
,kubectl
a menudo espera la cadena completa. Si tienes problemas, usar el archivofullchain.pem
de Let’s Encrypt suele ser más robusto.--key=inventory.key
: Especifica nuestra clave privada.-n istio-ingress
: Crea el secreto en el mismo namespace donde corre nuestro Ingress Gateway,istio-ingress
.
-
Verificar el Secreto en Lens Para confirmar visualmente que el secreto se ha creado correctamente, vamos a Lens.
- En el menú de la izquierda, navega a
Config > Secrets
. - Asegúrate de tener seleccionado el namespace
istio-ingress
. - Verás nuestro nuevo secreto,
tls-inventory
, en la lista.
Al hacer clic en él, Lens nos muestra sus detalles, incluyendo su
Type
(kubernetes.io/tls
) y los datos codificados en base64 paratls.crt
ytls.key
. Incluso decodifica el certificado para mostrarnos información útil como elCommon Name
(CN) y las fechas de expiración. - En el menú de la izquierda, navega a
Parte 5: Poniéndolo Todo a Prueba - Desplegando una Aplicación de Ejemplo
Section titled “Parte 5: Poniéndolo Todo a Prueba - Desplegando una Aplicación de Ejemplo”Hemos instalado Istio, configurado el Gateway y asegurado los certificados. Ahora, vamos a hacer la prueba de fuego: desplegar una aplicación de ejemplo (un juego de Snake) y exponerla a través de nuestra nueva infraestructura.
-
Preparar el Manifiesto de Despliegue Crearemos un único archivo
deployment.yaml
que contendrá todos los recursos necesarios para nuestra aplicación de prueba.deployment.yaml apiVersion: v1kind: Namespacemetadata:name: snake-testlabels:istio-injection: enabled---apiVersion: apps/v1kind: Deploymentmetadata:name: snake-deploymentlabels:app: snakenamespace: snake-testspec:selector:matchLabels:app: snakereplicas: 2template:metadata:labels:app: snakespec:containers:- name: snakeimage: bhargavshah86/kube-test:v0.1ports:- containerPort: 80resources:limits:memory: 256Micpu: "250m"requests:memory: 128Micpu: "80m"---apiVersion: v1kind: Servicemetadata:name: snakenamespace: snake-testspec:selector:app: snakeports:- name: httpprotocol: TCPport: 80targetPort: 80type: ClusterIP---apiVersion: networking.istio.io/v1kind: VirtualServicemetadata:name: snake-virtualservicenamespace: snake-testspec:hosts:- services.codedesignplus.appgateways:- istio-ingress/istio-inventory-gatewayhttp:- name: snakematch:- uri:prefix: /snake/rewrite:uri: /route:- destination:host: snake.snake-test.svc.cluster.localport:number: 80 -
Aplicar el Manifiesto Desde nuestra terminal, con
kubectl
ya configurado, aplicamos el archivo.Terminal window kubectl apply -f .\deployment.yamlEl comando crea exitosamente los cuatro recursos.
-
Verificar los Pods en Lens Si vamos a la vista de Pods en Lens, ahora veremos nuestras dos réplicas de
snake-deployment
corriendo en el namespacesnake-test
. -
Configurar el Acceso Local (Archivo
hosts
) Para poder acceder a nuestra aplicación desde el navegador usando el dominio, necesitamos decirle a nuestra máquina local cómo resolverservices.codedesignplus.app
. Para ello, editaremos nuestro archivohosts
.-
Obtenemos la IP externa de nuestro Ingress Gateway de Istio. En Lens, vamos a “Network > Services” y copiamos la “External IP” del servicio
istio-ingress
, que es192.168.0.30
. -
Editamos el archivo
hosts
(C:\Windows\System32\drivers\etc\hosts
en Windows,/etc/hosts
en macOS/Linux) y añadimos la siguiente línea:192.168.0.30 services.codedesignplus.app
-
-
¡Jugar Snake! El momento de la verdad. Abrimos un navegador y vamos a la URL:
https://services.codedesignplus.app/snake/
¡Y ahí está! Nuestro Gateway de Istio ha recibido la petición, el
VirtualService
la ha enrutado correctamente a nuestroService
, que a su vez la ha enviado a uno de los Pods del juego. ¡Hemos completado el flujo de extremo a extremo!
Conclusión Final
Section titled “Conclusión Final”¡Lo has conseguido! Has construido un flujo completo, desde la instalación de un clúster de Kubernetes hasta el despliegue de una aplicación real expuesta de forma segura a través de Istio.
En este viaje, has aprendido a:
- Instalar y configurar un Ingress Gateway de Istio con Helm.
- Asegurar la comunicación con certificados TLS a través de Secretos de Kubernetes.
- Desplegar una aplicación y dirigir el tráfico hacia ella usando un
VirtualService
.
Ahora tienes una base sólida y profesional sobre la cual puedes empezar a desplegar tus propias aplicaciones y microservicios.