Sobes.tech
Middle+

¿Cómo se implementa el balanceo de carga en Kubernetes?

sobes.tech AI

Respuesta de la IA

El balanceo de carga en Kubernetes se implementa en varios niveles:

  1. Servicio (a nivel de Kube-proxy):

    • Cada Pod en el Servicio recibe una dirección IP única.
    • Kube-proxy, que funciona en cada nodo, supervisa los cambios en el Servicio y EndpointSlice.
    • Configura reglas de redirección de tráfico (iptables, ipvs) hacia la IP del clúster del Servicio.
    • El tráfico dirigido a la IP del clúster del Servicio se distribuye entre los Pods de ese Servicio según el algoritmo seleccionado (por defecto Round Robin).
    • Hay dos modos de operación para Kube-proxy: iptables (estándar, basado en Linux netfilter) y ipvs (más eficiente para clústeres grandes, basado en Virtual Server API).
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app # Selecciona Pods con la etiqueta app: my-app
      ports:
        - protocol: TCP
          port: 80 # Puerto en el Servicio
          targetPort: 8080 # Puerto en los Pods
    
  2. Ingress (a nivel L7):

    • Funciona como un punto de entrada único para la balanceo de carga HTTP/S externo.
    • Se requiere un controlador de Ingress (por ejemplo, Nginx Ingress Controller) para implementar las reglas.
    • Redirige el tráfico a un Servicio específico dentro del clúster basado en la ruta URL, el nombre del host y otras reglas L7.
    • Permite implementar diversas estrategias de balanceo, terminación SSL, hosting virtual basado en nombres.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service # Redirige el tráfico a este Servicio
                port:
                  number: 80
    
  3. LoadBalancer Service (a nivel de proveedor de nube):

    • Al crear un Servicio con el tipo LoadBalancer, Kubernetes interactúa con la API del proveedor de la nube (AWS, GCP, Azure, etc.).
    • El proveedor crea un balanceador de carga externo que redirige el tráfico a los nodos del clúster.
    • Luego, Kube-proxy redirige el tráfico a los Pods dentro del clúster.
    • Este tipo de Servicio proporciona acceso externo y balanceo en el nivel L4 (TCP/UDP) o L7 (HTTP/S) según el proveedor.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-external-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer # Crea un balanceador de carga externo
    
  4. Balanceadores de carga personalizados (por ejemplo, HAProxy, Nginx como Pods):

    • Se puede desplegar un balanceador de carga dentro del clúster como Deployment y Service (ClusterIP o NodePort).
    • Configurar el tráfico externo a este Service.
    • El balanceador distribuirá el tráfico entre otros Pods.

De esta forma, Kubernetes ofrece un enfoque multinivel para el balanceo de carga, combinando mecanismos integrados (Service, Kube-proxy) con soluciones externas (Ingress, Balanceadores de carga del proveedor de nube) y la capacidad de desplegar balanceadores personalizados.