Odpowiedzi:
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ć, 8080
a kontrole jej kondycji mogą działać na 8089
porcie 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:8089
ruch jest kierowany do 8080
kontenera (targetPort). Podobnie, jeśli trafisz my-service:8443
, zostanie przekierowany do 8085
kontenera (targetPort). Jest to jednak myservice:8089
wewnę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.20
moż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 .
port
i targetPort
bycia innym? Na przykład patrząc na twój health
przykład, po co robić port
8443
zamiast 8085
? Zasadniczo, dlaczego istnieją dwa parametry zamiast po prostu ujawniać wszystkie targetPort
s w usłudze?
Pomaga mi myśleć o rzeczach z perspektywy usługi .
nodePort
: Port w węźle, do którego będzie przychodził ruch zewnętrznyport
: Port tej usługitargetPort
Port docelowy w pod (-ach), do którego ma być przekazywany ruchRuch przychodzi nodePort
, jest przekazywany port
do usługi, która następnie kieruje do targetPort
kapsuły (-ów).
Warto podkreślić bardziej, że dotyczy nodePort
to ruchu zewnętrznego. Inne zasobniki w klastrze, które mogą potrzebować dostępu do usługi, będą po prostu używać port
, nodePort
a nie tylko wewnętrznego dostępu do usługi.
Warto również zauważyć, że jeśli targetPort
nie jest ustawiony, domyślnie będzie miał taką samą wartość jak port
. Np. 80:80
Dla portu serwisowego 80
kierującego port kontenerowy 80
.
port
i targetPort
. Naprawdę usunąłeś zamieszanie.
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 80
protokół 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.conf
pliku 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:30475
i 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.conf
pliku 5050
jest 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
.
httpd.conf
„ponieważ w pliku httpd.conf wspomniany jest port 5050”
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
targetPort
atrybucie 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.
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.
„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.
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 .