kubernetes - pods - ¿Qué significa que un Servicio sea del tipo NodePort y que se hayan especificado el puerto y el targetPort?
kubernetes service deployment (2)
Me estoy familiarizando con Kubernetes cada día, pero todavía estoy en un nivel básico. Tampoco soy un tipo de redes.
Estoy mirando el siguiente fragmento de una definición de Servicio, y no puedo tener la imagen correcta en mi mente de lo que se está declarando:
spec:
type: NodePort
ports:
- port: 27018
targetPort: 27017
protocol: TCP
Haciendo referencia a la documentación de ServicePort , que se lee en parte:
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
Según tengo entendido, el puerto que un cliente que está fuera del clúster "verá" será el asignado dinámicamente en el rango de 30000
- 32767
, como se define en la documentación . Esto, utilizando un poco de magia negra que aún no entiendo, fluirá al targetPort
en un nodo determinado ( 27017
en este caso).
Entonces, ¿para qué se usa el port
aquí?
Para explicar mejor el concepto, visualizo el concepto NodePort del Servicio.
Como @fishi mencionó en su respuesta, NodePort permite exponer el puerto del host k8s (también nodePort
como nodePort
) a los clientes externos. Un cliente puede acceder directamente a nodePort
y k8s reenvía un tráfico al puerto necesario.
K8s reserva un nodePort
en todos sus nodos. Todos los nodos que ejecutan los pods del Servicio tienen este puerto abierto.
Se puede acceder a los HOST_IP:NODE_PORT
no solo a través de la IP del clúster interno, sino también a través de la IP del nodo y el puerto reservado, también HOST_IP:NODE_PORT
como HOST_IP:NODE_PORT
.
nodePort
es el puerto que un cliente fuera del clúster "verá". nodePort
se abre en cada nodo de su clúster a través de kube-proxy . Con iptables magic Kubernetes (k8s), luego se enruta el tráfico desde ese puerto a un pod de servicio correspondiente (incluso si ese pod se está ejecutando en un nodo completamente diferente).
port
es el puerto en el que escucha su servicio dentro del clúster. Tomemos este ejemplo:
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 8080
targetPort: 8070
nodePort: 31222
protocol: TCP
selector:
component: my-service-app
Desde dentro de mi clúster k8s se podrá acceder a este servicio a través de my-service.default.svc.cluster.local:8080
(comunicación de servicio a servicio dentro de su clúster) y cualquier solicitud que llegue allí se reenviará a un pod en targetPort
en targetPort
8070.
tagetPort
también es por defecto el mismo valor que el port
si no se especifica lo contrario.