Différence entre le port de conteneur et le port cible dans Kubernetes?
En quoi est-ce container port
différent d' targetports
un conteneur dans Kubernetes? Sont-ils utilisés de manière interchangeable, si oui, pourquoi?
Je suis tombé sur l'extrait de code ci-dessous où containerPort
est utilisé pour désigner le port
sur un pod dans 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
Dans l'extrait de code ci-dessus, ils ont donné 5432 pour le containerPort
paramètre (dans la dernière ligne). Alors, en quoi est-ce containerPort
différent targetport
?
Autant que je sache, le terme port
en général fait référence au port
sur le service
(Kubernetes). Corrigez-moi si je me trompe.
Réponses
En un mot: targetPort
et containerPort
se réfèrent essentiellement au même port (donc si les deux sont utilisés, ils devraient avoir la même valeur) mais ils sont utilisés dans deux contextes différents et ont des objectifs entièrement différents.
Ils ne peuvent pas être utilisés de manière interchangeable car les deux font partie de la spécification de deux ressources / objets Kubernetes distincts: Service
et Pod
respectivement. Alors que le but de containerPort
peut être traité comme purement informatif, il targetPort
est requis par le Service
qui expose un ensemble de Pods
.
Il est important de comprendre qu'en déclarant containerPort
avec la valeur spécifique dans votre Pod
/ Deployment
spécification, vous ne pouvez pas vous obliger Pod
à exposer ce port spécifique, par exemple si vous déclarez dans le containerPort
champ que votre nginx Pod
expose le port 8080
au lieu de celui par défaut 80
, vous devez toujours configurer votre serveur nginx dans votre conteneur à écouter sur ce port.
La déclaration containerPort
dans la Pod
spécification est facultative. Même sans elle, vous Service
saurez où diriger la demande en fonction des informations qu'elle a déclarées dans son fichier targetPort
.
Il est bon de se rappeler qu'il n'est pas nécessaire de déclarer targetPort
dans la Service
définition. Si vous l'omettez, il prend par défaut la valeur pour port
laquelle vous avez déclaré (qui est le port de Service
lui - même).
ContainerPort dans la spécification du pod
Liste des ports à exposer à partir du conteneur. L'exposition d'un port ici donne au système des informations supplémentaires sur les connexions réseau utilisées par un conteneur, mais elles sont principalement informatives. Ne pas spécifier de port ici N'empêche PAS ce port d'être exposé
targetPort dans les spécifications de service
Numéro ou nom du port auquel accéder sur les pods ciblés par le service. Le numéro doit être compris entre 1 et 65535. Le nom doit être un IANA_SVC_NAME. S'il s'agit d'une chaîne, elle sera recherchée en tant que port nommé dans les ports de conteneur du pod cible. Si cela n'est pas spécifié, la valeur du champ 'port' est utilisée (une carte d'identité).
Par conséquent, le targetPort
service doit correspondre à la containerPort
spécification du pod car c'est ainsi que le service sait à quel port de conteneur est la destination de transfert du trafic.