Differenza tra porta container e porta di destinazione in Kubernetes?
Qual è la container port
differenza rispetto targetports
a un contenitore in Kubernetes? Sono usati in modo intercambiabile, in caso affermativo perché?
Mi sono imbattuto nello snippet di codice riportato di seguito dove containerPort
viene utilizzato per denotare port
su un pod in 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
Nello snippet di codice sopra, hanno fornito 5432 per il containerPort
parametro (nell'ultima riga). Allora, come è containerPort
diverso da targetport
?
Per quanto ne so, il termine port
, in generale, si riferisce al port
sul service
(kubernetes). Correggimi se sbaglio.
Risposte
In poche parole: targetPort
e containerPort
fondamentalmente si riferiscono alla stessa porta (quindi se vengono utilizzate entrambe ci si aspetta che abbiano lo stesso valore) ma sono utilizzate in due contesti diversi e hanno scopi completamente diversi.
Non possono essere utilizzati in modo intercambiabile poiché entrambi fanno parte della specifica di due risorse / oggetti kubernetes distinti: Service
e Pod
rispettivamente. Mentre lo scopo di containerPort
può essere trattato come puramente informativo, targetPort
è richiesto dal Service
quale espone un insieme di Pods
.
È importante capire che dichiarando containerPort
con il valore specifico nella tua Pod
/ Deployment
specifica non puoi fare Pod
in modo di esporre questa porta specifica, ad esempio se dichiari nel containerPort
campo che il tuo nginx Pod
espone la porta 8080
invece di quella predefinita 80
, devi comunque configurare il tuo server nginx nel tuo contenitore per ascoltare su questa porta.
La dichiarazione containerPort
nelle Pod
specifiche è facoltativa. Anche senza di essa Service
saprai dove indirizzare la richiesta in base alle informazioni che ha dichiarato nel suo targetPort
.
È bene ricordare che non è necessario dichiarare targetPort
nella Service
definizione. Se lo ometti, il valore predefinito è il valore dichiarato port
(che è la porta di Service
se stesso).
ContainerPort nelle specifiche del pod
Elenco delle porte da esporre dal container. L'esposizione di una porta qui fornisce al sistema informazioni aggiuntive sulle connessioni di rete utilizzate da un contenitore, ma è principalmente informativo. La mancata specifica di una porta qui NON impedisce che la porta venga esposta
targetPort nelle specifiche del servizio
Numero o nome della porta a cui accedere sui pod targetizzati dal servizio. Il numero deve essere compreso tra 1 e 65535. Il nome deve essere IANA_SVC_NAME. Se questa è una stringa, verrà cercata come una porta denominata nelle porte del contenitore del pod di destinazione. Se non viene specificato, viene utilizzato il valore del campo "porta" (una mappa di identità).
Quindi targetPort
in service deve corrispondere alle containerPort
specifiche in pod perché è così che il servizio sa quale porta del container è la destinazione a cui inoltrare il traffico.