Configura el balanceo de cargas en paquetes con MetalLB

En esta página, se describe cómo configurar el balanceo de cargas en paquetes con MetalLB para GKE en Bare Metal. Los balanceadores de cargas de MetalLB se ejecutan en un grupo dedicado de nodos trabajadores o en los mismos nodos que el plano de control.

Consulta la Descripción general de los balanceadores de cargas para obtener ejemplos de topologías de balanceo de cargas disponibles en GKE en Bare Metal.

Requisitos

  • Todos los nodos del balanceador de cargas deben estar en la misma subred de capa 2.
  • Todos los VIP deben estar en la subred de nodos del balanceador de cargas y deben enrutarse a través de la puerta de enlace de la subred.
  • La puerta de enlace de la subred del balanceador de cargas debe escuchar los mensajes ARP injustificados y reenviar paquetes ARP a los nodos del balanceador de cargas.

Campos de configuración

Edita la sección cluster.spec.loadBalancer del archivo de configuración del clúster para configurar el balanceo de cargas en paquetes. Para obtener información sobre los archivos de configuración de clúster y ejemplos de configuraciones válidas, consulta una de las páginas siguientes:

loadBalancer.mode

Este valor debe ser bundled para habilitar el balanceo de cargas en paquetes.

loadBalancer.ports.controlPlaneLBPort

Este valor especifica el puerto de destino que se usará para el tráfico enviado al plano de control de Kubernetes (los servidores de la API de Kubernetes).

loadBalancer.vips.controlPlaneVIP

Este valor especifica la dirección IP de destino que se usará para el tráfico enviado al plano de control de Kubernetes (los servidores de la API de Kubernetes). Esta dirección IP debe estar en la misma subred de capa 2 que los nodos del clúster. No incluyas esta dirección en la sección address pools del archivo de configuración.

loadBalancer.vips.ingressVIP

Este valor especifica la dirección IP que se usará para los servicios detrás del balanceador de cargas para el tráfico de entrada. No se permite este campo en los archivos de configuración del clúster de administrador. Esta dirección debe aparecer en la sección de grupos de direcciones de la configuración.

loadBalancer.addressPools

Esta sección de la configuración contiene uno o más grupos de direcciones. Cada grupo de direcciones especifica una lista de rangos de direcciones IP. Cuando creas un servicio de tipo LoadBalancer, las direcciones IP externas del Service se eligen a partir de estos rangos.

Los grupos de direcciones se especifican en el siguiente formato:

- name: POOL_NAME
  avoidBuggyIPs: BOOLEAN
  manualAssign: BOOLEAN
  addresses:
  - IP_RANGE
  - IP_RANGE2
  • name: Es el nombre del grupo de direcciones, pool-name, para tus propios fines organizativos. Este campo es inmutable.
  • avoidBuggyIPs: true o false (opcional). Si es true, el grupo omite las direcciones IP que terminan en .0 y .255. Algunos hardware de red descartan el tráfico hacia estas direcciones especiales. Puedes omitir este campo; su valor predeterminado es false. Este campo es mutable.
  • manualAssign: true o false (opcional). Si es true, las direcciones de este grupo no se asignan de forma automática a los servicios de Kubernetes. Si es true, solo se usa una dirección IP de este grupo cuando un servicio la especifica de forma explícita. Puedes omitir este campo; su valor predeterminado es false. Este campo es mutable.
  • addresses Una lista de uno o más rangos de direcciones IP no superpuestas. ip-range se puede especificar en la notación CIDR (como 198.51.100.0/24) o en la notación de rango (como 198.51.100.0-198.51.100.10, sin espacios alrededor del guion). Este campo es inmutable.

Los rangos de direcciones IP de la lista addresses no deben superponerse y deben estar en la misma subred que los nodos que ejecutan balanceadores de cargas.

loadBalancer.nodePoolSpec

En esta sección de la configuración, se especifica una lista de nodos para ejecutar balanceadores de carga. Los nodos del balanceador de cargas pueden ejecutar cargas de trabajo regulares de forma predeterminada. no hay un taint especial en esos nodos. Aunque los nodos del grupo de nodos del balanceador de cargas pueden ejecutar cargas de trabajo, son independientes de los nodos en los grupos de nodo trabajador. No puedes incluir un nodo de clúster determinado en más de un grupo de nodos. La superposición de direcciones IP de nodo entre grupos de nodos bloquea la creación de clústeres y otras operaciones de clúster.

Si deseas evitar que las cargas de trabajo se ejecuten en un nodo en el grupo de nodos del balanceador de cargas, agrega el siguiente taint al nodo:

node-role.kubernetes.io/load-balancer:NoSchedule

GKE en Bare Metal agrega tolerancias para este taint a los Pods que se necesitan en el balanceo de cargas.

