¿Diferencia entre el puerto de contenedor y el puerto de destino en Kubernetes?

Aug 17 2020

¿En qué se container portdiferencia de targetportsun contenedor en Kubernetes? ¿Se usan indistintamente, si es así por qué?

Encontré el siguiente fragmento de código donde containerPortse usa para denotar porten un pod en Kubernetes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
  labels:
    app: demo-voting-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: postgres-pod
      app: demo-voting-app
  template:
    metadata:
      name: postgres-pod
      labels:
        name: postgres-pod
        app: demo-voting-app

    spec:
      containers:
      - name: postgres
        image: postgres:9.4
        ports:
        - containerPort: 5432
        

En el fragmento de código anterior, han dado 5432 para el containerPortparámetro (en la última línea). Entonces, ¿en qué se containerPortdiferencia esto de targetport?

Hasta donde yo sé, el término porten general se refiere al porten service(Kubernetes). Corrígeme si me equivoco.

Respuestas

4 mario Aug 18 2020 at 16:17

En pocas palabras: targetPort y containerPortbásicamente se refieren al mismo puerto (por lo que si se usan ambos, se espera que tengan el mismo valor) pero se usan en dos contextos diferentes y tienen propósitos completamente diferentes.

No se pueden usar indistintamente ya que ambos son parte de la especificación de dos recursos / objetos de kubernetes distintos: Servicey Podrespectivamente. Si bien el propósito de containerPortpuede tratarse como puramente informativo, targetPortes requerido por el Serviceque expone un conjunto de Pods.

Es importante comprender que al declarar containerPortcon el valor específico en su especificación Pod/ Deploymentno puede hacer Podque exponga este puerto específico, por ejemplo, si declara en el containerPortcampo que su nginx Podexpone el puerto en 8080lugar del predeterminado 80, aún necesita configurar su servidor nginx en su contenedor para escuchar en este puerto.

La declaración containerPorten la Podespecificación es opcional. Incluso sin él Service, sabrá a dónde dirigir la solicitud en función de la información que ha declarado en su targetPort.

Es bueno recordar que no es necesario declarar targetPorten la Servicedefinición. Si lo omite, el valor predeterminado es el que declaró port(que es el puerto del Servicemismo).

2 ArghyaSadhu Aug 17 2020 at 10:05

ContainerPort en la especificación de pod

Lista de puertos a exponer del contenedor. Exponer un puerto aquí le da al sistema información adicional sobre las conexiones de red que usa un contenedor, pero es principalmente informativo. No especificar un puerto aquí NO evita que ese puerto quede expuesto

targetPort en especificaciones de servicio

Número o nombre del puerto al que se accede en los pods a los que apunta el servicio. El número debe estar en el rango de 1 a 65535. El nombre debe ser IANA_SVC_NAME. Si se trata de una cadena, se buscará como un puerto con nombre en los puertos del contenedor del Pod de destino. Si no se especifica, se utiliza el valor del campo 'puerto' (un mapa de identidad).

Por lo tanto, el targetPortservicio debe coincidir con la containerPortespecificación del módulo porque así es como el servicio sabe qué puerto de contenedor es el destino para reenviar el tráfico.