Sobes.tech
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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Acceso directo a NodePort/HostPort en un Pod:

    • Se puede especificar hostPort en 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, nodePort se puede especificar en un Servicio de tipo NodePort.

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.