Wie mache ich Nicht-HTTP- und TCP-Dienste in Kubernetes verfügbar?

8

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, NodePortDienste 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.

LoadBalancerDienste 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.

cjheppell
quelle

Antworten:

1

Vielleicht kann dieser Workflow helfen:

(Ich gehe davon aus, dass der Cloud-Anbieter AWS ist)

  • AWS Console: Erstellen Sie eine getrennte VPC und erstellen Sie Ihre Kubernetes ec2-Instanzen (oder Autoscaling-Gruppe), um die Erstellung öffentlicher IP-Adressen zu deaktivieren. Dies macht es unmöglich, über das Internet auf die Instanz zuzugreifen. Sie können weiterhin über die private IP (z. B. 172.30.1.10) über ein Site 2 Site VPN oder über eine sekundäre ec2-Instanz in derselben VPC mit öffentlicher IP zugreifen.

  • Kubernetes: Erstellen Sie einen Dienst mit einem festen NodePort (z. B. 35432 für Postgres).

  • AWS-Konsole: Erstellen Sie einen Classic o Layer 4 Loadblancer in derselben VPC Ihrer Knoten. Öffnen Sie auf der Registerkarte Listener den Port 35432 (und andere Ports, die Sie möglicherweise benötigen), der über eine "Zielgruppe" auf einen oder alle Ihrer Knoten verweist. Die Anzahl der Ports ist kostenlos.

Derzeit weiß ich nicht, wie die Aktualisierung der aktuell lebenden Knoten in der Zielgruppe des Load Balancers automatisiert werden kann. Dies könnte möglicherweise ein Problem mit den Autoscaling-Funktionen sein, falls vorhanden ... Möglicherweise ein Cron-Job mit einem Bash-Skript Informationen von der AWS API und aktualisieren Sie die Zielgruppe?

Hugo V.
quelle
Danke - das ist hilfreich. Dies ist jedoch offensichtlich keine generische Lösung für eine Kubernetes-Umgebung und eng mit dem Cloud-Anbieter Ihrer Wahl verbunden. Vielleicht passt ein Betreiber gut zu einer Lösung, die die Details des Cloud-Anbieters Ihrer Wahl verbirgt?
Cjheppell
0

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?

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

mdaniel
quelle
Danke für deine Antwort. Ich verstehe, dass jeder Dienst seinen eigenen eindeutigen Port verfügbar macht. Mein Problem ist, dass die aktuellen Kubernetes-Diensttypen für meinen Anwendungsfall nicht geeignet erscheinen. NodePorts 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?
Cjheppell