3
votes

Pods de port de conteneur vs service de port de conteneur

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?


0 commentaires

4 Réponses :


5
votes

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).


1 commentaires

Exemple de scénario tiré de la documentation officielle: kubernetes.io/docs / tasks / access-application-cluster /…



-1
votes

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


4 commentaires

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



2
votes

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.

 entrez la description de l'image ici

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/


0 commentaires

8
votes

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 -


1 commentaires

C'est la seule réponse non trompeuse.