¿Diferencia entre el puerto de contenedor y el puerto de destino en Kubernetes?
¿En qué se container port
diferencia de targetports
un contenedor en Kubernetes? ¿Se usan indistintamente, si es así por qué?
Encontré el siguiente fragmento de código donde containerPort
se usa para denotar port
en 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 containerPort
parámetro (en la última línea). Entonces, ¿en qué se containerPort
diferencia esto de targetport
?
Hasta donde yo sé, el término port
en general se refiere al port
en service
(Kubernetes). Corrígeme si me equivoco.
Respuestas
En pocas palabras: targetPort
y containerPort
bá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: Service
y Pod
respectivamente. Si bien el propósito de containerPort
puede tratarse como puramente informativo, targetPort
es requerido por el Service
que expone un conjunto de Pods
.
Es importante comprender que al declarar containerPort
con el valor específico en su especificación Pod
/ Deployment
no puede hacer Pod
que exponga este puerto específico, por ejemplo, si declara en el containerPort
campo que su nginx Pod
expone el puerto en 8080
lugar del predeterminado 80
, aún necesita configurar su servidor nginx en su contenedor para escuchar en este puerto.
La declaración containerPort
en la Pod
especificació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 targetPort
en la Service
definición. Si lo omite, el valor predeterminado es el que declaró port
(que es el puerto del Service
mismo).
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 targetPort
servicio debe coincidir con la containerPort
especificación del módulo porque así es como el servicio sabe qué puerto de contenedor es el destino para reenviar el tráfico.