Diferença entre porta de contêiner e porta de destino no Kubernetes?
Qual é a container port
diferença targetports
em um contêiner no Kubernetes? Eles são usados de forma intercambiável, se sim, por quê?
Encontrei o trecho de código abaixo, onde containerPort
é usado para denotar o port
em um pod no 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
No trecho de código acima, eles deram 5432 para o containerPort
parâmetro (na última linha). Então, como isso é containerPort
diferente targetport
?
Pelo que eu sei, o termo port
em geral se refere ao port
no service
(Kubernetes). Corrija-me se estiver incorreto.
Respostas
Resumindo: targetPort
e containerPort
basicamente referem-se à mesma porta (portanto, se ambas forem usadas, espera-se que tenham o mesmo valor), mas são usadas em dois contextos diferentes e têm finalidades totalmente diferentes.
Eles não podem ser usados de forma intercambiável, pois ambos são partes da especificação de dois recursos / objetos kubernetes distintos: Service
e Pod
respectivamente. Embora o objetivo de containerPort
possa ser tratado como puramente informativo, targetPort
é exigido pelo Service
que expõe um conjunto de Pods
.
É importante entender que ao declarar containerPort
com o valor específico em sua especificação Pod
/ Deployment
você não pode fazer Pod
com que exponha esta porta específica, por exemplo, se você declarar no containerPort
campo que seu nginx Pod
expõe a porta em 8080
vez do padrão 80
, você ainda precisa configurar seu servidor nginx em seu contêiner para ouvir nesta porta.
A declaração containerPort
na Pod
especificação é opcional. Mesmo sem ele você Service
saberá para onde direcionar a solicitação com base nas informações declaradas em seu targetPort
.
É bom lembrar que não é obrigatório declarar targetPort
na Service
definição. Se você omiti-lo, o padrão é o valor declarado port
(que é a porta do Service
próprio).
ContainerPort nas especificações do pod
Lista de portas a serem expostas do contêiner. Expor uma porta aqui fornece ao sistema informações adicionais sobre as conexões de rede que um contêiner usa, mas é principalmente informativo. Não especificar uma porta aqui NÃO impede que essa porta seja exposta
targetPort nas especificações de serviço
Número ou nome da porta a ser acessada nos pods direcionados pelo serviço. O número deve estar no intervalo de 1 a 65535. O nome deve ser IANA_SVC_NAME. Se for uma string, ela será pesquisada como uma porta nomeada nas portas do contêiner do Pod de destino. Se isso não for especificado, o valor do campo 'porta' é usado (um mapa de identidade).
Portanto, o targetPort
in service precisa corresponder às containerPort
especificações do pod, porque é assim que o serviço sabe para qual porta de contêiner é o destino para encaminhar o tráfego.