web-dev-qa-db-fra.com

Qu'est-ce que cela signifie pour un service d'être de type NodePort et d'avoir à la fois port et targetPort spécifiés?

Je me familiarise de jour en jour avec Kubernetes, mais je suis toujours à un niveau basique. Je ne suis pas non plus un gars de réseautage.

Je regarde l'extrait suivant d'une définition de service, et je ne peux pas me faire une bonne idée de ce qui est déclaré:

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

Référencement de la documentation ServicePort , qui se lit en partie:

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

Ma compréhension est que le port qu'un client en dehors du cluster "verra" sera celui assigné dynamiquement dans la plage de 30000-32767, tel que défini dans la documentation . Cela, en utilisant une magie noire que je ne comprends pas encore, coulera vers le targetPort sur un nœud donné (27017 dans ce cas).

Alors, à quoi sert le port ici?

36
Laird Nelson

nodePort est le port qu'un client en dehors du cluster "verra". nodePort est ouvert sur chaque nœud de votre cluster via kube-proxy . Avec iptables magic, Kubernetes (k8s) achemine ensuite le trafic de ce port vers un module de service correspondant (même si ce module s'exécute 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

De 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 demande qui y parvient est transmise à un pod en cours d'exécution sur targetPort 8070.

tagetPort est également par défaut la même valeur que port sauf indication contraire.

41
fishi0x01

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

NodePort Service

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

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

Les pods sont accessibles non seulement via l'IP du cluster interne, mais également via l'IP du nœud et le port réservé aka Host_IP:NODE_PORT paire.

7
Sayat Satybald