Contrôleur d'entrée Citrix ADC

Publication BGP d’adresses IP externes pour les services LoadBalancer de type et les entrées à l’aide de Citrix ADC CPX

Le service de LoadBalancer support de type Kubernetes est fourni par des équilibreurs de charge cloud dans un environnement cloud. Les fournisseurs de services cloud permettent cette prise en charge en créant automatiquement un équilibreur de charge et en attribuant une adresse IP qui est affichée dans le cadre de l’état du service. Tout trafic destiné à l’adresse IP externe est équilibré en charge sur NodeIP et NodePort par l’équilibreur de charge cloud. Une fois que le trafic atteint le cluster Kubernetes, kube-proxy effectue le routage vers les espaces d’application réels à l’aide de règles de serveur virtuel IP ou iptables. Toutefois, pour les environnements sur site, la configuration automatique de l’équilibreur de charge cloud n’est pas disponible.

Vous pouvez exposer les services de type LoadBalancer à l’aide du Citrix ingress controller et des appareils Citrix ADC de niveau 1 tels que Citrix ADC VPX ou MPX. Le VPX ou le MPX Citrix ADC résidant en dehors du cluster Kubernetes équilibre la charge du trafic entrant vers les services Kubernetes. Pour plus d’informations sur ce type de déploiement, consultez Exposer les services de type LoadBalancer.

Cependant, il n’est pas toujours possible d’utiliser un périphérique ADC externe pour exposer le service de type LoadBalancer dans un environnement sur site. Il est parfois souhaitable de gérer toutes les ressources associées à partir du cluster Kubernetes lui-même sans aucun composant externe. Le Citrix ingress controller fournit un moyen d’exposer le service de type LoadBalancer à l’aide de Citrix ADC CPX qui s’exécute au sein du cluster Kubernetes. Le fabric BGP existant pour acheminer le trafic vers les nœuds Kubernetes est exploité pour mettre en œuvre cette solution.

Dans ce déploiement, Citrix ADC CPX est déployé en tant que démon sur les nœuds Kubernetes en mode hôte. Citrix ADC CPX établit une session d’appairage BGP avec vos routeurs réseau et utilise cette session d’appairage pour annoncer les adresses IP des services de cluster externes. Si vos routeurs ont la capacité ECMP, le trafic est équilibré en charge vers plusieurs instances CPX par le routeur en amont, qui à son tour équilibre la charge vers les espaces d’application réels. Lorsque vous déployez Citrix ADC CPX avec ce mode, Citrix ADC CPX ajoute des règles iptables pour chaque service de type LoadBalancer sur les nœuds Kubernetes. Le trafic destiné à l’adresse IP externe est acheminé vers les espaces Citrix ADC CPX.

Le schéma suivant explique un déploiement dans lequel Citrix ADC CPX expose un service de type LoadBalancer :

citrix-adc-cpx-service-type-lb

Comme indiqué dans le diagramme, Citrix ADC CPX s’exécute en tant que jeu de démons et exécute une session BGP sur le port 179 sur l’adresse IP du nœud pointée par la ressource de nœud Kubernetes. Pour chaque service de type LoadBalancer ajouté au serveur d’API Kubernetes, le Citrix ingress controller configure le Citrix ADC CPX pour annoncer l’adresse IP externe au routeur BGP configuré. Un préfixe /32 est utilisé pour annoncer les routes vers le routeur externe et l’adresse IP du nœud est utilisée comme passerelle pour atteindre l’adresse IP externe. Une fois que le trafic atteint le nœud Kubernetes, la règle iptables dirige le trafic vers Citrix ADC CPX qui à son tour équilibre la charge vers les espaces de service réels.

Avec ce déploiement, vous pouvez également utiliser les ressources d’entrée Kubernetes et annoncer l’adresse IP virtuelle (VIP) d’entrée au routeur. Vous pouvez spécifier la variable d’environnement NS_VIP lors du déploiement du Citrix ingress controller qui agit en tant qu’adresse IP virtuelle pour toutes les ressources d’entrée. Lorsqu’une ressource Ingress est ajoutée, Citrix ADC CPX annonce NS_VIP les routeurs externes via BGP pour attirer le trafic. Une fois que le trafic arrive sur le NS_VIP, Citrix ADC CPX effectue la commutation de contenu et l’équilibrage de charge comme spécifié dans la ressource d’entrée.

Remarque :

Pour que cette solution fonctionne, le Citrix ingress controller doit s’exécuter en tant qu’utilisateur racine et doit avoir cette NET_ADMIN capacité.

Déployer la solution Citrix ADC CPX pour les services de type LoadBalancer

