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

132

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/…
Адитья Паваскар

Ответы:

83

Служба: направляет трафик на контейнер.

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.

Изменения: отредактировано в соответствии с комментарием Раэдвальда .

Manikanta P
источник
4
В чем преимущество позволять portи targetPortотличаться? Так, например, глядя на ваш healthпример, зачем создавать port 8443вместо 8085? В принципе, почему есть два параметра вместо того, чтобы просто отображать все targetPortв сервисе?
Дэн
Привет, Дэн, вы можете использовать 8443 как порт и целевой порт для здоровья. Я использовал разные числа для лучшего объяснения.
Manikanta P
Спасибо за ответ. Я имел в виду, в каких ситуациях было бы полезно сделать их разными?
Дэн
значит "бег по контейнеру"? Порт, который использует сервер внутри контейнера? Или порт, который используют клиенты вне контейнера?
Raedwald
Можно ли предположить фиксированный IP-адрес для хост-машины, например 10.10.20.20 в облачных службах? e, g, Azure AKS с ситуацией развертывания нескольких узлов?
Jaish Mathews
17

Это помогает мне думать о вещах с точки зрения сервиса .

  • nodePort: Порт на узле, на который будет входить внешний трафик.
  • port: Порт этой службы
  • targetPort Целевой порт модуля (-ов) для пересылки трафика

Входящий трафик nodePortпересылается portна службу, которая затем направляется к targetPortмодулю (ам).

Особо подчеркнем, что nodePortэто касается внешнего трафика. Другие модули в кластере, которым может потребоваться доступ к службе, будут просто использовать port, nodePortа не только для внутреннего доступа к службе.

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

julz256
источник
4
хорошее резюме, которое в нескольких словах хорошо отвечает на вопрос, спасибо!
Wolfson
Согласен. Я нашел другие ответы сбивающими с толку, но этот попадает в точку.
Никола Малешевич,
Люди хотят знать разницу между portи targetPort. Вы действительно устранили путаницу.
Анкур Гаутам,
1
Я согласен, я думаю, что это «правильный» ответ, и приведенные выше ответы открывают дополнительные поля и более широкие темы, что затрудняет понимание. Ура, юлз.
Ворп,
10

Ответ, данный выше @Manikanta P, правильный. Однако при первом чтении объяснение слова «Порт» может показаться немного непонятным. Поясню на примере:

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

Чего хочет разработчик: пользователь должен иметь доступ к веб-серверу извне, но не к серверу приложений извне.

Решение. Тип службы веб-сервера в его service.yml будет NodePort, а тип службы сервера приложений в его 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.

Код для сервера приложений service.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). Когда пользователь нажимает кнопку, делается запрос. Этот запрос перенаправляется на сервер приложений, поскольку в httpd.confфайле 5050указан порт, и это порт, по которому контейнер сервера приложений и контейнер веб-сервера обмениваются данными внутри. Когда сервер приложений получает запрос, он может обслуживать запрос из-за того, что tomcat работает внутри него в порту 8080.

matak8s
источник
4
Почему спецификация веб-сервера определяет порт: 5050? Если я правильно понял, веб-сервер вызывает appserver: 5050, а не наоборот ...?
Эвертон
1
Помимо вопроса Эвертона, какой смысл в том, что Tomcat должен открывать порт 8080, если он обслуживает внутренние запросы на порте 5050?
Стивен
Этот ответ сбивает с толку. Кроме того, где находится httpd.conf«потому что в файле httpd.conf упоминается порт 5050»
Polymerase
Файл @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/ :

Определения портов в модулях имеют имена, и вы можете ссылаться на эти имена в targetPortатрибуте службы. Это работает, даже если в Сервисе есть несколько модулей, использующих одно настроенное имя, с одним и тем же сетевым протоколом, доступным через разные номера портов.

Wolfson
источник
Спасибо за лаконичный ответ
Анкур Гаутам
1

В двух словах

nodeport: Прослушивает внешний запрос на всех рабочих узлах на nodeip: port и пересылает запрос на порт.

port: Внутренний порт службы кластера для контейнера и прослушивает входящий запрос от nodeport и пересылает на targetPort.

targetPort:Получите запрос от порта и переадресуйте его в контейнерный модуль (порт), где он прослушивает. даже если вы не укажете это, по умолчанию будут назначены те же номера портов, что и для порта.

Дашрат Мундкар
источник
0

«Целевой порт» - это порт, на котором работает ваш контейнер.

Порт: порт перенаправляет трафик в контейнер от службы.

Раскрытие развертывания

  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

Наконец, запрос получен на порт службы и переадресован на targetPort модуля.

user3651946
источник