Exposer votre application déployée sur un OVHcloud Managed Kubernetes Service
Découvrez comment utiliser et exposer votre application déployée sur un OVHcloud Managed Kubernetes Service
La section Loadbalancer de cette documentation concerne le « LoadBalancer for Managed Kubernetes Service ». Si vous souhaitez profiter de la nouvelle solution de répartition de charge de MKS, le « Public Cloud LoadBalancer » basé sur Octavia LoadBalancer, reportez-vous à cette page.
Pour forcer l'utilisation du « LoadBalancer for Managed Kubernetes » sur votre cluster MKS, ajoutez l'annotation loadbalancer.ovhcloud.com/class: iolb à votre Service Kubernetes.
Remarque : à partir de la version 1.31 de Kubernetes pour MKS, le « LoadBalancer for Managed Kubernetes » n'est plus la solution de répartition de charge par défaut et sera remplacé par le Public Cloud Loadbalancer.
Objectif
Dans ce tutoriel, nous expliquons comment utiliser les services sur OVHcloud Managed Kubernetes Service pour exposer votre application en faisant entrer le trafic externe dans votre cluster. Nous commencerons par lister les principales méthodes permettant d'exposer des services Kubernetes en dehors du cluster, avec leurs avantages et inconvénients. Puis nous verrons un exemple complet de déploiement d'un service LoadBalancer.
Avant de commencer
Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel et de connaissances de base sur son utilisation. Pour en savoir plus sur ces sujets, consultez le guide de démarrage rapide d'OVHcloud Managed Kubernetes Service.
Lorsqu'une ressource Service de type LoadBalancer est créée dans un cluster Managed Kubernetes, un Load Balancer for Managed Kubernetes Service est automatiquement créé, permettant un accès public à votre application Kubernetes. Le Load Balancer for Managed Kubernetes Service est facturé à l'heure et apparaîtra dans votre projet Public Cloud. Pour plus d'informations, reportez-vous à cette page.
Quelques notions : ClusterIP, NodePort, Ingress et LoadBalancer
Lorsque vous commencez à utiliser Kubernetes pour des applications réelles, l'une des premières questions est de savoir comment faire entrer le trafic externe dans votre cluster. La documentation officielle donne une explication complète mais plutôt aride sur le sujet ; ici, nous essayons d'expliquer les concepts de manière minimale, en ne donnant que les informations essentielles.
Il existe plusieurs façons d'acheminer le trafic externe vers votre cluster :
-
Utiliser le proxy Kubernetes et
ClusterIP: leServiceTypeKubernetes par défaut estClusterIP, qui expose leServicesur une IP interne au cluster. Pour atteindre laClusterIPdepuis une source externe, vous pouvez ouvrir un proxy Kubernetes entre la source externe et le cluster. Cette méthode n'est généralement utilisée qu'en développement. -
Exposer les services en tant que
NodePort: déclarer unServicede typeNodePortexpose le service sur l'IP de chaque nœud à un port statique (leNodePort). Vous pouvez alors accéder auServicedepuis l'extérieur du cluster en appelant<NodeIp>:<NodePort>. Cette méthode peut être utilisée en production, avec certaines limitations. -
Exposer les services en tant que
LoadBalancer: déclarer unServicede typeLoadBalancerl'expose de manière externe à l'aide du load balancer d'un fournisseur cloud. Le fournisseur cloud provisionne un load balancer pour leServiceet le mappe à sonNodePortattribué automatiquement. C'est la méthode la plus largement utilisée dans les environnements de production.
Utiliser le proxy Kubernetes et ClusterIP
Le ServiceType Kubernetes par défaut est ClusterIP, qui expose le Service sur une IP interne au cluster. Pour atteindre la ClusterIP depuis un ordinateur externe, vous pouvez ouvrir un proxy Kubernetes entre cet ordinateur externe et le cluster.
Vous pouvez utiliser kubectl pour créer un tel proxy. Une fois le proxy actif, vous êtes directement connecté au cluster et pouvez utiliser l'IP interne des Services (ClusterIP).
Cette méthode n'est pas adaptée à un environnement de production, mais elle est intéressante pour le développement, le débogage ou d'autres opérations rapides.
Exposer les services en tant que NodePort
Déclarer un service de type NodePort expose le Service sur l'IP de chaque nœud à un port statique, le NodePort (un port fixe pour ce Service, dans la plage par défaut 30000-32767). Vous pouvez alors accéder au Service depuis l'extérieur du cluster en appelant <NodeIp>:<NodePort>. Chaque service que vous déployez en NodePort sera exposé sur son propre port, sur chaque nœud.
Il est plutôt fastidieux d'utiliser des Services NodePort en production. Comme vous utilisez des ports non standard, vous devez souvent mettre en place un load balancer externe qui écoute sur des ports standard et redirige le trafic vers <NodeIp>:<NodePort>.
Sur notre OVHcloud Managed Kubernetes, vous disposez d'un moyen simple d'accéder aux services NodePort. Vous devez récupérer l'URL des nodes, une URL qui se résout par round-robin DNS vers un nœud aléatoire de votre cluster. Comme les services NodePort sont exposés sur le même port sur chaque nœud, vous pouvez utiliser cette URL des nodes pour y accéder.
Pour obtenir l'URL des nœuds, récupérez l'URL du control plane (celle indiquée par kubectl cluster-info) et ajoutez l'élément nodes entre le premier et le deuxième élément de l'URL.
Exemple :
Dans ce cas, l'URL des nodes sera https://xxxxxx.nodes.c1.gra9.k8s.ovh.net, et un service déployé sur le NodePort 30123 sera accessible via https://xxxxxx.nodes.c1.gra9.k8s.ovh.net:30123.
Si votre OVHcloud Managed Kubernetes est connecté à un vRack, le NodePort n'est exposé que sur votre sous-réseau privé. Vous devez donc vérifier les IP privées de vos nœuds dans votre Nodepool et vous connecter via l'une de ces IP privées.
Exposer les services en tant que LoadBalancer
Déclarer un service de type LoadBalancer l'expose de manière externe à l'aide du load balancer d'un fournisseur cloud. Le fournisseur cloud provisionne un load balancer pour le Service et le mappe à son NodePort attribué automatiquement. La façon dont le trafic provenant de ce load balancer externe est acheminé vers les pods du Service dépend du fournisseur du cluster.
Le LoadBalancer est la meilleure option pour un environnement de production, avec deux réserves :
- Chaque
Servicede typeLoadBalancerque vous déployez obtiendra sa propre IP. - Le
LoadBalancerest généralement facturé en fonction du nombre de services exposés, ce qui peut s'avérer coûteux.
Il existe une limite de 200 LoadBalancer actifs par projet OpenStack (également appelé tenant OpenStack). Cette limite peut exceptionnellement être relevée sur demande auprès de notre équipe support.
Load balancers pris en charge
OVHcloud fournit actuellement deux types de load balancers pouvant être utilisés avec les Managed Kubernetes Services :
- Load Balancer for Managed Kubernetes, ce type de load balancer ne peut être utilisé que pour exposer des ressources d'un Managed Kubernetes Service. Il prend en charge jusqu'à 2000 requêtes/seconde et une bande passante de 200 Mbit/s. Veuillez noter que ce Loadbalancer sera obsolète à partir de la version 1.32 de Kubernetes pour MKS et des versions ultérieures.
- Public Load Balancer, basé sur le projet OpenStack Octavia, ce type de load balancer peut également être utilisé avec les instances OVHcloud standard. Vous pouvez choisir entre trois tailles de Load Balancer (S, M, L), offrant jusqu'à 40 000 requêtes/seconde et une bande passante de 2 Gbit/s. Parmi les autres avantages figurent la possibilité d'exposer votre Load Balancer de manière privée (private-to-private) ou publique (public-to-private ou public-to-public) à l'aide de Floating IP, la possibilité de collecter des métriques, ainsi que les protocoles TCP/UDP.
Annotations prises en charge
Cette partie de la documentation s'applique au Load Balancer for Managed Kubernetes.
Une documentation dédiée au Public Load Balancer est disponible ; consultez Exposer vos applications à l'aide d'un load balancer.
Plusieurs annotations sont disponibles pour personnaliser votre load balancer :
service.beta.kubernetes.io/ovh-loadbalancer-proxy-protocol: utilisée sur le service pour activer le proxy protocol sur l'ensemble des backends. Valeurs prises en charge :v1,v2,v2_ssl,v2_ssl_cn.
Les services OVHcloud Load Balancer gèrent 4 modes ProxyProtocol :
-
service.beta.kubernetes.io/ovh-loadbalancer-allowed-sources: utilisée sur le service pour spécifier les plages d'IP source client autorisées. Valeur : liste de CIDR séparés par des virgules. Par exemple :10.0.0.0/24,172.10.0.1. Obsolète, utilisez plutôt le specloadBalancerSourceRanges, voir Restrict Access For LoadBalancer Service. -
service.beta.kubernetes.io/ovh-loadbalancer-balance: utilisée sur le service pour définir l'algorithme à utiliser pour la répartition de charge. Valeurs prises en charge :first,leastconn,roundrobin,source. Valeur par défaut :roundrobin.
Qu'en est-il de l'Ingress
Selon la documentation officielle, un Ingress est un objet d'API qui gère l'accès externe aux services d'un cluster, généralement en HTTP. Quelle est la différence avec le LoadBalancer ou le NodePort ?
Ingress n'est pas un type de Service, mais un objet qui agit comme un reverse proxy et un point d'entrée unique vers votre cluster, qui achemine les requêtes vers les différents services. L'Ingress le plus basique est le contrôleur NGINX Ingress, où NGINX joue le rôle de reverse proxy, mais assure également la fonction SSL.
Un Ingress est exposé à l'extérieur du cluster via ClusterIP et le proxy Kubernetes, NodePort ou LoadBalancer, et il achemine le trafic entrant selon des règles configurées.
Le principal avantage d'utiliser un Ingress derrière un LoadBalancer est le coût : vous pouvez avoir de nombreux services derrière un seul LoadBalancer.
Déployer des services LoadBalancer sur des clusters OVHcloud Managed Kubernetes
Sur notre OVHcloud Managed Kubernetes, nous proposons un service de répartition de charge vous permettant d'utiliser le ServiceType LoadBalancer.
Déployer un service LoadBalancer Hello World
Créez un fichier hello.yml pour notre image Docker ovhplatform/hello, en définissant le type de service comme LoadBalancer :
Et appliquez le fichier :
Après avoir appliqué le fichier YAML, un nouveau service hello-world et le déploiement hello-world-deployment correspondant sont créés :
L'application que vous venez de déployer est un simple serveur Nginx avec une unique page statique Hello World.
Elle se contente de déployer l'image Docker ovhplatform/hello
Lister les services
Utilisez à présent kubectl pour observer votre service :
Vous devriez voir votre service nouvellement créé :
Comme la création du LoadBalancer est asynchrone et que le provisionnement du load balancer peut prendre plusieurs minutes, vous obtiendrez certainement un EXTERNAL-IP à l'état <pending>.
Si vous réessayez quelques minutes plus tard, vous devriez obtenir un EXTERNAL-IP :
Pour chaque service que vous déployez avec le type LoadBalancer, vous obtiendrez une nouvelle IPv4 au format xxx.xxx.xxx.xxx pour accéder au service.
Tester votre service
Si vous pointez votre navigateur web vers la valeur EXTERNAL-IP, le service hello-world vous répondra :
Suppression (nettoyage)
Pour finir, vous pouvez procéder au nettoyage en supprimant le service et le déploiement.
Commencez par supprimer le service :
Si vous listez les services, vous constaterez que hello-world n'existe plus :
Vous pouvez ensuite supprimer le déploiement :
Et si vous listez à présent votre déploiement, vous ne trouverez plus aucune ressource :
Si vous listez maintenant les pods :
Vous constaterez que le pod créé pour hello-world a également été supprimé :
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.