Cette procédure explique comment déployer Citrix ADC CPX en tant que démon sur le réseau hôte pour exposer des services de type LoadBalancer.

Cette configuration inclut les tâches suivantes :

  • Déployez Citrix ADC CPX avec le Citrix ingress controller en tant que sidecar

  • Configuration BGP

  • Configuration du service

Conditions préalables

  • Vous devez configurer le routeur en amont pour le routage BGP avec prise en charge ECMP et ajouter des nœuds Kubernetes en tant que voisins.
  • Si le routeur prend en charge l’équilibrage de charge, il est préférable d’utiliser un algorithme de hachage ECMP stable pour l’équilibrage de charge avec une entropie plus élevée pour un équilibrage de charge uniforme.

Procédez comme suit :

  1. Téléchargez le fichier rbac.yaml et déployez les règles RBAC pour Citrix ADC CPX et le Citrix ingress controller.

    kubectl apply -f rbac.yaml
    
  2. Téléchargez le fichier citrix-k8s-cpx-ingress.yml à l’aide de la commande suivante.

    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
    
  3. Modifiez le fichier citrix-k8s-cpx-ingress.yaml et spécifiez les valeurs requises.

    • L’argument –configmap spécifie l’emplacement ConfigMap du Citrix ingress controller sous la forme de namespace/name.
    • L’argument --ipam citrix-ipam-controller peut être spécifié si vous exécutez le contrôleur IPAM Citrix pour l’allocation automatique d’adresses IP.
    • (Facultatif) nodeSelector pour sélectionner les nœuds sur lesquels vous devez exécuter le démon Citrix ADC CPX. Par défaut, il est exécuté sur tous les nœuds de travail.
  4. Appliquez le fichier citrix-k8s-cpx-ingress.yaml pour créer un démon qui démarre Citrix ADC CPX et le Citrix ingress controller.

      kubectl apply -f citrix-k8s-cpx-ingress.yml
    
  5. Créez un ConfigMap (configmap.yaml) avec la configuration BGP qui est transmise en tant qu’argument au Citrix ingress controller. Pour des informations détaillées sur la configuration BGP, reportez-vous à la section Configuration BGP.

    Vous devez disposer des informations suivantes pour configurer le routage BGP :

    • L’adresse IP du routeur pour que Citrix ADC CPX se connecte
    • Le système autonome (numéro AS) du routeur
    • Le numéro AS pour Citrix ADC CPX

    Voici un exemple de ConfigMap avec la configuration 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. Appliquez le ConfigMap créé à l’étape 5 pour appliquer la configuration BGP.

    kubectl appliquer -f configmap.yaml

  7. Créez un fichier YAML avec la configuration requise pour le service de type LoadBalancer.

    Remarque :

    Pour des informations détaillées, consultez la section Configuration du service. La section de configuration du service explique différentes manières d’obtenir une adresse IP externe pour le service et explique également comment utiliser l’annotation de service fournie par Citrix pour configurer différentes fonctionnalités de Citrix ADC.

    Voici un exemple de configuration de service de type 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. Appliquez le service de type LoadBalancer.

    kubectl apply -f service-example.yaml
    

Une fois le service appliqué, le Citrix ingress controller crée un serveur virtuel d’équilibrage de charge avec l’injection d’intégrité de route BGP activée. Si l’état du serveur virtuel d’équilibrage de charge est UP, l’itinéraire pour l’adresse IP externe est annoncé au routeur voisin avec un préfixe /32 avec l’adresse IP du nœud comme passerelle.

Configuration BGP

La configuration BGP est effectuée à l’aide de ConfigMap qui est transmis en tant qu’argument au Citrix ingress controller.

Vous devez disposer des informations suivantes pour configurer le routage BGP :

  • L’adresse IP du routeur afin que Citrix ADC CPX puisse s’y connecter
  • Le système autonome (numéro AS) du routeur
  • Le numéro AS pour Citrix ADC CPX

Dans le ConfigMap suivant pour la configuration BGP, le champ bgpConfig représente la configuration 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-->

Le tableau suivant explique les différents champs du champ bgpConfig.

Champ Description Type Valeur par défaut Requis
nodeSelector Si le champ nodeSeclector est présent, la configuration du routeur BGP s’applique aux nœuds qui correspondent au champ NodeSelector. nodeSelector accepte les paires key=value séparées par des virgules où chaque clé représente un nom d’étiquette et la valeur est la valeur de l’étiquette. Par exemple : NodeSelector : datacenter=ds1, rack-rack1 string   Non
bgpRouter Spécifie la configuration BGP. Pour plus d’informations sur les différents champs de bgpRouter, reportez-vous au tableau suivant. bgpRouter   Oui

