Saltar al contenido

Diferencia entre targetPort y port en la definición del servicio de Kubernetes

Te doy la bienvenida a nuestra página web, en este sitio hallarás la solucíon de lo que buscas.

Solución:

Servicio: Esto dirige el tráfico a un grupo.

TargetPort: Este es el puerto real en el que se ejecuta su aplicación dentro del contenedor.

Puerto: Algunas veces, su aplicación dentro del contenedor sirve diferentes servicios en un puerto diferente.

Ejemplo: La aplicación real se puede ejecutar 8080 y las comprobaciones de estado de esta aplicación se pueden ejecutar en 8089 puerto del contenedor. Entonces, si accede al servicio sin puerto, no sabe a qué puerto del contenedor debe redirigir la solicitud. El servicio debe tener un mapeo para que pueda llegar al puerto específico del contenedor.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

si golpeas el my-service:8089 el tráfico se encamina a 8080 del contenedor (targetPort). Del mismo modo, si aciertas my-service:8443 luego se redirige a 8085 del contenedor (targetPort). Pero esto myservice:8089 es interno al clúster de Kubernetes y se puede usar cuando una aplicación desea comunicarse con otra aplicación. Entonces, para acceder al servicio desde fuera del clúster, alguien debe exponer el puerto en la máquina host en la que se está ejecutando Kubernetes para que el tráfico se redirija a un puerto del contenedor. Este es node port(puerto expuesto en la máquina host). En el ejemplo anterior, puede acceder al servicio desde fuera del clúster (Postman o cualquier resto-cliente) mediante host_ip:nodePort

Digamos que la ip de su máquina host es 10.10.20.20 puede acceder a http, métricas, servicios de salud por 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

Ediciones: Editado según el comentario de Raedwald.

Me ayuda a pensar las cosas desde la perspectiva del servicio.

  • nodePort: El puerto en el nodo donde entrará el tráfico externo
  • port: El puerto de este servicio
  • targetPort El puerto de destino en los pod (s) para reenviar el tráfico a

El tráfico entra nodePort, reenvía a port en el servicio que luego se dirige a targetPort en las vainas.

Vale la pena enfatizar más que nodePort es para tráfico externo. Otros pods del clúster que puedan necesitar acceder al servicio solo usarán port, no nodePort ya que es solo acceso interno al servicio.

También vale la pena señalar que si targetPort no está configurado, por defecto tendrá el mismo valor que port. P.ej 80:80 para puerto de servicio 80 puerto de contenedores de destino 80.

La respuesta dada arriba por @Manikanta P es correcta. Sin embargo, la explicación de “Puerto” puede resultar un poco confusa en la primera lectura. Te lo explicaré con un ejemplo:

Considere una aplicación web con su static contenido (portada, imágenes, etc.) alojado por httpd y el contenido dinámico (por ejemplo, respuesta a solicitudes, etc.) alojado por tomcat. El servidor web (o el static contenido) es servido por httpd en el puerto 80 mientras que el servidor de aplicaciones (o el contenido dinámico) es servido por tomcat en el puerto 8080.

Lo que quiere un desarrollador: el usuario debe poder acceder al servidor web desde fuera, PERO no al servidor de aplicaciones desde fuera.

Solución: El tipo de servicio de Webserver en su service.yml será NodePort mientras que el tipo de servicio de Appserver en su service.yml será ClusterIP.

Código para service.yml del servidor web:

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type :30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Código para el service.yml del servidor de aplicaciones

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

También tenga en cuenta que en el httpd.conf archivo del servidor web, escribiremos la IP que redirige la solicitud de un usuario al servidor de aplicaciones. Esta IP será: host_IP:5050.

¿Qué está pasando exactamente aquí? Un usuario escribe hostIP:30475 y ve la página del servidor web. Esto se debe a que está siendo atendido por httpd en el puerto. 80 (puerto de destino). Cuando un usuario hace clic en un botón, se realiza una solicitud. Esta solicitud se redirige al servidor de aplicaciones porque en httpd.conf archivo, el puerto 5050 se menciona y este es el puerto donde el contenedor de Appserver y el contenedor del servidor web se comunican internamente. Cuando el servidor de aplicaciones recibe la solicitud, puede atender la solicitud debido a que Tomcat se ejecuta dentro de él en el puerto. 8080.

Valoraciones y comentarios

Puedes corroborar nuestra faena poniendo un comentario y valorándolo te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *