Anuncio BGP de direcciones IP externas para servicios de tipo LoadBalancer e Ingresses mediante NetScaler CPX

Last published : Oct 02, 2026
El soporte para servicios de Kubernetes de tipo LoadBalancer es proporcionado por balanceadores de carga en la nube en un entorno de nube. Los proveedores de servicios en la nube habilitan este soporte creando automáticamente un balanceador de carga y asignando una dirección IP que se muestra como parte del estado del servicio. Cualquier tráfico destinado a la dirección IP externa es balanceado en NodeIP y NodePort por el balanceador de carga en la nube. Una vez que el tráfico llega al clúster de Kubernetes, kube-proxy realiza el enrutamiento a los pods de aplicación reales utilizando iptables o reglas de servidor virtual IP. Sin embargo, para entornos locales, la configuración automática del balanceador de carga en la nube no está disponible.
Puede exponer los servicios de tipo LoadBalancer utilizando el NetScaler Ingress Controller y dispositivos NetScaler de Nivel 1 como NetScaler VPX o MPX. El NetScaler VPX o MPX que reside fuera del clúster de Kubernetes balancea la carga del tráfico entrante a los servicios de Kubernetes. Para obtener más información sobre dicha implementación, consulte Exponer servicios de tipo LoadBalancer.
Sin embargo, no siempre es factible utilizar un dispositivo ADC externo para exponer el servicio de tipo LoadBalancer en un entorno local. A veces, es deseable gestionar todos los recursos relacionados desde el propio clúster de Kubernetes sin ningún componente externo. El NetScaler Ingress Controller proporciona una forma de exponer el servicio de tipo LoadBalancer utilizando NetScaler CPX que se ejecuta dentro del clúster de Kubernetes. Se aprovecha la estructura BGP existente para enrutar el tráfico a los nodos de Kubernetes para implementar esta solución.
En esta implementación, NetScaler CPX se implementa como un daemonset en los nodos de Kubernetes en modo host. NetScaler CPX establece una sesión de emparejamiento BGP con sus enrutadores de red y utiliza esa sesión de emparejamiento para anunciar las direcciones IP de los servicios de clúster externos. Si sus enrutadores tienen capacidad ECMP, el tráfico se balancea a múltiples instancias de CPX por el enrutador ascendente, que a su vez balancea la carga a los pods de aplicación reales. Cuando implementa NetScaler CPX con este modo, NetScaler CPX agrega reglas de iptables para cada servicio de tipo LoadBalancer en los nodos de Kubernetes. El tráfico destinado a la dirección IP externa se enruta a los pods de NetScaler CPX.
El siguiente diagrama explica una implementación donde NetScaler CPX expone un servicio de tipo LoadBalancer:
citrix-adc-cpx-service-type-lb
Como se muestra en el diagrama, NetScaler CPX se ejecuta como un daemon set y ejecuta una sesión BGP sobre el puerto 179 en la dirección IP del nodo apuntada por el recurso de nodo de Kubernetes. Para cada servicio de tipo LoadBalancer añadido al servidor API de Kubernetes, el NetScaler Ingress Controller configura el NetScaler CPX para anunciar la dirección IP externa al enrutador BGP configurado. Se utiliza un prefijo /32 para anunciar las rutas al enrutador externo y la dirección IP del nodo se utiliza como puerta de enlace para alcanzar la dirección IP externa. Una vez que el tráfico llega al nodo de Kubernetes, la regla de iptables dirige el tráfico a NetScaler CPX, que a su vez balancea la carga a los pods de servicio reales.
Con esta implementación, también puede utilizar recursos de entrada de Kubernetes y anunciar la dirección IP virtual (VIP) de Ingress al enrutador. Puede especificar la variable de entorno NS_VIP al implementar el NetScaler Ingress Controller, que actúa como VIP para todos los recursos de entrada. Cuando se añade un recurso Ingress, NetScaler CPX anuncia la NS_VIP a los enrutadores externos a través de BGP para atraer el tráfico. Una vez que el tráfico llega a la NS_VIP, NetScaler CPX realiza la conmutación de contenido y el balanceo de carga según lo especificado en el recurso Ingress.
Nota:
Para que esta solución funcione, el NetScaler Ingress Controller debe ejecutarse como usuario root y debe tener la capacidad NET_ADMIN.

Implementar la solución NetScaler CPX para servicios de tipo LoadBalancer

Este procedimiento explica cómo implementar NetScaler CPX como un daemonset en la red del host para exponer servicios de tipo LoadBalancer.
Esta configuración incluye las siguientes tareas:
  • Implementar NetScaler CPX con el NetScaler Ingress Controller como sidecar
  • Configuración de BGP
  • Configuración del servicio

Requisitos previos

  • Debe configurar el enrutador ascendente para el enrutamiento BGP con soporte ECMP y agregar los nodos de Kubernetes como vecinos.
  • Si el enrutador admite el equilibrio de carga, es mejor usar un algoritmo de hash ECMP estable para el equilibrio de carga con una entropía más alta para un equilibrio de carga uniforme.
Realice lo siguiente:
  1. Descargue el archivo rbac.yaml y despliegue las reglas RBAC para NetScaler CPX y NetScaler Ingress Controller.
    kubectl apply -f rbac.yaml
  2. Descargue el citrix-k8s-cpx-ingress.yml usando el siguiente comando.
    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
  3. Edite el archivo citrix-k8s-cpx-ingress.yaml y especifique los valores requeridos.
    • El argumento –configmap especifica la ubicación de ConfigMap para NetScaler Ingress Controller en la forma de namespace/name.
    • El argumento --ipam citrix-ipam-controller se puede especificar si está ejecutando NetScaler IPAM Controller para la asignación automática de direcciones IP.
    • (Opcional) nodeSelector para seleccionar los nodos donde necesita ejecutar el daemonset de NetScaler CPX. Por defecto, se ejecuta en todos los nodos de trabajo.
  4. Aplique el archivo citrix-k8s-cpx-ingress.yaml para crear un daemonset que inicie NetScaler CPX y NetScaler Ingress Controller.
    kubectl apply -f citrix-k8s-cpx-ingress.yml
  5. Cree un ConfigMap (configmap.yaml) con la configuración BGP que se pasa como argumento a NetScaler Ingress Controller. Para obtener información detallada sobre la configuración BGP, consulte Configuración de BGP.
    Debe tener la siguiente información para configurar el enrutamiento BGP:
    • La dirección IP del router a la que se conectará NetScaler CPX
    • El sistema autónomo (número AS) del router
    • El número AS para NetScaler CPX
    A continuación se muestra un ejemplo de ConfigMap con la configuración BGP.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config
      labels:
        app: cic
    data:
      NS_BGP_CONFIG: |
        bgpConfig:
        - bgpRouter:
            localAS: 100
            neighbor:
            - address: 10.102.33.33
              remoteAS: 100
              advertisementInterval: 10
              ASOriginationInterval: 10
  6. Aplique el ConfigMap creado en el paso 5 para aplicar la configuración BGP.
    kubectl apply -f configmap.yaml
  7. Cree un archivo YAML con la configuración necesaria para el servicio de tipo LoadBalancer.
    Nota:
    Para obtener información detallada, consulte configuración del servicio. La sección de configuración del servicio explica diferentes formas de obtener una dirección IP externa para el servicio y también cómo usar la anotación de servicio proporcionada por NetScaler para configurar diferentes funcionalidades de NetScaler.
    A continuación se muestra un ejemplo de configuración de servicio de tipo LoadBalancer.
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard-service
      annotations:
        # This uses IPAM to allocate an IP from range 'Dev'
        # service.citrix.com/ipam-range: 'Dev'
        service.citrix.com/frontend-ip: 172.217.163.17
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'
        service.citrix.com/lbvserver: '{"80-tcp":{"lbmethod":"ROUNDROBIN"}}'
        service.citrix.com/servicegroup: '{"80-tcp":{"usip":"yes"}}'
        service.citrix.com/ssl-termination: edge
        service.citrix.com/monitor: '{"80-tcp":{"type":"http"}}'
        service.citrix.com/frontend-httpprofile: '{"dropinvalreqs":"enabled", "websocket" : "enabled"}'
        service.citrix.com/backend-httpprofile: '{"dropinvalreqs":"enabled", "websocket" : "enabled"}'
        service.citrix.com/frontend-tcpprofile: '{"ws":"enabled", "sack" : "enabled"}'
        service.citrix.com/backend-tcpprofile: '{"ws":"enabled", "sack" : "enabled"}'
        service.citrix.com/frontend-sslprofile: '{"hsts":"enabled", "tls12" : "enabled"}'
        service.citrix.com/backend-sslprofile: '{"tls12" : "enabled"}
        service.citrix.com/ssl-certificate-data-1: |
          -----BEGIN-----
               [...]
          -----END-----
        service.citrix.com/ssl-key-data-1: |
    spec:
      type: LoadBalancer
      selector:
        app: kuard
      ports:
      - port: 80
        targetPort: 8080
        name: http
      - port: 443
        targetPort: 8443
        name: https
  8. Aplique el servicio de tipo LoadBalancer.
    kubectl apply -f service-example.yaml
