Laissez-moi diviser cette question en plusieurs sous-parties comme nous le faisons en agile.
Qu'est-ce qu'un service headless exactement.
Il est utilisé pour découvrir des pods individuels (surtout des adresses IP) qui permet à un autre service d'interagir directement avec les Pods au lieu d'un proxy. Avec NodePort, LoadBalancer, ExternalName et ClusterIP, les clients se connectent généralement aux pods à travers un Service (Les services Kubernetes simplement expliqués visuellement) au lieu de se connecter directement.
Quel est son objectif ?
Le but n'est pas de créer une seule adresse IP comme dans le cas des autres types de services. Nous avons besoin de toutes les adresses IP des pods derrière le service.
Quels sont quelques cas d'utilisation légitimes pour cela ?
-
Créer un service Stateful.
-
Déployer RabbitMQ ou Kafka (ou tout autre service de courtage de messages) sur Kubernetes nécessite un ensemble d'États pour les nœuds de cluster RabbitMQ.
-
Déploiement de bases de données relationnelles
-
et bien d'autres
Quelques exemples pratiques en action
Configuration de déploiement
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels:
app: server
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
Service Régulier
apiVersion: v1
kind: Service
metadata:
name: regular-svc
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
Service Headless
apiVersion: v1
kind: Service
metadata:
name: headless-svc
spec:
clusterIP: None # <= N'oubliez pas !!
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
Créez toutes les ressources et exécutez un pod temporaire.
k run tmp01 --image=tutum/dnsutils -- sleep infinity
k exec tmp01 -it -- /bin/sh
#=> nslookup regular-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: regular-svc.moon.svc.cluster.local
Address: 10.109.150.46
#=> nslookup headless-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.31
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.30
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.32
Le serveur DNS renvoie trois adresses IP différentes pour le FQDN headless-svc.moon.svc.cluster.local
.
Note 1 : avec un service headless, les clients peuvent se connecter à ses pods en se connectant au nom DNS du service, comme c'est le cas avec les services réguliers. Mais avec les services headless, parce que le DNS renvoie les adresses IP des pods, les clients se connectent directement aux pods, au lieu de passer par le proxy du service.
Note 2 : Les services headless fournissent toujours l'équilibrage de charge entre les pods mais à travers le mécanisme de round-robin DNS au lieu du proxy du service.