!Este post esta bajo revision, capaz no anda nada.
Ingress conectar nuestros servicios al exterior
Ingress en Kubernetes es un recurso que permite administrar el acceso externo a los servicios dentro de un clúster. Básicamente, Ingress actúa como un controlador de entrada (como un balanceador de carga inteligente) que dirige las solicitudes externas a los servicios correspondientes en función de las reglas definidas. Ingress se usa principalmente para controlar el acceso HTTP y HTTPS.
¿Para qué sirve Ingress?
-
Enrutamiento HTTP/HTTPS: Ingress te permite definir reglas de enrutamiento que dirigen el tráfico HTTP y HTTPS a servicios específicos en el clúster de Kubernetes. Por ejemplo, puedes hacer que las solicitudes a
www.example.com/api
se envíen a un servicio de API específico y que las solicitudes awww.example.com/app
vayan a otro servicio de frontend. -
Balanceo de Carga: Aunque Kubernetes ya tiene balanceo de carga a nivel de servicio con
Service
tipoLoadBalancer
, Ingress permite un control de tráfico más sofisticado, como redirigir tráfico basado en rutas o encabezados. Así puedes tener múltiples servicios detrás de un único punto de entrada y aplicar políticas de balanceo. -
TLS/SSL (HTTPS): Ingress permite la configuración de TLS para asegurar la comunicación. Puedes agregar certificados SSL y configurar el tráfico HTTPS para aplicaciones en el clúster, protegiendo así la transferencia de datos.
-
Nombre de Dominio y Reglas de Host: Con Ingress, puedes enrutar tráfico basado en el nombre de dominio. Esto permite a un clúster Kubernetes manejar múltiples aplicaciones o servicios en diferentes dominios o subdominios (como
app.example.com
yapi.example.com
) desde un único punto de entrada. -
Redirección y Reescritura de URL: Ingress permite definir reglas avanzadas para reescribir URLs o redirigirlas. Esto es útil para personalizar la estructura de URLs y simplificar el acceso a los servicios sin exponer los detalles internos de la estructura del clúster.
Componentes de Ingress
Para usar Ingress, necesitas entender algunos de sus componentes clave:
-
Ingress Resource (Recurso Ingress): Este es un objeto de Kubernetes que define las reglas de enrutamiento. Aquí configuras qué dominio o ruta deben dirigirse a qué servicio. Es un archivo YAML que contiene las reglas y se define usando la API de Kubernetes.
Ejemplo de un recurso Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: app.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80 - path: /app pathType: Prefix backend: service: name: frontend-service port: number: 80
-
Ingress Controller: El recurso Ingress no funciona por sí solo; necesita un Ingress Controller. Este es un componente que lee los recursos Ingress y configura el enrutamiento de acuerdo a las reglas. Hay varios Ingress Controllers disponibles, como NGINX Ingress Controller, Traefik, y HAProxy. Elige uno e instálalo en tu clúster para que Ingress funcione.
- El Ingress Controller observa los recursos Ingress y configura el tráfico en tiempo real según las reglas definidas.
¿Cómo funciona Ingress en Kubernetes?
- Configuras un Ingress Controller en tu clúster.
- Creas recursos Ingress con reglas de enrutamiento.
- El Ingress Controller lee las reglas del recurso Ingress y configura el tráfico según corresponda.
- Cuando una solicitud llega al clúster, el Ingress Controller la redirige al servicio o pod correspondiente basándose en las reglas de enrutamiento definidas en el recurso Ingress.
Ejemplo práctico
Si tienes dos servicios en Kubernetes, un backend de API y un frontend, puedes usar Ingress para enrutar solicitudes entrantes a esos servicios basándose en la URL. Por ejemplo:
app.example.com/api
redirige al servicioapi-service
.app.example.com/app
redirige al serviciofrontend-service
.
Esto permite a los usuarios acceder a ambos servicios usando un único punto de entrada, lo que simplifica la configuración y el acceso.
Ventajas de Ingress en Kubernetes
- Consolidación de puntos de acceso: Puedes manejar múltiples servicios a través de una sola IP o dominio.
- Mayor flexibilidad y control sobre el tráfico: Con Ingress, puedes implementar políticas avanzadas de enrutamiento y seguridad.
- Mejor escalabilidad: Permite manejar varias aplicaciones o microservicios dentro de un solo clúster, optimizando recursos y simplificando la configuración.
Conclusión
Ingress es una solución poderosa en Kubernetes para manejar el tráfico HTTP/HTTPS, proporcionando un control granular sobre cómo las solicitudes externas llegan a los servicios internos. Configurarlo correctamente, junto con un Ingress Controller, te permite simplificar el acceso a tus aplicaciones y mejorar la flexibilidad del enrutamiento de tráfico en tu clúster de Kubernetes.
Ejercicio
Activar el controlador Ingress Nginx en kubeadm
En el cluster que estamos siguiendo este curso hacemos lo que dice kubernetes para baremeteal que es lo siguiente:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0-beta.0/deploy/static/provider/baremetal/deploy.yaml
Revisamos que todo se haya instalado bien con :
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
Configuración de MetalLB y Ingress en Kubernetes para Entornos Bare-Metal
Este tutorial te guiará para configurar MetalLB
y Ingress
en un entorno Kubernetes bare-metal, exponiendo dos rutas (/apache
y /nginx
) que apuntan a diferentes servicios.
Requisitos Previos
- Un clúster de Kubernetes en bare-metal o virtual.
kubectl
instalado y configurado.- Permisos de administrador en el clúster.
Paso 1: Instalar MetalLB
MetalLB es un balanceador de carga para Kubernetes que permite el uso de servicios LoadBalancer
en entornos que no son de nube.
-
Instala MetalLB en el namespace
metallb-system
:kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
-
Configura un
IPAddressPool
con el rango de direcciones IP que MetalLB usará para asignar a los servicios de tipoLoadBalancer
. Asegúrate de ajustar el rango de IPs según la red de tu entorno:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: my-ip-pool namespace: metallb-system spec: addresses: - 192.168.0.240-192.168.0.250 # Ajusta el rango de IPs según tu red local --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: my-l2-advertisement namespace: metallb-system spec: ipAddressPools: - my-ip-pool
-
Aplica la configuración:
kubectl apply -f ip-pool.yaml
Paso 2: Configurar el Servicio de Ingress como LoadBalancer
Configura el Ingress Controller
para usar LoadBalancer
de una vez y evitar cambios posteriores.
-
Si aún no tienes un controlador
Ingress
instalado, sigue estos pasos para instalaringress-nginx
como un servicioLoadBalancer
:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
-
Cambia el tipo de servicio del controlador
Ingress
aLoadBalancer
. Crea un archivoingress-svc.yaml
con el siguiente contenido:apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: type: LoadBalancer # Configurado como LoadBalancer desde el inicio selector: app.kubernetes.io/name: ingress-nginx ports: - port: 80 targetPort: 80 - port: 443 targetPort: 443
Aplica el archivo:
kubectl apply -f ingress-svc.yaml
-
Verifica que MetalLB haya asignado una IP al servicio
ingress-nginx-controller
:kubectl get svc -n ingress-nginx
La columna
EXTERNAL-IP
debe mostrar una IP asignada dentro del rango que configuraste en el pool de MetalLB, como192.168.0.240
.
Paso 3: Crear Despliegues y Servicios de Apache y Nginx
-
Crea un despliegue y servicio para Apache:
apiVersion: apps/v1 kind: Deployment metadata: name: apache namespace: default spec: replicas: 1 selector: matchLabels: app: apache template: metadata: labels: app: apache spec: containers: - name: apache image: httpd:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: apache namespace: default spec: selector: app: apache ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
Aplica el archivo:
kubectl apply -f apache-deployment.yaml
-
Crea un despliegue y servicio para Nginx:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx namespace: default spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
Aplica el archivo:
kubectl apply -f nginx-deployment.yaml
Paso 4: Configurar el Ingress con las Rutas /apache
y /nginx
Crea un archivo ingress.yaml
para definir las rutas de Ingress
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
labels:
app.kubernetes.io/instance: ingress-nginx
spec:
ingressClassName: nginx
rules:
- host: myapp.local
http:
paths:
- path: /apache
pathType: Prefix
backend:
service:
name: apache
port:
number: 80
- path: /nginx
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
Aplica la configuración de Ingress
:
kubectl apply -f ingress.yaml
Paso 5: Configurar el Dominio en el Archivo /etc/hosts
Agrega el dominio myapp.local
en el archivo /etc/hosts
de tu máquina local para que apunte a la IP asignada por MetalLB (por ejemplo, 192.168.0.240
):
192.168.0.240 myapp.local # Usa la IP asignada por MetalLB en el rango configurado
Paso 6: Verifica el Acceso a las Rutas
Una vez configurado, prueba acceder a las rutas:
http://myapp.local/apache
debería mostrar la página de Apache.http://myapp.local/nginx
debería mostrar la página de Nginx.
Conclusión
Este tutorial configura MetalLB
y Ingress
en Kubernetes en un entorno bare-metal, proporcionando acceso sin necesidad de modificar manualmente el tipo de servicio o redirigir puertos.