Skip to content

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

services-node_port

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 sekcji port
  • port - port na Service
  • nodePort - (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
Jedyne pole 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.