Le tableau suivant explique les champs du champ bgpRouter.

Champ Description Type Valeur par défaut Requis
localAS Numéro AS pour Citrix ADC CPX entier   Oui
neighbor Configuration BGP du routeur voisin. neighbor   Oui

Le tableau suivant explique le champ neighbor.

| Champ | Description | Type | Valeur par défaut | Requis | | ———————– | ————————————————————————————— | ——- | ————- | ——– | | address | Adresse IP du routeur voisin. | string | | Oui | | remoteAS | Numéro AS du routeur voisin. | entier | | | Oui | advertisementInterval | Ce champ définit un intervalle minimum entre l’envoi des mises à jour de routage BGP (en secondes). | entier | 10 secondes | Oui | | ASOriginationInterval | Ce champ définit l’intervalle d’envoi du SA mises à jour du routage d’origine (en secondes). | entier | 10 secondes | Oui |

Différents voisins pour différents nœuds

Par défaut, chaque nœud du cluster se connecte à tous les voisins répertoriés dans la configuration. Toutefois, si le cluster Kubernetes est réparti sur différents centres de données ou différents réseaux, différentes configurations de voisinage pour différents nœuds peuvent être nécessaires. Vous pouvez utiliser le champ nodeSelector pour sélectionner les nœuds requis pour les configurations de routage BGP.

node-selector

Un exemple de ConfigMap avec la nodeSelector configuration est donné comme suit :


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

Dans cet exemple, le routeur dont l’adresse IP est 10.102.33.44 est utilisé comme voisin par les nœuds portant l’étiquette datacenter=ds1. Le routeur dont l’adresse IP est 10.102.28.12 est utilisé par les nœuds portant l’étiquette datacenter=ds2.

Configuration du service

Configuration de l’adresse IP externe

Une adresse IP externe pour le service de type LoadBalancer peut être obtenue en utilisant l’une des méthodes suivantes.

  • Spécifiez l’annotation service.citrix.com/frontend-ip dans la spécification de service comme suit.

     metadata:
         annotations:
             service.citrix.com/frontend-ip: 172.217.163.17
    
  • Spécifiez une adresse IP dans le champ spec.loadBalancerIP de la spécification de service comme suit.

     spec:
         loadBalancerIP: 172.217.163.17
    
  • En attribuant automatiquement une adresse IP virtuelle au service à l’aide du contrôleur IPAM fourni par Citrix. Si l’une des deux autres méthodes est spécifiée, elle est prioritaire sur le contrôleur IPAM. La solution IPAM est conçue de telle sorte que vous pouvez facilement intégrer la solution à des fournisseurs DNS externes tels qu’Infoblox. Pour plus d’informations, consultez Interopérabilité avec ExternalDNS. Pour le déploiement et l’utilisation du contrôleur IPAM Citrix, consultez la documentation.

Configuration des annotations de service

Le Citrix ingress controller fournit de nombreuses annotations de service pour tirer parti des différentes fonctionnalités de Citrix ADC. Par exemple, le type de service par défaut pour le serveur virtuel d’équilibrage de charge est TCP, mais vous pouvez remplacer cette configuration par l’annotation service.citrix.com/service-type.

metadata:
    annotations:
        service.citrix.com/service-type-0: 'HTTP'
        service.citrix.com/service-type-1: 'SSL'

À l’aide de diverses annotations fournies par Citrix Ingress Controller, vous pouvez tirer parti de diverses fonctionnalités ADC telles que le déchargement SSL, les stratégies de réécriture et de répondeur HTTP et d’autres définitions de ressources personnalisées (CRD).

Pour plus d’informations sur toutes les annotations pour le service de type LoadBalancer, consultez la section Annotations de service.

Pour l’utilisation de ressources secrètes pour les certificats SSL pour les services Type LoadBalancer, reportez-vous à la section Certificat SSL pour les services de type LoadBalancer.

Configuration de la stratégie de trafic externe

Par défaut, le Citrix ingress controller ajoute tous les espaces de service en tant que back-end pour le service virtuel d’équilibrage de charge dans Citrix ADC CPX. Cette étape garantit une meilleure haute disponibilité et une distribution égale aux instances de l’espace de service. Tous les nœuds exécutant Citrix ADC CPX annoncent les routes vers le serveur en amont et attirent le trafic du routeur. Ce comportement peut être modifié en définissant la valeur spec.externalTrafficPolicy du service sur Local. Lorsque la stratégie de trafic externe est définie sur Local, seuls les espaces s’exécutant sur le même nœud sont ajoutés en tant que back-end pour le serveur virtuel d’équilibrage de charge, comme illustré dans le diagramme suivant. Dans ce mode, seuls les nœuds qui possèdent les espaces de service annoncent l’adresse IP externe au routeur et CPX envoie le trafic uniquement aux espaces locaux. Si vous ne souhaitez pas que le trafic passe par les nœuds pour des raisons de performances, vous pouvez utiliser cette fonctionnalité.

