Récupérer l'adresse IP source derrière le LoadBalancer
Découvrez comment récupérer l'adresse IP source derrière le LoadBalancer sur OVHcloud Managed Kubernetes
L'utilisation du Load Balancer Public Cloud avec Managed Kubernetes Service (MKS) est désormais disponible en General Availability.
Cependant, ce LoadBalancer (basé sur le projet Octavia) n'est pas encore le LoadBalancer par défaut pour les clusters utilisant des versions de Kubernetes <1.31. Pour ces clusters, vous devez utiliser l'annotation loadbalancer.ovhcloud.com/class: octavia afin de déployer un LoadBalancer Octavia depuis votre cluster MKS.
Avant de commencer
Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel, et que vous y avez déployé une application utilisant le LoadBalancer OVHcloud Managed Kubernetes. Pour en savoir plus sur ces sujets, consultez la documentation Utiliser le LoadBalancer OVHcloud Managed Kubernetes.
Lorsqu'une ressource Service de type LoadBalancer est créée au sein d'un cluster Managed Kubernetes, un Load Balancer Public Cloud associé est automatiquement créé, permettant un accès public à votre application K8S. Le service Load Balancer Public Cloud est facturé à l'heure et apparaîtra dans votre projet Public Cloud. Pour plus d'informations, reportez-vous à la documentation suivante : Tarifs du Network Load Balancer
Le problème
Lorsque vous déployez vos services HTTP en mode NodePort, vous récupérez directement l'adresse Remote Address de la requête depuis le serveur (par exemple avec $_SERVER['REMOTE_ADDR'] en PHP ou $ENV{'REMOTE_ADDR'} en Perl). Cette adresse (généralement au format IP:port) correspond au demandeur d'origine ou au dernier proxy entre celui-ci et votre cluster.
Lorsque vous déployez les services en mode LoadBalancer, les choses sont un peu différentes : notre Load Balancer agit comme un proxy, et le Remote Address vous donnera l'adresse IP du Load Balancer. Comment récupérer l'adresse IP source de la requête dans ce cas ?
Ce tutoriel décrit comment déployer un service LoadBalancer sur OVHcloud Managed Kubernetes tout en préservant l'adresse IP source.
Récupérer l'adresse IP source de la requête derrière le LoadBalancer
Le moyen le plus simple de déployer des services derrière le Load Balancer tout en conservant l'adresse IP source consiste à placer vos services sous un Ingress, lui-même situé derrière le LoadBalancer.
L'Ingress est exposé à l'extérieur du cluster via un LoadBalancer, et il route le trafic entrant vers vos services selon des règles configurées. Cette configuration présente également un avantage en termes de coût : vous pouvez placer de nombreux services derrière un seul LoadBalancer.
Dans ce tutoriel, nous utilisons l'Ingress Controller le plus simple : NGINX Ingress Controller, où un serveur NGINX joue le rôle de reverse proxy.
1. Installation du NGINX Ingress Controller
Nous pouvons déployer le NGINX Ingress Controller officiel avec le fichier manifeste ou avec le chart Helm.
Choisissez l'une ou l'autre méthode et suivez le paragraphe correspondant.
Installation avec le fichier manifeste
Cela crée le namespace, le serviceaccount, le role et tous les autres objets Kubernetes nécessaires à l'Ingress Controller, puis déploie le contrôleur :
Installation avec le chart Helm
Cela crée le namespace, le serviceaccount, le role et tous les autres objets Kubernetes nécessaires à l'Ingress Controller, puis déploie le contrôleur :
Vérifiez votre déploiement
Vous pouvez utiliser kubectl pour obtenir l'état du service et récupérer l'adresse IP du Load Balancer :
Vous devriez voir votre service Ingress nouvellement créé :
La création du LoadBalancer étant asynchrone, et le provisionnement du Load Balancer pouvant prendre plusieurs minutes, vous pouvez voir <pending> dans EXTERNAL-IP pendant que le Load Balancer se met en place. Dans ce cas, patientez quelques minutes et réessayez.
2. Patch de l'Ingress Controller
Vous devez maintenant patcher l'Ingress Controller pour qu'il prenne en charge le proxy protocol.
Selon que votre cluster Kubernetes fonctionne avec un réseau privé ou non, la configuration du proxy protocol diffère. Suivez les parties du tutoriel correspondant à votre configuration.
a. [RÉSEAU PUBLIC UNIQUEMENT] Récupérer la liste des adresses IP de sortie du Load Balancer
Vous devriez voir quelque chose comme ceci :
b. [RÉSEAU PRIVÉ UNIQUEMENT] Récupérer la liste des adresses IP de sortie du Load Balancer
Lorsque votre cluster Managed Kubernetes est attaché à un vRack, les Load Balancers utilisent chacun deux adresses IP aléatoires. Votre liste d'adresses IP de sortie correspond à la plage de votre sous-réseau.
Pour le reste de cette documentation, nous considérons que notre sous-réseau utilise la plage 10.0.0.0/20. N'oubliez pas de la remplacer par la vôtre !
Méthodes de patch
Nous pouvons mettre à jour la configuration du NGINX Ingress Controller avec des fichiers manifestes ou avec Helm. Choisissez l'une ou l'autre méthode et suivez le paragraphe correspondant.
Patch avec des fichiers manifestes
Copiez l'extrait YAML suivant dans un fichier patch-ingress-controller-service.yml :
Puis appliquez-le dans votre cluster :
Copiez l'extrait YAML suivant dans un fichier patch-ingress-controller-configmap.yml et modifiez le paramètre proxy-real-ip-cidr selon la configuration de votre cluster :
a. [RÉSEAU PUBLIC UNIQUEMENT]
b. [RÉSEAU PRIVÉ UNIQUEMENT]
Remarque : 10.0.0.0/20 doit être remplacé par la plage de votre propre sous-réseau.
Puis appliquez-le dans votre cluster :
Vous devriez voir la configuration être patchée et le pod du contrôleur supprimé (puis recréé) :
Patch avec Helm
Copiez l'extrait YAML suivant dans un fichier values.yaml et modifiez le paramètre proxy-real-ip-cidr selon la configuration de votre cluster :
a. [RÉSEAU PUBLIC UNIQUEMENT]
b. [RÉSEAU PRIVÉ UNIQUEMENT]
Remarque : 10.0.0.0/20 doit être remplacé par la plage de votre propre sous-réseau.
Puis mettez à jour votre release Helm :
Vous devriez voir votre release Helm être mise à jour :
3. Vérification du patch
Après avoir appliqué le patch, exécutez les commandes suivantes pour confirmer que le proxy protocol est correctement configuré.
Vérifiez les annotations du service et la politique de trafic externe :
Vérifiez que le résultat contient :
- l'annotation
service.beta.kubernetes.io/ovh-loadbalancer-proxy-protocol: v2 - l'annotation
loadbalancer.openstack.org/proxy-protocol: v2 ExternalTrafficPolicy: Local
Vérifiez la ConfigMap du contrôleur :
Vérifiez que la section Data contient :
use-proxy-protocol: "true"real-ip-header: proxy_protocolproxy-real-ip-cidrréglé sur vos adresses IP de sortie ou sur la plage de votre sous-réseau
4. Test
En raison de la propagation DNS, la résolution effective du FQDN de votre Load Balancer peut nécessiter 2 à 5 minutes supplémentaires avant d'être pleinement utilisable. En attendant, vous pouvez utiliser l'adresse IP fournie pour accéder au Load Balancer.
Le nom de domaine généré pour le service et affiché dans le champ EXTERNAL-IP est réservé à un usage interne au cluster. Il ne doit pas être utilisé pour accéder au service depuis Internet.
Nous pouvons maintenant déployer un service echo simple pour vérifier que tout fonctionne. Le service utilisera l'image mendhak/http-https-echo, un conteneur Docker d'écho HTTPS très utile pour le débogage web.
Commencez par copier le manifeste suivant dans un fichier echo.yaml :
Puis déployez-le sur votre cluster :
Vous pouvez maintenant le tester en utilisant l'URL du LoadBalancer :
Vous devriez obtenir les paramètres HTTP de votre requête, incluant la bonne adresse IP source dans l'en-tête x-real-ip :
Que faire si je souhaite utiliser un autre Ingress Controller ?
La méthode précédente devrait fonctionner de manière similaire avec n'importe quel Ingress Controller. Ce tutoriel sera bientôt mis à jour avec des informations plus détaillées sur d'autres Ingress Controllers, notamment Traefik.
Aller plus loin
-
Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.
-
Échangez avec notre communauté d'utilisateurs.