NodePort
Ein NodePort-Service erweitert einen ClusterIP-Service, indem er zusätzlich einen festen Port auf allen Node-IP-Adressen öffnet. Kubernetes reserviert einen Port aus einem vordefinierten Bereich (standardmäßig 30000–32767) und richtet auf jedem Worker-Node eine Regel ein, die Traffic an diesen Port auf die Service-Endpoints weiterleitet. Man kann den NodePort auch manuell vorgeben (sofern im erlaubten Bereich).
NodePort-Services sind aus dem Cluster heraus erreichbar, indem man die IP eines Cluster-Nodes und den NodePort ansteuert. Dies erlaubt einfache Tests oder den Aufbau eigener Load-Balancing-Lösungen. Allerdings sind NodePorts oft durch Firewalls eingeschränkt, und die Port-Range ist hoch (unpraktisch für standard Ports 80/443). Zudem wird jeder Node exponiert, was in Cloud-Umgebungen mit virtuellen IPs beachtet werden muss.
YAML-Beispiel für einen NodePort-Service mit festgelegtem Port:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort # Expose via NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
- name: web
protocol: TCP
port: 80 # ClusterIP service port
targetPort: 80 # Container port
nodePort: 30007 # Static NodePort (optional)
Erläuterung: Dieser Service wird auf jedem Node-IP auf Port 30007 erreichbar sein. Intern erhält er trotzdem eine ClusterIP, d.h. Pods im Cluster können weiterhin my-nodeport-service
auf Port 80 nutzen, während externe Clients <NodeIP>:30007
verwenden. Wenn man keinen nodePort
angibt, weist Kubernetes automatisch einen freien Port zu. NodePort eignet sich, wenn kein Cloud-LoadBalancer verfügbar ist oder um einen Service schnell zugänglich zu machen (z.B. in einem Bare-Metal-Testcluster). Für den produktiven Einsatz im Internet sind NodePorts wegen der statischen Ports und fehlenden Layer-7-Routing meist nachteilig.