Ingress Controller de Citrix ADC

Anuncio BGP de direcciones IP externas para servicios de tipo LoadBalancer e Ingresos mediante Citrix ADC CPX

La función de tipo LoadBalancer del servicio Kubernetes la proporcionan los equilibradores de carga en la nube en un entorno de nube. Los proveedores de servicios en la nube permiten este soporte al crear automáticamente un equilibrador de carga y asignar una dirección IP que se muestra como parte del estado del servicio. El equilibrador de carga en la nube equilibra la carga de cualquier tráfico destinado a la dirección IP externa en NodeIP y NodePort. Una vez que el tráfico llega al clúster de Kubernetes, kube-proxy realiza la redirección a los pods de aplicaciones reales mediante iptables o reglas de servidor virtual IP. Sin embargo, para entornos locales, la configuración automática del equilibrador de carga en la nube no está disponible.

Puede exponer los servicios de tipo LoadBalancer mediante el Citrix Ingress Controller y los dispositivos Citrix ADC de nivel 1, como Citrix ADC VPX o MPX. La carga de Citrix ADC VPX o MPX que reside fuera del clúster de Kubernetes equilibra el tráfico entrante a los servicios de Kubernetes. Para obtener más información sobre dicha implementación, consulte [Exponer servicios de tipo LoadBalancer] (/en-us/citrix-k8s-ingress-controller/network/type-loadbalancer.html).

Sin embargo, puede que no siempre sea factible usar un dispositivo ADC externo para exponer el servicio de tipo LoadBalancer en un entorno local. En ocasiones, es conveniente administrar todos los recursos relacionados desde el propio clúster de Kubernetes sin ningún componente externo. El Citrix Ingress Controller proporciona una forma de exponer el servicio de tipo LoadBalancer mediante Citrix ADC CPX que se ejecuta en el clúster de Kubernetes. La estructura BGP existente para redirigir el tráfico a los nodos de Kubernetes se aprovecha para implementar esta solución.

En esta implementación, Citrix ADC CPX se implementa como un demonio en los nodos de Kubernetes en modo host. Citrix ADC CPX establece una sesión de interconexión BGP con los enrutadores de red y utiliza esa sesión de interconexión para anunciar las direcciones IP de los servicios de clúster externos. Si sus enrutadores tienen capacidad ECMP, el enrutador ascendente equilibra la carga del tráfico a varias instancias CPX, lo que a su vez equilibra la carga con los pods de aplicaciones reales. Cuando implementa Citrix ADC CPX con este modo, Citrix ADC CPX agrega reglas iptables para cada servicio de tipo LoadBalancer en los nodos de Kubernetes. El tráfico destinado a la dirección IP externa se redirige a los pods de Citrix ADC CPX.

El siguiente diagrama explica una implementación en la que Citrix ADC CPX expone un servicio de tipo LoadBalancer:

citrix-adc-cpx-service-type-lb

Como se muestra en el diagrama, Citrix ADC CPX se ejecuta como un conjunto de daemon y ejecuta una sesión BGP en el puerto 179 en la dirección IP del nodo apuntada por el recurso de nodo de Kubernetes. Para cada servicio de tipo LoadBalancer agregado al servidor de la API de Kubernetes, el Citrix Ingress Controller de Citrix configura Citrix ADC CPX para anunciar la dirección IP externa al enrutador BGP configurado. Se usa un prefijo /32 para anunciar las rutas al enrutador externo y la dirección IP del nodo se usa como puerta de enlace para llegar a la dirección IP externa. Una vez que el tráfico llega al nodo de Kubernetes, la regla iptables dirige el tráfico a Citrix ADC CPX, que a su vez equilibra la carga a los pods de servicio reales.

Con esta implementación, también puede usar los recursos de entrada de Kubernetes y anunciar la dirección IP virtual (VIP) de entrada en el enrutador. Puede especificar la variable de entorno NS_VIP al implementar el Citrix Ingress Controller, que actúa como VIP para todos los recursos de entrada. Cuando se agrega un recurso Ingress, Citrix ADC CPX anuncia a los enrutadores externos NS_VIP a través de BGP para atraer el tráfico. Una vez que el tráfico llega a NS_VIP, Citrix ADC CPX realiza la conmutación de contenido y el equilibrio de carga como se especifica en el recurso de entrada.

Nota:

Para que esta solución funcione, el Citrix Ingress Controller debe ejecutarse como usuario raíz y debe tener la prestación NET_ADMIN.

Implementar la solución Citrix ADC CPX para servicios de tipo LoadBalancer

En este procedimiento se explica cómo implementar Citrix ADC CPX como un demonio en la red host para exponer los servicios de tipo LoadBalancer.

Esta configuración incluye las siguientes tareas:

  • Implementar Citrix ADC CPX con el Citrix Ingress Controller como sidecar

  • Configuración de BGP

  • Configuración del servicio

