Contactez-nous

Types de Services essentiels : ClusterIP, NodePort, LoadBalancer (focus sur NodePort pour le local)

Explorez les principaux types de Services Kubernetes (ClusterIP, NodePort, LoadBalancer) et comprenez quand et comment les utiliser, avec un focus sur NodePort pour le local.

Définir comment accéder à votre Service

Nous savons maintenant qu'un Service fournit une adresse IP et un nom DNS stables pour accéder à un ensemble de Pods. Cependant, *comment* ce Service est-il rendu accessible ? Est-il uniquement joignable depuis l'intérieur du cluster, ou peut-on y accéder depuis l'extérieur ? La réponse dépend du `type` que vous spécifiez dans la définition du Service.

Le champ `spec.type` dans le manifeste d'un Service détermine son mode d'exposition. Kubernetes propose plusieurs types, mais trois sont fondamentaux et couvrent la majorité des cas d'usage : `ClusterIP`, `NodePort`, et `LoadBalancer`. Choisir le bon type est essentiel pour contrôler la portée et la manière dont votre application sera accessible.

Dans ce sous-chapitre, nous allons examiner chacun de ces trois types essentiels, en détaillant leur fonctionnement, leur portée d'accessibilité et leurs cas d'utilisation typiques. Nous accorderons une attention particulière au type `NodePort`, car il est souvent le moyen le plus simple et le plus direct d'accéder à une application depuis votre machine locale lorsque vous travaillez avec un cluster Kubernetes local comme Minikube ou Kind.

Type `ClusterIP` : l'accès interne par défaut

Le type `ClusterIP` est le type de Service par défaut si vous n'en spécifiez aucun. Lorsque vous créez un Service de type `ClusterIP`, Kubernetes lui attribue une adresse IP virtuelle interne au cluster (la ClusterIP). Cette adresse IP n'est accessible que depuis l'intérieur du cluster Kubernetes lui-même – par d'autres Pods ou services s'exécutant dans le même cluster.

Aucun accès externe direct n'est fourni par un Service `ClusterIP`. Il est idéal pour la communication interne entre les différentes couches ou microservices de votre application. Par exemple, votre service frontend (accessible de l'extérieur via un autre type de Service) peut communiquer avec un service backend ou une base de données via leur Service `ClusterIP` respectif.

La configuration est minimale : vous définissez le sélecteur pour cibler les Pods et les ports que le Service doit exposer. Kubernetes gère l'attribution de la ClusterIP et assure la redirection du trafic vers les Pods cibles.

apiVersion: v1
kind: Service
metadata:
  name: mon-service-interne
spec:
  # type: ClusterIP # C'est le défaut, donc facultatif
  selector:
    app: mon-backend # Cible les Pods avec ce label
  ports:
  - protocol: TCP
    port: 8080       # Port sur lequel le Service écoute
    targetPort: 80   # Port sur lequel les Pods cibles écoutent

Type `NodePort` : accès via les Noeuds (idéal pour le local)

Le type `NodePort` est conçu pour exposer votre Service sur un port statique spécifique sur *chacun* des Noeuds de votre cluster. Lorsque vous créez un Service de type `NodePort`, Kubernetes effectue deux actions principales : il crée d'abord un Service `ClusterIP` (comme décrit ci-dessus), puis il configure chaque Noeud pour qu'il écoute sur un port spécifique (le NodePort) et redirige le trafic reçu sur ce port vers la ClusterIP du Service.

Cela signifie que vous pouvez accéder à votre Service depuis l'extérieur du cluster en contactant l'adresse IP de *n'importe quel* Noeud du cluster sur le port NodePort assigné. La syntaxe est `:`. Le port NodePort est choisi par défaut dans une plage spécifique (typiquement 30000-32767), mais vous pouvez également en spécifier un manuellement (dans cette plage).

Pourquoi est-ce idéal pour le développement local ? Dans des environnements comme Minikube ou Kind, votre cluster Kubernetes s'exécute souvent dans une machine virtuelle ou un conteneur Docker sur votre propre machine. L'"IP du Noeud" est alors facilement accessible (souvent via `localhost` ou une commande comme `minikube ip`). En exposant votre application via un `NodePort`, vous pouvez simplement ouvrir votre navigateur web local et accéder à `:` pour tester votre application, sans avoir besoin de configurer un load balancer externe complexe.
apiVersion: v1
kind: Service
metadata:
  name: mon-service-nodeport
spec:
  type: NodePort # Spécifier le type
  selector:
    app: mon-frontend # Cible les Pods du frontend
  ports:
  - protocol: TCP
    port: 80         # Port sur lequel le Service (ClusterIP) écoute
    targetPort: 8080 # Port sur lequel les Pods cibles écoutent
    # nodePort: 30080 # Facultatif: spécifier un port fixe (dans la plage autorisée)

Bien que pratique pour le développement et les tests, `NodePort` est moins courant pour les applications en production exposées sur internet, car il nécessite de gérer les adresses IP des Noeuds et expose un port potentiellement aléatoire (si non spécifié) sur toutes les machines du cluster.

Type `LoadBalancer` : l'exposition via le Cloud

Le type `LoadBalancer` est la méthode standard pour exposer des services directement sur internet lorsque vous exécutez Kubernetes sur un fournisseur de cloud public (comme AWS, GCP, Azure, etc.) qui prend en charge les load balancers externes.

Lorsque vous créez un Service de type `LoadBalancer`, Kubernetes interagit avec l'API du fournisseur de cloud sous-jacent. Il demande la création d'un load balancer externe propre au cloud provider. Ce load balancer externe reçoit une adresse IP publique unique et est automatiquement configuré par le cloud provider pour acheminer le trafic externe vers les Noeuds de votre cluster sur le `NodePort` approprié (car un Service `LoadBalancer` crée implicitement aussi un Service `NodePort` et `ClusterIP`).

L'avantage majeur est que vous obtenez une adresse IP publique stable et gérée par le cloud provider, derrière laquelle se trouve la puissance de leur infrastructure de répartition de charge. C'est la méthode la plus robuste et la plus courante pour exposer des applications web en production à des utilisateurs externes.

apiVersion: v1
kind: Service
metadata:
  name: mon-service-web
spec:
  type: LoadBalancer # Spécifier le type
  selector:
    app: mon-application-web # Cible les Pods
  ports:
  - protocol: TCP
    port: 80         # Port sur lequel le Load Balancer externe écoutera
    targetPort: 9376 # Port sur lequel les Pods cibles écoutent

L'inconvénient principal est sa dépendance vis-à-vis de l'infrastructure sous-jacente. Sur un cluster local (Minikube, Kind) ou sur du bare-metal, un Service de type `LoadBalancer` restera généralement en état `` car il n'y a pas de fournisseur de cloud pour lui attribuer une IP externe, à moins d'installer des solutions spécifiques comme MetalLB.

Choisir le bon type de Service

En résumé, le choix du type de Service dépend de votre besoin d'exposition :

  • `ClusterIP` : Pour la communication interne au cluster uniquement.
  • `NodePort` : Pour exposer un service sur un port fixe de chaque Noeud. Très utile pour le développement local et les tests, ou lorsque vous gérez votre propre équilibrage de charge devant les Noeuds.
  • `LoadBalancer` : Pour une exposition externe via un load balancer géré par le cloud provider. Idéal pour les applications de production dans le cloud.

Comprendre ces trois types est essentiel pour configurer correctement l'accès réseau à vos applications déployées sur Kubernetes.