Una vez aplicado el servicio, el NetScaler Ingress Controller crea un servidor virtual de equilibrio de carga con la inyección de estado de ruta BGP habilitada. Si el estado del servidor virtual de equilibrio de carga es UP, la ruta para la dirección IP externa se anuncia al router vecino con un prefijo /32 y la dirección IP del nodo como puerta de enlace.

Configuración BGP

La configuración BGP se realiza utilizando el ConfigMap que se pasa como argumento al NetScaler Ingress Controller.
Debe tener la siguiente información para configurar el enrutamiento BGP:
  • La dirección IP del enrutador para que NetScaler CPX pueda conectarse a él
  • El sistema autónomo (número AS) del enrutador
  • El número AS para NetScaler CPX
En el siguiente ConfigMap para la configuración BGP, el campo bgpConfig representa la configuración BGP.

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  labels:
    app: cic
data:
  NS_BGP_CONFIG: |
    bgpConfig:
    - bgpRouter:
        localAS: 100
        neighbor:
        - address: x.x.x.x
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
La siguiente tabla explica los distintos campos del campo bgpConfig.
Campo Descripción Tipo Valor predeterminado Obligatorio
nodeSelector Si el campo nodeSeclector está presente, la configuración del enrutador BGP es aplicable para los nodos que coinciden con el campo nodeSelector. nodeSelector acepta pares key=value separados por comas, donde cada clave representa un nombre de etiqueta y el valor es el valor de la etiqueta. Por ejemplo: nodeSelector: datacenter=ds1,rack-rack1 cadena No
bgpRouter Especifica la configuración BGP. Para obtener información sobre los diferentes campos de bgpRouter, consulte la siguiente tabla. bgpRouter Sí
La siguiente tabla explica los campos para el campo bgpRouter.
Campo Descripción Tipo Valor predeterminado Obligatorio
localAS Número AS para el NetScaler CPX entero Sí
neighbor Configuración BGP del router vecino. vecino Sí
La siguiente tabla explica el campo neighbor.
Campo Descripción Tipo Valor predeterminado Obligatorio
address Dirección IP del router vecino. cadena Sí
remoteAS Número AS del router vecino. entero Sí
advertisementInterval Este campo establece un intervalo mínimo entre el envío de actualizaciones de enrutamiento BGP (en segundos). entero 10 segundos Sí
ASOriginationInterval Este campo establece el intervalo de envío de actualizaciones de enrutamiento de origen AS (en segundos). entero 10 segundos Sí

Vecinos diferentes para nodos diferentes

