Działanie NodePort¶
Najprostszy rodzaj Service - możliwość dostania się na konkretny port Node'a na którym znajduje się Pod. Mapowanie portu Port Node'a:Port Pod'a.
Przy tworzeniu NodePort określamy jaki port zostanie użyty do wystawienia aplikacji z klastra.
Możliwy zakres portów do wystawienia to: 30000 - 32767.
Pod z którego ma być udostępniany ruch definiowany jest z użyciem labels, w sekcji selector manifestu.
Jeżeli klaster składa się z wielu węzłów, zasób zostanie wystawiony na wszystkich węzłach, na tym samym porcie.
Mechanizm udostępniania aplikacji¶
Rodzaje portów biorących udział w udostępnianym komponencie: 1. Target Port - port na danym Podzie 2. Port - port wystawiany przez Service, to on łączy się z portem Pod'a 3. NodePort - port widoczny z zewnątrz klastra, jest on wystawiany już na poziomie Node'a

Nodeport w manifescie¶
Definicja zmiennych¶
service-definition.yaml:
apiVersion: v1
kind: Service
metadata:
name: <service_name>
spec:
type: NodePort
ports:
- targetPort: <port_on_pods> # (1) (optional)
port: <port_on_service> # (2) (!mandatory)
nodePort: <port_on_node> # (3) (optional)
selector:
<label_key>:<label_value>
targetPort- (optional) port na Podzie (lub Pod'ach), jeśli nie zostanie podany - brany ten sam port co w sekcjiportport- port na ServicenodePort- (optional) wystawiany port na Nodzie, jeśli nie jest jawnie podany - wybierany losowo z zakresu 30000 - 32767
Przykładowa definicja Node Port¶
Plik yaml¶
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
ports:
- targetPort: 80 # port docelowy, w Podzie (1)
port: 80 # port w serwisie (2) - obowiazkowy
nodePort: 30008 # port w nodzie Kubernetes (3)
selector: # sprawdzamy na labelki wybrane w Podzie
app: myapp
type: front-end
port jest obowiązkowe. Jeżeli nie podamy targetPort wówczas: targetPort=port. nodePort zostanie po prostu wybrane kolejne wolne na nodzie.
Aby wiedzieć jaki Pod ma być udostępniony używamy spec.selector i podajemy te same Labele, co w Podzie są przypisane.
Output po wdrożeniu¶
╭─rycu@minikube [SSH:10.0.2.15] ~
╰─$ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d19h
myapp-service NodePort 10.106.213.174 <none> 80:30008/TCP 5s
gdzie:
- 30008 - port Node'a
- 80 - port aplikacji wewnątrz Poda
Gdy mamy wiele Podów z takimi samymi selektorami i tymi samymi wystawionymi portami wówczas ruch będzie balansowany po wszystkich Podach.