Quels sont les différents types de Services ?

Un Service est une collection de Pods exposée à travers un endpoint. Il existe différents types de services :

Ce tutoriel présente ces concepts.

Prenons un cluster Kubernetes de deux noeuds : node_1 et node_2. Ces noeuds sont exposés à travers une IP Externe et une IP Interne.

Cluster Kubernetes avec 2 noeuds

Sur ce cluster, nous déployons deux pods (pod_a et pod_b). Le hasard du déploiement fait que les pods ne se retrouvent pas sur le même noeud. Ces deux pods ont tous les deux des adresses IP. Ce sont des adresses ip de type internes, ce qui veut dire qu’elles ne sont pas visibles à l’extérieur du cluster. Un pod ne peut pas avoir d’adresse IP externe. Ces deux pods se voient, ils peuvent donc avoir un dialogue direct à travers leur adresse IP respective.

Direct connection

Dans un cluster Kubernetes, le principe de base est qu’un pod doit être considéré comme éphémère. Lorsque le pod_b est remplacé par une nouvelle version, il est peu probable que le cluster lui alloue la même adresse IP. Le pod_a ne peut donc plus discuter avec la nouvelle version du pod_b.

One pod crash

C’est pour éviter ce problème de dépendance avec les IP que Kubernetes propose des Services. Ils permettent de localiser un pod sans passer par son adresse IP.

Service de type ClusterIP

Le service de type ClusterIP est le service par défaut de Kubernetes. Il donne un service à l’intérieur du cluster. Les pods à l’intérieur du même cluster peuvent utiliser ce service pour y accéder. Le service de type ClusterIP ne propose pas d’accès externe.

ClusterIP

apiVersion: v1
kind: Service
metadata: 
 name: my-service
spec:
 selector:   
   app: pod_b
 type: ClusterIP
 ports: 
 - name: http
   port: 80
   targetPort: 8080
   protocol: TCP

Tous les pods à l’intérieur du cluster peuvent atteindre le pod_b sur leur port 8080 via http://my-service:80. Il est aussi possible d’atteindre le pod_b en passant par l’adresse IP du clusterIP, mais ceci n’est pas conseillé. Si il y a plusieurs pod qui ont un label “app” égale à “pod_b”, my-service distribue les requêtes selon une approche aléatoire.

NodePort

Un service NodePort est le moyen le plus simple d’aiguiller du trafic externe directement vers un Pod. NodePort, comme son nom l’indique, ouvre un port spécifique sur tous les Nœuds (les VMs), et tout trafic envoyé vers ce port est transféré vers le service.

ClusterIP

apiVersion: v1
kind: Service
metadata:
 name: my-service
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 8080
   nodePort: 3216
 selector:
   app: pod_2
 type: NodePort

LoadBalancer

Un service LoadBalancer est le moyen standard d’exposer un service via un load balancer. Ce type de service est particulièrement adapté aux clusters Kubernetes managés par un fournisseur cloud. Par exemple sur l’infrastructure Cloud de Google, dans un cluster GKE, cela fera tourner un loadbalancer qui donnera une adresse IP unique qui transférera tout le trafic vers votre service.

ClusterIP

apiVersion: v1
kind: Service
metadata:
 name: my-service
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 8080
   nodePort: 30216
 selector:
   run: pod_b
 type: LoadBalancer