Requisitos previos

  • Debe configurar el enrutador ascendente para la redirección BGP con soporte ECMP y agregar 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.

Lleve a cabo lo siguiente:

  1. Descargue el archivo rbac.yaml e implemente las reglas RBAC para Citrix ADC CPX y el Citrix Ingress Controller.

    kubectl apply -f rbac.yaml
    
  2. Descargue citrix-k8s-cpx-ingress.yml con 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. Modifique el archivo citrix-k8s-cpx-ingress.yaml y especifique los valores requeridos.

    • El argumento –configmap especifica la ubicación de ConfigMap para el controlador de entrada de Citrix en forma de namespace/name.
    • El argumento --ipam citrix-ipam-controller se puede especificar si ejecuta el controlador de Citrix IPAM para la asignación automática de direcciones IP.
    • (Opcional) nodeSelector para seleccionar los nodos en los que necesita ejecutar el daemonset de Citrix ADC CPX. De forma predeterminada, se ejecuta en todos los nodos de trabajo.
  4. Aplique el archivo citrix-k8s-cpx-ingress.yaml para crear un conjunto de demonios que inicie Citrix ADC CPX y el Citrix Ingress Controller.

      kubectl apply -f citrix-k8s-cpx-ingress.yml
    
  5. Cree un ConfigMap (configmap.yaml) con la configuración de BGP que se pasa como argumento al Citrix Ingress Controller. Para obtener información detallada sobre la configuración de BGP, consulte Configuración de BGP.

    Debe tener la siguiente información para configurar la redirección BGP:

    • La dirección IP del enrutador para que Citrix ADC CPX se conecte
    • El sistema autónomo (número AS) del enrutador
    • El número AS de Citrix ADC CPX

    A continuación se presenta un ejemplo de ConfigMap con la configuración de 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 de BGP.

    kubectl apply -f configmap.yaml

  7. Cree un archivo YAML con la configuración requerida 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 Citrix para configurar diferentes funcionalidades de Citrix ADC.

    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. Aplica el servicio de tipo LoadBalancer.

    kubectl apply -f service-example.yaml
    

Una vez que se aplica el servicio, el Citrix 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 de la dirección IP externa se anuncia al enrutador vecino con un prefijo /32 con la dirección IP del nodo como puerta de enlace.

Configuración de BGP

La configuración de BGP se realiza mediante ConfigMap, que se pasa como argumento al Citrix Ingress Controller.

Debe tener la siguiente información para configurar la redirección BGP:

  • La dirección IP del enrutador para que Citrix ADC CPX pueda conectarse a él
  • El sistema autónomo (número AS) del enrutador
  • El número AS de Citrix ADC CPX

En el siguiente ConfigMap para la configuración de BGP, el campo bgpConfig representa la configuración de 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
<!--NeedCopy-->

En la siguiente tabla se explican los distintos campos del campo bgpConfig.

Campo Descripción Tipo Valor predeterminado Si son necesarias
nodeSelector Si el campo nodeSeclector está presente, la configuración del enrutador BGP se aplica a los nodos que coinciden con el campo nodeSelector. nodeSelector acepta key=value pares separados por comas en los que cada clave representa un nombre de etiqueta y el valor es el valor de la etiqueta. Por ejemplo: nodeSelector: datacenter=ds1, rack-rack1 string   No
bgpRouter Especifica la configuración de BGP. Para obtener información sobre los diferentes campos del bgpRouter, consulte la siguiente tabla. Enrutador BGP  

En la siguiente tabla se explican los campos del campo bgpRouter.

Campo Descripción Tipo Valor predeterminado Si son necesarias
localAS Número AS para Citrix ADC CPX entero  
neighbor Configuración BGP del enrutador vecino. vecino  

En la siguiente tabla se explica el campo neighbor.

| Campo | Descripción | Tipo | Valor predeterminado | Si son necesarias | | ———————– | ————————————————————————————— | ——- | ————- | ——– | | address | Dirección IP del enrutador vecino. | string | | Sí | | remoteAS | Número AS del enrutador vecino. | entero | | | Sí | | advertisementInterval | Este campo establece un intervalo mínimo entre el envío de actualizaciones de redirección BGP (en segundos). | entero | 10 segundos | Sí | | ASOriginationInterval | Este campo establece el intervalo de envío de AS actualizaciones de redirección de origen (en segundos). | entero | 10 segundos | Sí |

Distintos vecinos para distintos nodos

De forma predeterminada, todos los nodos del clúster se conectan a todos los vecinos enumerados en la configuración. Sin embargo, si el clúster de Kubernetes se distribuye en diferentes centros de datos o redes diferentes, es posible que se requieran configuraciones de vecinos diferentes para diferentes nodos. Puede usar el campo nodeSelector para seleccionar los nodos requeridos para las configuraciones de redirección BGP.

node-selector

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
<!--NeedCopy-->

