Ich führe einen Kubernetes-Cluster in einer öffentlichen Cloud (Azure / AWS / Google Cloud) aus und habe einige Nicht-HTTP-Dienste, die ich für Benutzer verfügbar machen möchte.
Bei HTTP-Diensten verwende ich normalerweise eine Ingress-Ressource, um diesen Dienst über einen adressierbaren DNS-Eintrag öffentlich zugänglich zu machen.
Wie sollte ich TCP-basierte Dienste (z. B. eine Datenbank wie PostgreSQL) für Nicht-HTTP-Dienste für den öffentlichen Gebrauch verfügbar machen?
Ich habe überlegt, NodePort
Dienste zu verwenden, aber dies erfordert, dass die Knoten selbst öffentlich zugänglich sind (abhängig davon kube-proxy
, ob sie zum entsprechenden Knoten weitergeleitet werden). Ich würde es vorziehen, wenn möglich zu vermeiden.
LoadBalancer
Dienste scheinen eine weitere Option zu sein, obwohl ich nicht für jeden TCP-Dienst, den ich verfügbar machen möchte, einen dedizierten Cloud-Load-Balancer erstellen möchte.
Ich bin mir bewusst, dass der NGINX Ingress-Controller das Offenlegen von TCP- und UDP-Diensten unterstützt , aber dies scheint eine statische Definition der Dienste zu erfordern, die Sie verfügbar machen möchten. Für meinen Anwendungsfall werden diese Dienste dynamisch erstellt und zerstört, sodass es nicht möglich ist, diese Dienstzuordnungen im Voraus statisch zu definieren ConfigMap
.
quelle
Nun, das hängt davon ab , wie Sie die ultimative Benutzer erwarten zu adressieren diese Dienste? Wie Sie bereits betont haben, ist es mit einem Ingress möglich, mithilfe des virtuellen Hostings alle Anforderungen an denselben Ingress-Controller weiterzuleiten und dann den
Host:
Header zum Versenden innerhalb des Clusters zu verwenden.Bei einem TCP-Dienst wie PostgreSQL gibt es keinen solchen Header. Sie müssten also entweder über einen IP-basierten Mechanismus verfügen oder jedem einen dedizierten Port für Ihre mit dem Internet verbundene IP zuweisen
Wenn Ihre Clients IPv6-fähig sind, ist es angesichts des absolut massiven IP-Speicherplatzes, den IPv6 bietet, absolut sinnvoll, jedem Dienst eine dedizierte IP-Adresse zuzuweisen. Ansonsten müssen Sie zwei Knöpfe drehen: die IP und den Port.
Wie Sie diese Verbindungen in Ihrem Cluster an den richtigen Dienst weiterleiten, hängt davon ab, wie Sie das erste Problem gelöst haben
quelle
NodePort
s erfordern das öffentliche Öffnen der Ports auf Knoten, was aus Sicherheitsgründen nicht ideal ist. LoadBalancer pro Service ist teuer. Angenommen, ich kann korrekt zum Host weiterleiten. Welchen Kubernetes-Dienst sollte ich verwenden, um diese öffentlich verbindbar zu machen, insbesondere wenn diese dynamisch hoch- und runtergefahren werden?