Je voudrais comprendre le mappage entre le port de service et le port de conteneur de pod.
Dois-je définir le port de conteneur dans le cadre de mon pod et également dans le cadre de mon service? Ou vous pouvez simplement l'exposer dans le cadre du service?
4 Réponses :
Le port que le conteneur expose et le port du service sont des concepts différents dans Kubernetes.
Si vous souhaitez créer un service pour votre application, votre pod doit avoir un port. Par exemple, ceci est un pod yaml:
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
run: my-nginx
containerPort définit le port que l'application exposera.
Pour accéder à cette application via un service, vous devez créer un objet de service avec un tel yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 8080
Dans ce yaml, le mot-clé port définit le port du service. targetPort est le port de votre application. Ainsi, le port du service est différent.
Voici une bonne définition tirée de la documentation officielle:
Un service Kubernetes est une abstraction qui définit un ensemble logique de Pods et une politique pour y accéder - parfois appelée micro-service. L'ensemble des pods ciblés par un service est (généralement) déterminé par un sélecteur d'étiquettes (voir ci-dessous pourquoi vous pourriez vouloir Service sans sélecteur).
Exemple de scénario tiré de la documentation officielle: kubernetes.io/docs / tasks / access-application-cluster /…
Retrouvez ci-dessous l'exemple de déploiement
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
run: my-nginx
Il déploiera deux instances nginx pod. le port du conteneur est défini dans la spécification du conteneur. qui montre que nginx fonctionne sur le port 8080.
permet maintenant de déployer le service
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 8080
La définition de service ci-dessus crée un service qui cible le port TCP 8080 sur tout Pod avec le libellé run: my-nginx La spécification du service montre que le service est exposé sur le port 80, qui peut être n'importe quel port, d'autres pods utilisent pour accéder au service nginx
Donc, si je n'ai défini aucun port dans le cadre de la spécification du pod, k8s l'expose-t-il au niveau du conteneur?
non. le service doit savoir quel port de conteneurs doit être ciblé. par conséquent, vous devez définir le port du conteneur dans la spécification du pod.
"targetPort" de la spécification du service et "containerPort" du déploiement doivent correspondre ou doivent être identiques?
«targetPort» de la spécification du service et «containerPort» du déploiement doivent correspondre
Prenons un exemple et essayons de comprendre à l'aide d'un diagramme. Considérez un cluster ayant 2 nœuds et un service. Chaque nœud ayant 2 pods et chaque pod ayant 2 conteneurs, dit conteneur d'application et conteneur Web.
NodePort: 3001 (port exposé au niveau du cluster pour chaque nœud)
Port: 80 (port de service)
targetPort: 8080 (le port du conteneur d'application doit être mentionné dans le docker expose)
targetPort: 80 (le port du conteneur Web doit être mentionné dans le docker exposer)
Le diagramme ci-dessous devrait maintenant nous aider à mieux le comprendre.
Pour référence et plus de détails, veuillez vous référer au lien ci-dessous https: // theithollow.com/2019/02/05/kubernetes-service-publishing/
containerPort dans le cadre de la définition du pod n'a qu'un but informatif. En fin de compte, si vous souhaitez exposer cela en tant que service dans le cluster ou le nœud, vous devez créer un service.
Pour répondre à votre question, oui, cela suffit si vous l'exposez simplement dans le cadre du service Kubernetes. Il est recommandé de mentionner dans le cadre de la définition de pod afin que si quelqu'un regarde la définition puisse comprendre le port sur lequel votre service de conteneur est exécuté.
Ceci est très bien expliqué ici a> -
C'est la seule réponse non trompeuse.