Різниця між targetPort та портом у визначенні служби Kubernetes


130

Kubernetes Serviceможе мати визначення targetPortта portв службі:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

Яка різниця між portта targetPort?


Ви можете передати це питання stackoverflow.com/questions/41963433 / ...
Адітья Pawaskar

Відповіді:


81

Сервіс: Це спрямовує трафік на поділ.

TargetPort: це фактичний порт, на якому ваша програма працює у контейнері.

Порт: Деякі рази ваша програма всередині контейнера обслуговує різні послуги на іншому порту.

Приклад: фактична програма може запускатися, 8080і перевірки стану здоров'я для цієї програми можуть працювати на 8089порту контейнера. Тож якщо ви потрапляєте на службу без порту, вона не знає, на який порт контейнера він повинен перенаправити запит. Сервіс повинен мати відображення, щоб воно могло потрапити на конкретний порт контейнера.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

якщо ви потрапили, my-service:8089трафік перенаправляється до 8080контейнера (targetPort). Аналогічно, якщо ви потрапили, my-service:8443то він буде переспрямований на 8085контейнер (targetPort). Але це myservice:8089є внутрішнім для кластера kubernetes і може використовуватися, коли одна програма хоче спілкуватися з іншою програмою. Тож, щоб потрапити на службу з-за кластера, комусь потрібно виставити порт на хост-машині, на якій запущені кубернети, щоб трафік переспрямовувався на порт контейнера. Це node port(порт, відкритий на хост-машині). З наведеного вище прикладу, ви можете звернутися до служби з-за кластера (Поштова або будь-який інший клієнт) за допомогоюhost_ip:nodePort

Припустимо, що ваш господар машини внутрибрюшинно це 10.10.20.20ви можете натиснути на HTTP, метрики, медичні послуги з 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

Зміни: Відредаговано відповідно до коментаря Редвальда .


4
Яка перевага дозволяє portі targetPortбути різною? Так, наприклад, дивлячись на ваш healthприклад, навіщо робити port 8443замість цього 8085? По суті, чому існують два параметри, а не просто виставляти всі targetPorts на сервіс?
Dan

Привіт, Ден, ти можеш використовувати 8443 як порт і цільовий порт для здоров'я. Я використовував різні цифри для кращого пояснення.
Manikanta P

дякую за відповідь. Я мав на увазі, в яких ситуаціях було б корисно зробити їх різними?
Dan

"біг по контейнеру" означає? Порт, який використовує сервер всередині контейнера? Або порт, який використовують клієнти поза контейнером?
Raedwald

Чи можемо ми припустити фіксований IP для хост-машини, наприклад 10.10.20.20 в Cloud Services? e, g, Azure AKS із ситуацією розгортання кількох вузлів?
Jaish Mathews

16

Мені це допомагає думати про речі з точки зору служби .

  • nodePort: Порт на вузлі, куди надходитиме зовнішній трафік
  • port: Порт цієї послуги
  • targetPort Цільовий порт на поділках, для переадресації трафіку

Трафік надходить nodePort, переходить portна службу, яка потім прямує targetPortна поді (и).

Варто наголосити більше, що nodePortстосується зовнішнього руху. Інші стручки кластера, які, можливо, потребуватимуть доступу до сервісу, просто використовуватимуть port, а не nodePortвнутрішній доступ до сервісу.

Також варто зазначити, що якщо targetPortйого не встановлено, воно буде за замовчуванням таким же значенням, як і port. Наприклад, 80:80для порту 80контейнера, орієнтованого на сервіс 80.


4
хороший підсумок, який у кількох словах добре відповідає на питання, дякую!
Вольфсон

Погодьтеся. Інші відповіді я визнав заплутаними, але ця вдарила нігтем.
Микола Малешевич

Люди хочуть знати різницю між portта targetPort. Ти справді очистив плутанину.
Анкур Гаутам

1
Я погоджуюсь, я вважаю, що саме ця відповідь "вище" відкриває додаткові поля та більш широкі теми, що ускладнює розуміння. Ура юльз.
Worp

10

Відповідь, подана вище @Manikanta P, є правильною. Однак пояснення "Порту" може бути трохи незрозумілим на першому читанні. Я поясню на прикладі:

