services pods name example deployments deploy create container kubernetes

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.