En este ejemplo, el enrutador con la dirección IP 10.102.33.44 se utiliza como vecino por los nodos con la etiqueta datacenter=ds1. Los nodos con la etiqueta utilizan el enrutador con la dirección IP 10.102.28.12 datacenter=ds2.

Configuración del servicio

Configuración de direcciones IP externas

Se puede obtener una dirección IP externa para el servicio de tipo LoadBalancer mediante uno de los métodos siguientes.

  • Especificar 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
    
  • Especificar 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
    
  • Al asignar automáticamente una dirección IP virtual al servicio mediante el controlador IPAM proporcionado por Citrix. Si se especifica uno de los otros dos métodos, ese método tiene prioridad sobre el controlador de IPAM. La solución IPAM está diseñada de tal manera que puede integrar fácilmente la solución con proveedores de DNS externos como Infoblox. Para obtener más información, consulte Interoperabilidad con ExternalDNS. Para implementar y usar el controlador de Citrix IPAM, consulte la documentación.

Configuración de anotaciones de servicios

El Citrix Ingress Controller proporciona muchas anotaciones de servicio para aprovechar las diversas funcionalidades de Citrix ADC. 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 Citrix Ingress Controller, puede aprovechar varias funcionalidades de ADC, como la descarga de SSL, las directivas de reescritura y respuesta HTTP y otras definiciones de recursos personalizadas (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 los servicios de Type LoadBalancer, consulte Certificado SSL para servicios de tipo LoadBalancer.

Configuración de la directiva de tráfico externa

De forma predeterminada, el Citrix Ingress Controller agrega todos los pods de servicio como back-end para el servicio virtual de equilibrio de carga en Citrix ADC CPX. Este paso garantiza una mejor alta disponibilidad y una distribución equitativa en las instancias de pods de servicio. Todos los nodos que ejecutan Citrix ADC CPX anuncian las rutas al servidor ascendente y atraen el tráfico del enrutador. Este comportamiento se puede cambiar configurando spec.externalTrafficPolicy del servicio en Local. Cuando la directiva 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 los nodos que tienen los pods de servicio anuncian la dirección IP externa al enrutador y CPX envía el tráfico solo a los pods locales. Si no quiere que el tráfico salte a través de los nodos por motivos de rendimiento, puede utilizar esta función.

Directiva de tráfico exterior: local

Uso de los recursos de Ingress

El Citrix Ingress Controller proporciona una variable nt NS_VIP, que es la dirección IP externa de todos los recursos de entrada. Cada vez que se agrega un recurso de entrada, Citrix ADC CPX anuncia la dirección IP de entrada a los enrutadores externos. El Citrix Ingress Controller proporciona varias anotaciones para la entrada. Para obtener más información, consulte la documentación de anotaciones de entrada.

Realice los siguientes pasos para la configuración de entrada:

  1. Descargue el archivo rbac.yaml e implemente las reglas RBAC para Citrix ADC CPX y el Citrix Ingress Controller.

        kubectl apply -f rbac.yaml
    
  2. Descargue citrix-k8s-cpx-ingress.yml con 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. Modifique el archivo citrix-k8s-cpx-ingress.yml y especifique los valores requeridos.

    • El argumento –configmap especifica la ubicación de ConfigMap para el Citrix 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 de Ingress. (Este es un parámetro obligatorio).

  4. Aplique el archivo citrix-k8s-cpx-ingress.yml para crear un conjunto de demonios que inicie Citrix ADC CPX y el Citrix 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 de entrada de muestra de la siguiente manera. 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 usa el puerto 80 para la comunicación insegura 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 timón

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

Solución de problemas

  • De forma predeterminada. Citrix ADC CPX utiliza el intervalo 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 el Citrix Ingress Controller de Citrix y Citrix ADC CPX para HTTP y HTTPS. Si la red 192.168.1.0/24 se encuentra dentro del intervalo 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 Citrix ADC CPX para NSIP y gateway, respectivamente. También se debe especificar la misma dirección IP como parte de la variable de entorno del Citrix Ingress Controller NS_IP para establecer la comunicación entre el Citrix Ingress Controller de Citrix y Citrix ADC CPX.

  • De forma predeterminada, BGP en Citrix ADC CPX se ejecuta en el puerto 179 y todo el tráfico BGP que llega al puerto TCP 179 lo gestiona Citrix ADC CPX. Si hay un conflicto, por ejemplo, si utiliza la capacidad de interconexión BGP externa 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 al Citrix Ingress Controller BGP_PORT.

  • Usar el modo IP de origen (USIP) de Citrix ADC no funciona debido a las restricciones de 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 de servicio HTTP/SSL mediante las siguientes anotaciones.

    service.citrix.com/servicegroup: ‘{“cip”:”ENABLED”, “cipheader”:”x-forwarded-for”}’

Anuncio BGP de direcciones IP externas para servicios de tipo LoadBalancer e Ingresos mediante Citrix ADC CPX