nodePoolSpec:
  nodes:
  - address: 10.0.0.32
  - address: 10.0.0.33

Todos los nodos del grupo de nodos del balanceador de cargas deben estar en la misma subred de capa 2 que las VIP del balanceador de cargas configuradas en la sección loadBalancer.addressPools del archivo de configuración.

Si no se configura nodePoolSpec, los balanceadores de cargas en paquetes se ejecutan en los nodos del plano de control. Te recomendamos que, cuando sea posible, ejecutes balanceadores de cargas en grupos de nodos separados.

Balanceo de cargas del plano de control

El balanceador de cargas del plano de control entrega la dirección IP virtual (VIP) del plano de control. GKE en Bare Metal ejecuta Keepalived y Aspera como pods estáticos de Kubernetes en los nodos del balanceador de cargas para anunciar la VIP del plano de control. Keepalived usa el protocolo de redundancia de router virtual (VRRP) en los nodos del balanceador de cargas para obtener alta disponibilidad.

Balanceo de cargas del plano de datos

El balanceador de cargas del plano de datos es para todos los servicios de Kubernetes del tipo LoadBalancer. GKE en Bare Metal usa MetalLB que se ejecuta en modo de capa 2 para el balanceo de cargas del plano de datos. El balanceo de cargas del plano de datos solo se puede configurar a través de GKE en Bare Metal. No modifiques el ConfigMap de MetalLB directamente. Puedes usar todas las funciones de MetalLB, incluido el uso compartido de direcciones IP en todos los servicios. Consulta la documentación de MetalLB para obtener información sobre las funciones.

MetalLB ejecuta un Pod de bocina en cada nodo con un daemonset, con memberlist para una alta disponibilidad. Hay un nodo de balanceador de cargas dedicado de MetalLB para cada servicio de Kubernetes, en lugar de uno para todo el clúster. De esta manera, el tráfico se distribuye entre los nodos del balanceador de cargas si hay varios servicios.

Los balanceadores de cargas del plano de datos pueden ejecutarse en los nodos del plano de control o en un subconjunto de nodos trabajadores. La creación de balanceadores de cargas de planos de datos en los nodos del plano de control aumenta el uso de los nodos del plano de control. Sin embargo, la dependencia de los nodos del plano de control también aumenta el riesgo de sobrecargar el plano de control y aumenta el perfil de riesgo de la información confidencial del plano de control, como las claves SSH.

Preservación de la dirección IP de origen del cliente

El Service LoadBalancer que se creó con la solución de balanceo de cargas de capa 2 en paquetes usa la configuración Cluster predeterminada para la política de tráfico externo. Esta configuración, spec.externalTrafficPolicy: Cluster, enruta el tráfico externo a los extremos de todo el clúster, pero también oculta la dirección IP de origen del cliente.

En las siguientes secciones, se describe cómo configurar tu clúster para conservar la dirección IP de origen del cliente.

Services de NodePort

Kubernetes realiza la traducción de direcciones de red (NAT) de origen para los Services de NodePort. Para conservar las direcciones IP de origen del cliente, establece service.spec.externalTrafficPolicy como Local. Kubernetes ya no realizará NAT de origen, pero debes asegurarte de que haya Pods que se ejecuten exactamente en la IP que seleccionaste.

Services de LoadBalancer

Cuando uses externalTrafficPolicy: Local en los Services de LoadBalancer, configura los Pods de la aplicación para que se ejecuten exactamente en los nodos del balanceador de cargas. Agrega el siguiente nodeSelector a tus Pods de aplicación para realizar este cambio:

apiVersion: v1
kind: Pod
...
spec:
  nodeSelector:
      baremetal.cluster.gke.io/lbnode: "true"
...

Entrada

Si tus aplicaciones son servicios HTTP, puedes lograr visibilidad de la IP de cliente si configuras componentes de Ingress:

  1. Abre el Service de istio-ingress para editarlo:

    kubectl edit service -n gke-system istio-ingress
  2. Agrega externalTrafficPolicy: Local a spec, guarda y sal del editor.

    apiVersion: v1
    kind: Service
    ...
    spec:
    ...
      externalTrafficPolicy: Local
    
  3. Abre el Deployment de istio-ingress para editarlo:

    kubectl edit deployment -n gke-system istio-ingress
  4. Agrega el siguiente nodeSelector al Deployment, guarda y sal del editor.

    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      ...
      template:
        ...
        spec:
          ...
          nodeSelector:
              baremetal.cluster.gke.io/lbnode: "true"
    ...
    

Ahora, todos tus servicios detrás de Ingress ven un encabezado X-Forwarded-For con la IP de cliente, como el siguiente ejemplo:

X-Forwarded-For: 21.0.104.4