52 votes

Que signifie le fait qu'un service soit de type NodePort, et que le port et le targetPort soient spécifiés ?

Je me familiarise de plus en plus avec Kubernetes, mais je n'en suis encore qu'au niveau de base. Je ne suis pas non plus un spécialiste des réseaux.

Je regarde l'extrait suivant de la définition d'un service, et je n'arrive pas à me faire une idée précise de ce qui est déclaré :

spec:
  type: NodePort
  ports:
  - port: 27018
    targetPort: 27017
    protocol: TCP

Référence à la Documentation sur le ServicePort qui se lit en partie comme suit

nodePort     The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually
integer      assigned by the system. If specified, it will be allocated to the service if unused or else creation of the
             service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: 
             http://kubernetes.io/docs/user-guide/services#type--nodeport

port         The port that will be exposed by this service.
integer

targetPort   Number or name of the port to access on the pods targeted by the service. Number must be in the range 1
IntOrString  to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the
             target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map).
             This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field.
             More info: http://kubernetes.io/docs/user-guide/services#defining-a-service

D'après ce que j'ai compris, le port qu'un client extérieur au cluster "verra" sera le port attribué dynamiquement dans la plage suivante 30000 - 32767 comme défini dans la documentation . Celle-ci, par une sorte de magie noire que je ne comprends pas encore, s'écoulera vers les targetPort sur un nœud donné ( 27017 dans ce cas).

Alors, quel est le port utilisé ici ?

56voto

fishi Points 2112

nodePort est le port qu'un client extérieur au cluster "verra". nodePort est ouvert sur chaque nœud de votre cluster via kube-proxy . Grâce à la magie d'iptables, Kubernetes (k8s) achemine ensuite le trafic de ce port vers un pod de service correspondant (même si ce pod est exécuté sur un nœud complètement différent).

port est le port sur lequel votre service écoute à l'intérieur du cluster. Prenons cet exemple :

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 8080
    targetPort: 8070
    nodePort: 31222
    protocol: TCP 
  selector:
    component: my-service-app

Depuis l'intérieur de mon cluster k8s, ce service sera accessible via my-service.default.svc.cluster.local:8080 (communication de service à service à l'intérieur de votre cluster) et toute requête qui y parvient est transmise à un pod en fonctionnement sur targetPort 8070.

tagetPort est également par défaut la même valeur que port s'il n'est pas spécifié autrement.

0 votes

Merci. Alors nodePort es no un port sur lequel le Service écoute ? Il s'agit plutôt d'un port qui est ouvert sur les nœuds hébergeant les pods auxquels le service fait face ?

2 votes

nodePort est unique, donc 2 services différents ne peuvent pas avoir la même nodePort assigné. Une fois déclaré, le maître du k8s se réserve cette nodePort pour ce service. nodePort est ensuite ouvert sur CHAQUE nœud (maître et travailleur) - également les nœuds qui n'exécutent pas un pod de ce service -. k8s iptables La magie s'occupe de l'acheminement. De cette façon, vous pouvez faire une demande de service depuis l'extérieur de votre cluster k8s vers n'importe quel nœud du cluster. nodePort sans se soucier de savoir si un pod y est programmé ou non.

10 votes

Depuis le canal Slack #kubernetes-users : "le nodePort route vers le service, qui à son tour route vers la nacelle / si vous touchez le service directement, alors la nodePort l'étape est sautée / le " routage magique " est géré par kube-proxy ". Cela m'a amené à dire (en utilisant une notation inventée) : " nodePort -> port -> targetPort pas nodePort -> targetPort && port -> targetPort ".

8voto

Sayat Stb Points 58

Pour mieux expliquer le concept, je visualise le concept de NodePort de Service.

NodePort Service

Comme @fishi mentionné dans sa réponse NodePort permet d'exposer le port de l'hôte de k8 (alias nodePort ) aux clients externes. Un client peut accéder directement à nodePort et k8s transmet un trafic vers le port nécessaire.

K8s réserve une nodePort sur tous ses nœuds. Tous les nœuds qui exécutent les pods du service ont ce port ouvert.

On peut accéder aux pods non seulement par l'IP interne du cluster mais aussi par l'IP du nœud et le port réservé aka. HOST_IP:NODE_PORT paire.

2 votes

Je crois que l'image est mal orientée. Si, CURL 10.0.2.15:30230 est un appel externe, il devrait pointer vers le NodePort du nuage et celui-ci effectue le suivi de la demande vers le pod. Cela signifie que la partie cloud devrait avoir Node IP : 10.0.2.15 et NodePort : 30230. De plus, le pod "Pod : CURL" devrait être affiché avec une requête directement vers le pod "Pod : Nginx". Vous pouvez également avoir le pod "Pod : CURL" avec une requête vers la partie cloud de Node, mais je ne pense pas que vous vouliez représenter cela.

0 votes

Dans ce diagramme, je pense que 'hostPort' est l'adresse de l'utilisateur. nodePort et "Node Port" est le port .

0 votes

C'est déroutant ! Je suppose

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