Розглянемо веб-додаток з його статичним вмістом (титульна сторінка, зображення тощо), розміщеним httpd, та динамічним контентом (наприклад, відповіді на запити тощо), розміщеним Tomcat. Веб-сервер (або статичний контент) обслуговується httpd у порту, 80тоді як Appserver (або динамічний контент) обслуговується tomcat в порту 8080.

Що хоче розробник: Користувач повинен мати доступ до веб-сервера ззовні, АЛЕ не Appserver ззовні.

Рішення: Тип сервісу веб-сервера в його service.yml буде NodePort, тоді як тип служби Appserver у його service.yml буде ClusterIP.

Код служби service.yml:

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type <host_IP>:30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Код для служби Appserver.yml

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

Також зверніть увагу, що у httpd.confфайл веб-сервера ми запишемо IP, який перенаправляє запит користувача на додаток. Цей IP буде: host_IP:5050.

Що саме тут відбувається? Користувач пише hostIP:30475і бачить сторінку веб-сервера. Це тому, що його обслуговує httpd у порту 80(targetport). Коли користувач натискає кнопку, робиться запит. Цей запит переспрямовується на Appserver, оскільки у httpd.confфайлі 5050згадується порт , і це порт, де контейнер Appserver і контейнер контейнера Webserver внутрішньо спілкуються. Коли додаток отримує запит, він може обслуговувати його через Tomcat, що працює в ньому в порту 8080.


4
Чому специфікація веб-сервера визначає "порт: 5050"? Якщо я правильно зрозумів, веб-сервер називає appserver: 5050, а не навпаки ...?
Евертон

1
На додаток до питання Евертона, який сенс Tomcat потребує відкрити порт 8080, якщо він обслуговує внутрішні запити на порт 5050?
Стівен

Ця відповідь бентежить. Крім того, де httpd.confв "тому що у файлі httpd.conf згадується порт 5050"
Полімераза

Файл @Polymerase httpd.conf постачається з пакетом httpd, який ви встановлюєте у вашій системі. Це внутрішній файл, який ви повинні налаштувати. Шлях: /etc/httpd/conf/http.conf
matak8s

@Stephen в tomcat / conf / server.xml, ми вказуємо порт, на якому буде запускатися служба tomcat. Це той самий номер порту, який ми пишемо як цільовий порт, щоб kubernetes розумів, що він повинен запускати службу Tomcat на цьому порту. Виправте мене, якщо я помиляюся.
matak8s

1

Ця відповідь посилається на документацію Kubernetes на додаток до інших відповідей:

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

targetPort: це порт, на який контейнер приймає трафік,

port: - це абстрагований порт Сервісу, який може бути будь-яким портом, який інші стручки використовують для доступу до Сервісу

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

Визначення портів у Pods мають назви, і ви можете посилатися на ці імена в targetPortатрибуті Сервісу. Це працює, навіть якщо в Сервісі є суміш Pods, що використовує одне налаштоване ім'я, з тим самим мережевим протоколом, доступним через різні номери портів.


Дякую за стислу відповідь
Анкур Гаутам

1

Коротше кажучи

nodeport: Слухає зовнішній запит на всіх робочих вузлах у nodeip: port та пересилає запит до порту.

port: Внутрішній порт обслуговування кластера для контейнера і прослуховує вхідний запит з вузла транспорту і пересилає до targetPort.

targetPort:Отримайте запит від порту та вперед до контейнера (порта), де він прослуховується. навіть якщо ви не вкажете це, за замовчуванням отримаєте ті ж номери портів, що і порту.


0

"Цільовий порт" - це порт, на якому працює ваш контейнер.

Port: порт перенаправляє трафік до контейнера з сервісу.

Розкриття розгортання

  master $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE

nginx        1/1     1            1           31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed

master $ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

nginx-svc    ClusterIP   10.107.209.151   <none>        8080/TCP   5s

NodePort: це порт, який дозволяє сервісу отримувати доступ зовнішньо.

Сподіваюся, що це відповідає.


0

якщо контейнер слухає порт 9376, то targetPort : 9376

якщо служба слухає порт 80, то порт : 80

Тоді конфігурація портів сервісів виглядає нижче

ports:
 - protocol: TCP
   port: 80
   targetPort: 9376

Нарешті, запит отриманий до порту служби та пересланий на цільовий порт підрозділу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.