De forma predeterminada, cada nodo del clúster se conecta a todos los vecinos enumerados en la configuración. Sin embargo, si el clúster de Kubernetes se extiende por diferentes centros de datos o redes, es posible que se requieran diferentes configuraciones de vecinos para diferentes nodos. Puede usar el campo nodeSelector para seleccionar los nodos necesarios para las configuraciones de enrutamiento BGP.
selector de nodo
A continuación se muestra un ejemplo de ConfigMap con la configuración nodeSelector:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config
  labels:
    app: cic
data:
  NS_BGP_CONFIG: |
    bgpConfig:
    - nodeSelector: datacenter=ds1
      bgpRouter:
        localAS: 100
        neighbor:
        - address: 10.102.33.44
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
    - nodeSelector: datacenter=ds2
      bgpRouter:
        localAS: 100
        neighbor:
        - address: 10.102.28.12
          remoteAS: 100
          advertisementInterval: 10
          ASOriginationInterval: 10
En este ejemplo, el router con la dirección IP 10.102.33.44 se utiliza como vecino por los nodos con la etiqueta datacenter=ds1. El router con la dirección IP 10.102.28.12 es utilizado por los nodos con la etiqueta datacenter=ds2.

Configuración del servicio

Configuración de la dirección IP externa

Se puede obtener una dirección IP externa para el servicio de tipo LoadBalancer utilizando uno de los siguientes métodos.
  • Especificando la anotación service.citrix.com/frontend-ip en la especificación del servicio de la siguiente manera.
    metadata:
        annotations:
            service.citrix.com/frontend-ip: 172.217.163.17
  • Especificando una dirección IP en el campo spec.loadBalancerIP de la especificación del servicio de la siguiente manera.
    spec:
        loadBalancerIP: 172.217.163.17
  • Asignando automáticamente una dirección IP virtual al servicio mediante el controlador IPAM proporcionado por NetScaler. Si se especifica uno de los otros dos métodos, ese método tiene prioridad sobre el controlador IPAM. La solución IPAM está diseñada de tal manera que puede integrar fácilmente la solución con proveedores de ExternalDNS como Infoblox. Para obtener más información, consulte Interoperabilidad con ExternalDNS. Para implementar y usar el controlador IPAM de NetScaler, consulte la documentación.

Configuración de anotaciones de servicio

El NetScaler Ingress Controller proporciona muchas anotaciones de servicio para aprovechar las diversas funcionalidades de NetScaler. Por ejemplo, el tipo de servicio predeterminado para el servidor virtual de equilibrio de carga es TCP, pero puede anular esta configuración mediante la anotación service.citrix.com/service-type.
metadata:
    annotations:
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'
Con la ayuda de varias anotaciones proporcionadas por el NetScaler Ingress Controller, puede aprovechar diversas funcionalidades de ADC como la descarga SSL, las políticas de reescritura y respuesta HTTP, y otras definiciones de recursos personalizados (CRD).
Para obtener más información sobre todas las anotaciones para el servicio de tipo LoadBalancer, consulte anotaciones de servicio.
Para usar recursos secretos para certificados SSL para servicios de tipo LoadBalancer, consulte Certificado SSL para servicios de tipo LoadBalancer.

Configuración de la política de tráfico externo

De forma predeterminada, el NetScaler Ingress Controller agrega todos los pods de servicio como back-end para el servicio virtual de equilibrio de carga en NetScaler CPX. Este paso garantiza una mayor alta disponibilidad y una distribución equitativa a las instancias de pod de servicio. Todos los nodos que ejecutan NetScaler CPX anuncian las rutas al servidor ascendente y atraen el tráfico del router. Este comportamiento se puede cambiar configurando el spec.externalTrafficPolicy del servicio en Local. Cuando la política de tráfico externo se establece en Local, solo los pods que se ejecutan en el mismo nodo se agregan como back-end para el servidor virtual de equilibrio de carga, como se muestra en el siguiente diagrama. En este modo, solo aquellos nodos que tienen los pods de servicio anuncian la dirección IP externa al router y CPX envía el tráfico solo a los pods locales. Si no desea que el tráfico salte entre los nodos por razones de rendimiento, puede usar esta función.

Uso de recursos Ingress

