Middle
¿Cómo podemos acceder al contenedor de Kubernetes en el que se ejecuta la aplicación desde la red externa?
sobes.tech AI
Respuesta de la IA
Existen varias formas principales de acceder a un contenedor de Kubernetes desde una red externa:
-
Servicio tipo LoadBalancer:
- Los proveedores de la nube (AWS, GCP, Azure) crean un equilibrador de carga externo que dirige el tráfico a los pods de tu aplicación.
- Se asigna una dirección IP externa.
- La forma más sencilla en un entorno en la nube.
-
Servicio tipo NodePort:
- Abre un puerto en cada nodo del clúster.
- Este puerto redirige el tráfico al servicio de tu aplicación.
- Se accede mediante la IP de cualquier nodo y el número de NodePort.
- Menos escalable y seguro que LoadBalancer.
-
Servicio tipo ClusterIP junto con Ingress:
- ClusterIP - servicio accesible solo dentro del clúster.
- Ingress - objeto API que gestiona el acceso externo a los servicios en el clúster.
- El controlador de Ingress (por ejemplo, Nginx Ingress Controller, Traefik) escucha el tráfico externo y lo enruta al servicio ClusterIP adecuado.
- Permite gestionar de forma centralizada el enrutamiento, la terminación SSL, el balanceo de carga.
- Enfoque flexible y escalable.
-
Servicio tipo ExternalName:
- Crea un alias para un dominio externo. No proporciona acceso directo al contenedor a través de este servicio, pero permite usar un nombre DNS dentro del clúster para acceder a un recurso externo. No es adecuado para acceso directo al contenedor desde fuera.
-
Acceso directo a NodePort/HostPort en un Pod:
- Se puede especificar
hostPorten la especificación del pod para abrir un puerto en el nodo donde se ejecuta el pod. Muy desaconsejado para entornos de producción debido a la baja gestionabilidad y posibles conflictos de puertos. - De manera similar,
nodePortse puede especificar en un Servicio de tipo NodePort.
- Se puede especificar
Ejemplos de configuraciones:
-
Servicio LoadBalancer:
// service.yaml apiVersion: v1 kind: Service metadata: name: my-app-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer -
Servicio NodePort:
// service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: my-app-service-np spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30000 # opcional, Kubernetes asignará si no se especifica type: NodePort -
Ingress (para servicio ClusterIP):
// service-clusterip.yaml (se asume que ya existe) apiVersion: v1 kind: Service metadata: name: my-app-service-ci spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP// ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service-ci port: number: 80
La elección del método depende de los requisitos de escalabilidad, seguridad, entorno de despliegue (nube o on-premise) y la necesidad de gestión centralizada del acceso. Ingress es la solución preferida para sistemas en producción.