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?
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.
Pour mieux expliquer le concept, je visualise le concept NodePort de 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.