Politique de trafic externe : local

Utilisation des ressources Ingress

Le Citrix ingress controller fournit une variable nt NS_VIP, qui est l’adresse IP externe de toutes les ressources d’entrée. Chaque fois qu’une ressource d’entrée est ajoutée, Citrix ADC CPX annonce l’adresse IP d’entrée aux routeurs externes. Le Citrix ingress controller fournit diverses annotations pour l’entrée. Pour plus d’informations, consultez la documentation relative aux annotations d’entrée.

Effectuez les étapes suivantes pour la configuration d’entrée :

  1. Téléchargez le fichier rbac.yaml et déployez les règles RBAC pour Citrix ADC CPX et le Citrix ingress controller.

        kubectl apply -f rbac.yaml
    
  2. Téléchargez le fichier citrix-k8s-cpx-ingress.yml à l’aide de la commande suivante.

    wget  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/citrix-k8s-cpx-ingress.yml
    
  3. Modifiez le fichier citrix-k8s-cpx-ingress.yml et spécifiez les valeurs requises.

    • L’argument –configmap spécifie l’emplacement ConfigMap du Citrix ingress controller sous la forme d’espace de noms ou de nom.

    • Variable d’environnement NS_VIP permettant de spécifier l’adresse IP externe à utiliser pour toutes les ressources d’entrée. (Il s’agit d’un paramètre obligatoire).

  4. Appliquez le fichier citrix-k8s-cpx-ingress.yml pour créer un démon qui démarre Citrix ADC CPX et le Citrix ingress controller.

      kubectl apply -f citrix-k8s-cpx-ingress.yml  
    
  5. Configurez BGP à l’aide de ConfigMap comme indiqué dans la section précédente.

  6. Déployez un exemple de ressource d’entrée comme suit. Cette étape annonce l’adresse IP spécifiée dans la variable d’environnement NS_VIP au routeur externe configuré dans ConfigMap.

    kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/configure/cpx-bgp-router/ingress-example.yaml 
    
  7. Accédez à l’application en utilisant NS_VIP:<port>. Par défaut, Ingress utilise le port 80 pour les communications non sécurisées et le port 443 pour les communications sécurisées (si la section TLS est fournie).

Remarque : Actuellement, l’annotation ingress.citrix.com/frontend-ip n’est pas prise en charge pour les publications BGP.

Installation de la barre

Vous pouvez utiliser les graphiques Helm pour installer le Citrix ADC CPX en tant que routeur BGP. Pour plus d’informations, consultez la documentation relative au graphique Citrix Helm.

Résolution des problèmes

  • Par défaut. Citrix ADC CPX utilise la plage d’adresses IP 192.168.1.0/24 pour la communication interne, l’adresse IP 192.168.1.1 comme passerelle interne vers l’hôte et l’adresse IP 192.168.1.2 comme NSIP. Les ports 9080 et 9443 sont utilisés comme ports de gestion entre le Citrix ingress controller et Citrix ADC CPX pour HTTP et HTTPS. Si le réseau 192.168.1.0/24 se trouve dans la plage de PodCidr, vous pouvez allouer un ensemble d’adresses IP différent pour la communication interne. Les variables d’environnement NS_IP et NS_GATEWAY contrôlent l’adresse IP utilisée par Citrix ADC CPX pour NSIP et passerelle respectivement. La même adresse IP doit également être spécifiée dans le cadre de la variable d’environnement du Citrix ingress controller NS_IP pour établir la communication entre le Citrix ingress controller et Citrix ADC CPX.

  • Par défaut, le BGP sur Citrix ADC CPX s’exécute sur le port 179 et tout le trafic BGP arrivant au port TCP 179 est géré par Citrix ADC CPX. En cas de conflit, par exemple si vous utilisez la capacité d’appairage BGP externe de Calico pour annoncer vos préfixes de cluster sur BGP, vous pouvez modifier le port BGP avec la variable d’environnement sur le Citrix ingress controller BGP_PORT.

  • L’utilisation du mode IP source (USIP) de Citrix ADC ne fonctionne pas en raison des contraintes de Kubernetes. Si l’adresse IP source est requise par le service, vous pouvez activer la fonctionnalité CIP (en-tête IP client) sur les services de type de service HTTP/SSL à l’aide des annotations suivantes.

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

Publication BGP d’adresses IP externes pour les services LoadBalancer de type et les entrées à l’aide de Citrix ADC CPX