Różnica między targetPort i port w definicji usługi Kubernetes

132

Kubernetes Servicemoże mieć targetPorti portw definicji usługi:

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

Jaka jest różnica między porti targetPort?

Jakub
źródło
Możesz
polecić

Odpowiedzi:

83

Usługa: kieruje ruch do poda.

TargetPort: jest to rzeczywisty port, na którym aplikacja działa w kontenerze.

Port: czasami aplikacja w kontenerze obsługuje różne usługi na innym porcie.

Przykład: Rzeczywista aplikacja może działać, 8080a kontrole jej kondycji mogą działać na 8089porcie kontenera. Więc jeśli trafisz na usługę bez portu, nie wie, do którego portu kontenera ma przekierować żądanie. Usługa musi mieć mapowanie, aby mogła trafić do określonego portu kontenera.

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 

jeśli trafisz, my-service:8089ruch jest kierowany do 8080kontenera (targetPort). Podobnie, jeśli trafisz my-service:8443, zostanie przekierowany do 8085kontenera (targetPort). Jest to jednak myservice:8089wewnętrzne dla klastra kubernetes i może być używane, gdy jedna aplikacja chce komunikować się z inną aplikacją. Aby więc trafić do usługi spoza klastra, ktoś musi ujawnić port na maszynie hosta, na którym działa kubernetes, aby ruch był przekierowywany do portu kontenera. To jest node port(port widoczny na komputerze głównym). Z powyższego przykładu możesz trafić na usługę spoza klastra (Postman lub dowolny klient reszta) przezhost_ip:nodePort

Powiedzieć urządzenie IP hosta to 10.10.20.20można trafić http metryki, służby zdrowia przez 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

Zmiany: Zredagowane zgodnie z komentarzem Raedwalda .

Manikanta P
źródło
4
Jaka jest zaleta pozwalania porti targetPortbycia innym? Na przykład patrząc na twój healthprzykład, po co robić port 8443zamiast 8085? Zasadniczo, dlaczego istnieją dwa parametry zamiast po prostu ujawniać wszystkie targetPorts w usłudze?
Dan
Cześć Dan, możesz użyć 8443 jako portu i portu docelowego dla zdrowia. użyłem różnych liczb dla lepszego wyjaśnienia.
Manikanta P
Dzięki za odpowiedzi. Chodziło mi o to, w jakich sytuacjach warto byłoby je zmienić?
Dan
„bieganie po kontenerze” oznacza? Port używany przez serwer wewnątrz kontenera? Albo port używany przez klientów spoza kontenera?
Raedwald,
Czy w usługach w chmurze możemy założyć stały adres IP dla maszyny hosta, na przykład 10.10.20.20? e, g, Azure AKS z sytuacją wdrażania wielu węzłów?
Jaish Mathews
17

Pomaga mi myśleć o rzeczach z perspektywy usługi .

  • nodePort: Port w węźle, do którego będzie przychodził ruch zewnętrzny
  • port: Port tej usługi
  • targetPort Port docelowy w pod (-ach), do którego ma być przekazywany ruch

Ruch przychodzi nodePort, jest przekazywany portdo usługi, która następnie kieruje do targetPortkapsuły (-ów).

Warto podkreślić bardziej, że dotyczy nodePortto ruchu zewnętrznego. Inne zasobniki w klastrze, które mogą potrzebować dostępu do usługi, będą po prostu używać port, nodePorta nie tylko wewnętrznego dostępu do usługi.

Warto również zauważyć, że jeśli targetPortnie jest ustawiony, domyślnie będzie miał taką samą wartość jak port. Np. 80:80Dla portu serwisowego 80kierującego port kontenerowy 80.

julz256
źródło
4
dobre podsumowanie, że w kilku słowach dobrze odpowiada na pytanie, dzięki!
Wolfson
Zgodzić się. Inne odpowiedzi wydawały mi się zagmatwane, ale ta trafia w sedno.
Nikola Malešević
Ludzie chcą poznać różnicę między porti targetPort. Naprawdę usunąłeś zamieszanie.
Ankur Gautam
1
Zgadzam się, myślę, że to jest odpowiedź „”, a powyższe odpowiedzi otwierają dodatkowe pola i szersze tematy, przez co trudniej je zrozumieć. Pozdrawiam, julz.
Worp
10

Odpowiedź udzielona powyżej przez @Manikanta P. jest prawidłowa. Jednak wyjaśnienie terminu „port” może być nieco niejasne przy pierwszym czytaniu. Wyjaśnię na przykładzie:

Rozważ aplikację internetową z jej statyczną zawartością (strona główna, obrazy itp.) Hostowaną przez httpd i dynamiczną zawartością (np. Odpowiedź na żądania itp.) Hostowaną przez tomcat. Serwer sieci Web (lub zawartość statyczna) jest obsługiwany przez 80protokół httpd na porcie, podczas gdy serwer aplikacji (lub zawartość dynamiczna) jest obsługiwany przez tomcat na porcie 8080.

Czego chce programista: Użytkownik powinien mieć dostęp do serwera internetowego z zewnątrz, ALE nie do serwera aplikacji z zewnątrz.

Rozwiązanie: Typ usługi serwera sieci Web w jego service.yml to NodePort, a typ usługi Appserver w jego service.yml to ClusterIP.

Kod dla service.yml serwera WWW:

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.

Kod dla service.yml serwera Appserver

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.

Należy również zauważyć, że w httpd.confpliku serwera WWW zapiszemy adres IP, który przekierowuje żądanie użytkownika do serwera aplikacji. Ten IP będzie: host_IP:5050.

Co dokładnie się tutaj dzieje? Użytkownik pisze hostIP:30475i widzi stronę serwera WWW. Dzieje się tak, ponieważ jest obsługiwany przez httpd na porcie 80( port docelowy). Gdy użytkownik klika przycisk, wysyłane jest żądanie. To żądanie jest przekierowywane do serwera aplikacji, ponieważ w httpd.confpliku 5050jest wymieniony port i jest to port, na którym kontener serwera Appserver i kontener serwera WWW komunikują się wewnętrznie. Gdy appserver otrzyma żądanie, może je obsłużyć, ponieważ w porcie działa w nim Tomcat 8080.

matak8s
źródło
4
Dlaczego specyfikacja serwera WWW definiuje „port: 5050”? Jeśli dobrze zrozumiałem, serwer WWW wywołuje appserver: 5050, a nie odwrotnie ...?
Everton
1
Oprócz pytania Evertona, po co Tomcat musi otworzyć port 8080, jeśli obsługuje wewnętrzne żądania na porcie 5050?
Stephen
Ta odpowiedź jest myląca. Dodatkowo gdzie jest httpd.conf„ponieważ w pliku httpd.conf wspomniany jest port 5050”
Polymerase
Plik @Polymerase httpd.conf jest dostarczany z pakietem httpd instalowanym w systemie. Jest to plik wewnętrzny, który musisz skonfigurować. Ścieżka: /etc/httpd/conf/http.conf
matak8s
@Krok w tomcat / conf / server.xml określamy port, na którym będzie działać usługa tomcat. Jest to ten sam numer portu, który zapisujemy jako port docelowy, aby kubernetes wiedział, że musi uruchomić usługę tomcat na tym porcie. Popraw mnie, jeśli się mylę.
matak8s
1

Ta odpowiedź ma na celu odwołanie się do dokumentacji Kubernetes oprócz innych odpowiedzi:

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

targetPort: to port, na którym kontener przyjmuje ruch,

port: jest wyodrębnionym portem usługi, którym może być dowolny port używany przez inne moduły do ​​uzyskiwania dostępu do usługi

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

Definicje portów w podach mają nazwy i możesz odwoływać się do tych nazw w targetPortatrybucie usługi. Działa to nawet wtedy, gdy w Usłudze znajduje się mieszanka Podów przy użyciu jednej skonfigurowanej nazwy, z tym samym protokołem sieciowym dostępnym za pośrednictwem różnych numerów portów.

Wolfson
źródło
Dzięki za zwięzłą odpowiedź
Ankur Gautam
1

W pigułce

nodeport: Nasłuchuje żądania zewnętrznego na wszystkich węzłach roboczych w nodeip: port i przekazuje żądanie do portu.

port: Wewnętrzny port usługi klastra dla kontenera i nasłuchuje przychodzących żądań z nodeport i przekazuje do targetPort.

targetPort:Odbierz żądanie z portu i przekaż je do kontenera (portu), gdzie nasłuchuje. nawet jeśli nie określisz tego, domyślnie otrzyma te same numery portów, co port.

Dashrath Mundkar
źródło
0

„Port docelowy” to port, na którym działa kontener.

Port: port przekierowuje ruch do kontenera z usługi.

Ujawnianie wdrożenia

  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: to port, który umożliwia usłudze dostęp do zewnętrznego.

Mam nadzieję, że to odpowiada.

manoj
źródło
0

jeśli kontener nasłuchuje na porcie 9376 , wówczas targetPort : 9376

jeśli usługa nasłuchuje na porcie 80, to port : 80

Następnie konfiguracja portów usług wygląda jak poniżej

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

Na koniec żądanie odebrane do portu usługi i przekazane do portu docelowego poda .

user3651946
źródło