140 votes

Qu'est-ce qu'un service headless, que fait-il/accomplit-il et quels sont certains cas d'utilisation légitimes pour celui-ci?

J'ai lu quelques passages de certains livres écrits sur Kubernetes ainsi que la page sur les services sans tête dans la documentation. Mais je ne suis toujours pas sûr de ce que cela fait réellement et pourquoi quelqu'un l'utiliserait. Est-ce que quelqu'un en a une bonne compréhension, de ce qu'il réalise et pourquoi quelqu'un l'utiliserait?

278voto

Konstantin Vustin Points 1131

Eh bien, je pense que vous avez besoin de quelques explications. Il y a de nombreuses explications (y compris la documentation officielle) sur tout Internet, mais je pense que Marco Luksa l'a fait le mieux:

Chaque connexion au service est redirigée vers un pod de sauvegarde sélectionné de manière aléatoire. Mais que se passe-t-il si le client a besoin de se connecter à tous ces pods? Et si les pods de sauvegarde eux-mêmes ont besoin de se connecter à tous les autres pods de sauvegarde. Se connecter via le service n'est clairement pas la solution à adopter. Quelle est la solution?

Pour qu'un client se connecte à tous les pods, il doit connaître l'IP de chaque pod individuel. Une option consiste à ce que le client appelle le serveur API Kubernetes et obtienne la liste des pods et de leurs adresses IP via un appel API, mais comme vous devez toujours faire en sorte que vos applications soient agnostiques à Kubernetes, l'utilisation du serveur API n'est pas idéale

Heureusement, Kubernetes permet aux clients de découvrir les adresses IP des pods via des recherches DNS. Habituellement, lorsque vous effectuez une recherche DNS pour un service, le serveur DNS renvoie une seule IP - l'IP de cluster du service. Mais si vous indiquez à Kubernetes que vous n'avez pas besoin d'une IP de cluster pour votre service (vous faites cela en définissant le champ clusterIP sur None dans la spécification du service), le serveur DNS renverra les adresses IP des pods au lieu de l'unique IP de service. Au lieu de renvoyer un seul enregistrement DNS A, le serveur DNS renverra plusieurs enregistrements A pour le service, chacun pointant vers l'IP d'un pod individuel soutenant le service à ce moment-là. Les clients peuvent donc effectuer une simple recherche DNS d'enregistrement A et obtenir les IPs de tous les pods faisant partie du service. Le client peut ensuite utiliser ces informations pour se connecter à un, plusieurs ou tous ces pods.

Définir le champ clusterIP dans une spécification de service sur None rend le service sans tête, car Kubernetes ne lui attribuera pas d'IP de cluster via lequel les clients pourraient se connecter aux pods qui le soutiennent.

"Kubernetes in Action" de Marco Luksa

49 votes

J'étais heureux de vous aider, mais je voudrais vous conseiller d'acheter ce livre. L'auteur a sans aucun doute fait un excellent travail et devrait être encouragé.

26voto

VKatz Points 3187

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.

0 votes

Le livre Kubernetes in Action n'est pas juste un livre, c'est une Bible pour Kubernetes.

22voto

Raff Points 179

Tout simplement, un service Headless est identique à un service ClusterIP par défaut, mais ne dispose pas d'équilibrage de charge ou de proxy. Vous permettant de vous connecter directement à un Pod.

12 votes

Les services sans tête continuent de fournir un équilibrage de charge entre les pods mais à travers le mécanisme de round-robin DNS au lieu du proxy de service.

1 votes

Il fournit toujours l'équilibrage de charge par DNS RR

5voto

Adrian Points 461

Je pense que le cas d'utilisation le plus courant est principalement attribuable aux StatefulSets, qui nécessitent actuellement un Headless Service. Voir why-statefulsets-cant-a-stateless-pod-use-persistent-volumes quand vous pourriez en utiliser un...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X