El NetScaler Ingress Controller proporciona una variable nt NS_VIP, que es la dirección IP externa para todos los recursos Ingress. Cada vez que se añade un recurso Ingress, NetScaler CPX anuncia la dirección IP de Ingress a los enrutadores externos. El NetScaler Ingress Controller proporciona varias anotaciones para Ingress. Para obtener más información, consulte la documentación de anotaciones de Ingress.
Realice los siguientes pasos para la configuración de Ingress:
  1. Descargue el archivo rbac.yaml e implemente las reglas RBAC para NetScaler CPX y NetScaler Ingress Controller.
    kubectl apply -f rbac.yaml
  2. Descargue el archivo citrix-k8s-cpx-ingress.yml mediante el siguiente comando.
    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
  3. Edite el archivo citrix-k8s-cpx-ingress.yml y especifique los valores requeridos.
    • El argumento –configmap especifica la ubicación de ConfigMap para NetScaler Ingress Controller en forma de espacio de nombres o nombre.
    • La variable de entorno NS_VIP para especificar la IP externa que se utilizará para todos los recursos Ingress. (Este es un parámetro obligatorio).
  4. Aplique el archivo citrix-k8s-cpx-ingress.yml para crear un daemonset que inicie NetScaler CPX y NetScaler Ingress Controller.
    kubectl apply -f citrix-k8s-cpx-ingress.yml
  5. Configure BGP mediante ConfigMap como se muestra en la sección anterior.
  6. Implemente un recurso Ingress de ejemplo como se indica a continuación. Este paso anuncia la dirección IP especificada en la variable de entorno NS_VIP al enrutador externo configurado en ConfigMap.
    kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/ingress-example.yaml
  7. Acceda a la aplicación mediante NS_VIP:<port>. De forma predeterminada, Ingress utiliza el puerto 80 para la comunicación no segura y el puerto 443 para la comunicación segura (si se proporciona la sección TLS).
Nota: Actualmente, la anotación ingress.citrix.com/frontend-ip no es compatible con los anuncios BGP.

Instalación de Helm

Puede utilizar los gráficos de Helm para instalar NetScaler CPX como enrutador BGP. Para obtener más información, consulte la documentación de gráficos de Helm de Citrix.

Solución de problemas

  • Por defecto, NetScaler CPX utiliza el rango de direcciones IP 192.168.1.0/24 para la comunicación interna, la dirección IP 192.168.1.1 como puerta de enlace interna al host y la dirección IP 192.168.1.2 como NSIP. Los puertos 9080 y 9443 se utilizan como puertos de administración entre NetScaler Ingress Controller y NetScaler CPX para HTTP y HTTPS. Si la red 192.168.1.0/24 se encuentra dentro del rango de PodCIDR, puede asignar un conjunto diferente de direcciones IP para la comunicación interna. Las variables de entorno NS_IP y NS_GATEWAY controlan qué dirección IP utiliza NetScaler CPX para NSIP y la puerta de enlace, respectivamente. La misma dirección IP también debe especificarse como parte de la variable de entorno NS_IP de NetScaler Ingress Controller para establecer la comunicación entre NetScaler Ingress Controller y NetScaler CPX.
  • De forma predeterminada, BGP en NetScaler CPX se ejecuta en el puerto 179 y todo el tráfico BGP que llega al puerto TCP 179 es gestionado por NetScaler CPX. Si hay un conflicto, por ejemplo, si está utilizando la capacidad de emparejamiento BGP externo de Calico para anunciar los prefijos de su clúster a través de BGP, puede cambiar el puerto BGP con la variable de entorno para NetScaler Ingress Controller BGP_PORT.
  • El modo de uso de IP de origen (USIP) de NetScaler no funciona debido a las restricciones en Kubernetes. Si el servicio requiere la dirección IP de origen, puede habilitar la función CIP (encabezado IP de cliente) en los servicios de tipo HTTP/SSL mediante las siguientes anotaciones.
    service.citrix.com/servicegroup: '{"cip":"ENABLED", “cipheader”:”x-forwarded-for”}'