Wie setzen Sie eine headless service für eine StatefulSet extern in Kubernetes
Mit kubernetes-kafka als Ausgangspunkt mit minikube.
Dieser verwendet eine StatefulSet und ein headless service für service-discovery innerhalb des Clusters.
Das Ziel ist, setzen die individuellen Kafka-Broker extern, welche intern angesprochen:
kafka-0.broker.kafka.svc.cluster.local:9092
kafka-1.broker.kafka.svc.cluster.local:9092
kafka-2.broker.kafka.svc.cluster.local:9092
Die Einschränkung ist, dass diese externen Dienstleister werden in der Lage, dem Broker speziell.
Was ist die richtige (oder eine mögliche) Weg zu gehen über diese? Ist es möglich, dass ein externer service pro kafka-x.broker.kafka.svc.cluster.local:9092
?
- Hi, meinst du diese Lösung umgesetzt werden kann, besser mit nginx zwischen der Erfüllung der gleichen Anforderungen, die Sie besonders suchen. Haben Sie versucht, mit nginx? Und können Sie bitte lassen Sie mich wissen, Ihre Meinung zu dieser?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wir haben das Problem gelöst in 1.7 durch ändern der headless-service
Type=NodePort
und Einstellung derexternalTrafficPolicy=Local
. Dies umgeht die interne Lastenausgleich von Service-und Verkehr bestimmt sind, zu einem bestimmten Knoten auf Knoten port funktioniert nur, wenn ein Kafka-pod ist auf diesem Knoten.Wir haben zum Beispiel zwei Knoten nodeA und nodeB nodeB mit einer kafka-pod. nodeA:30000 wird nicht verbinden sondern nodeB:30000 wird eine Verbindung zu den kafka-pod läuft auf nodeB.
https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typenodeport
Hinweis: dies war auch in 1.5 und 1.6 als beta-annotation, mehr kann hier gefunden werden on-Funktion Verfügbarkeit: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
Beachten Sie, dass diese Bindungen eine kafka-pod zu einem bestimmten externen Netzwerk Identität, es gibt keine Garantie, dass Ihr Speicher-Volumen wird gebunden werden, die Netzwerk-Identität. Wenn Sie die VolumeClaimTemplates in einem StatefulSet dann Ihre Bände sind gebunden an die pod während der kafka erwartet, dass die Volumen gebunden werden, um die Netzwerk-Identität.
Wenn zum Beispiel die kafka-0-pod neu gestartet und kafka-0 kommt auf nodeC statt nodeA, kafka-0 pvc (bei Einsatz von VolumeClaimTemplates) hat Daten, dass es für nodeA und der broker läuft auf kafka-0 startet Anforderungen abgelehnt zu denken, dass es nodeA nicht nodeC.
Um dies zu beheben, wir freuen uns auf Lokale Persistente Mengen, aber jetzt haben wir eine einzelne PVC für unsere kafka StatefulSet und die Daten werden gespeichert unter
$NODENAME
auf, dass PVC Band-volume-Daten zu einem bestimmten Knoten.https://github.com/kubernetes/features/issues/121
https://kubernetes.io/docs/concepts/storage/volumes/#local
app: broker
zuapp: kafka
. erstellt eine Firewallregel auf GKE und ich bekommefailed: Operation timed out
. irgendeine Idee?Lösungen bisher nicht ganz befriedigend genug für mich, so dass ich werde post eine Antwort auf meine eigenen. Meine Ziele:
Beginnend mit Yolean/kubernetes-kafka, das einzige was fehlt ist die Offenlegung der service extern und zwei Herausforderungen zu tun.
Pro pod Etiketten und externe Dienstleistungen:
Zum erstellen von Etiketten pro pod, dieses Problem war wirklich hilfreich. Verwenden Sie es als Leitfaden, fügen wir die folgende Zeile der 10broker-config.yml
init.sh
Eigenschaft mit:Wir halten die bestehenden headless-service, aber wir erzeugen auch einen externen Service-pro-pod mit dem label (ich Hinzugefügt 20dns.yml):
Konfigurieren Kafka mit internen/externen Hörer
Fand ich dieses Problem unglaublich nützlich bei dem Versuch, zu verstehen, wie zu konfigurieren Kafka.
Dies wieder erfordert die Aktualisierung der
init.sh
undserver.properties
Eigenschaften in 10broker-config.yml mit den folgenden:Fügen Sie den folgenden, um die
server.properties
zum aktualisieren der security-Protokolle (derzeit mitPLAINTEXT
):Dynamisch zu ermitteln, die externe IP und den externen port für jeden Pod in die
init.sh
:Dann konfigurieren
listeners
undadvertised.listeners
IPs fürEXTERNAL_LISTENER
undINTERNAL_LISTENER
(auch in derinit.sh
Eigenschaft):Offensichtlich ist dies nicht eine vollständige Lösung für die Produktion (z.B. Adressierung der Sicherheit für die nach außen exponierten Broker) und ich bin immer noch verfeinern mein Verständnis, wie man auch damit interne Erzeuger/Verbraucher, auch die Kommunikation mit dem Broker.
Aber bisher ist dies der beste Ansatz für mein Verständnis von Kubernetes und Kafka.
initContainer
das schreibt die externe ip auf den lokalen Speicher und die kafka-container dann liest, dass. github.com/kow3ns/kubernetes-kafka/issues/3Möchte ich sagen, dass ich gelesen hatte, das Frage-und Antwort-3 mal, bevor Sie versuchen, wickeln Sie meinen Kopf herum, was Kopflosen Dienstleistungen/waren, was der Punkt von Ihnen war. (und ich nie ganz verstanden Headless Dienstleistungen, oder was dieser Q&A war.)
Und auf dem 4. Lesen (Wiederaufgreifen es nach einer weiteren Ausbildung ich) es endlich geklickt/habe ich endlich verstanden.
So dass der Zweck dieser Antwort ist zu formulieren Nadir ' s Frage/problem/und beantworten, als wenn es erklärend, eine Klasse-schooler. So, dass andere, die stolpern, diese erhalten die Bedeutung von Nadir ist genial-Lösung auf der ersten Lesen.
Nützliche Vorkenntnisse:
Gibt es einen Service-Typ: ExternalName.
ExternalName
Service einfach Punkte, die eine DNS-Adresse.
Es gibt 2 Geschmacksrichtungen
ExternalName Service:
Ein guter Anwendungsfall wäre, so dass ein Test-cluster und produktionscluster zu teilen, so viel code wie
möglich. (und für einfache conviencence in einigen Fällen) Hülsen in beide
das testen und die Produktion würde auf das gleiche service Innere Cluster-DNS-Adresse
Namen, das wäre das vorhersehbar reuseable code. Der Unterschied
wäre, dass der Test Umwelt haben würde, ein Dienst, der
Punkte, um eine SQL-Dienst, der sich innerhalb der cluster. Die
Produktions-cluster verwenden würde eine ExternalName Service, die würde
redirect/zeigen Sie auf die DNS-Adresse von einem Cloud-Anbieter Verwalteten SQL
Lösung.
Dies ist die version eines ExternalName Service, ist der Schlüssel zur Lösung.
Einer Stateful-Set hat 3 Teile, um seine Identität:
Gibt es 3 wichtige Dinge zu erinnern, über Kube-Proxy:
wichtig ist die Auflage, dass die Statusbehaftete Dienste sein sollte
extern ausgesetzt, NodePorts sind eigentlich immer beteiligt werden, wenn
es kommt zu extern bereitstellen von Diensten.
Gibt es 4 wichtige Dinge zu erinnern, über einen Headless-Service:
ist sehr wünschenswert für stateful workloads)
Node-Ports zu Diensten.) Ich werde paraphrasieren, dies ein paar mal, so dass die
problem versinkt in: NodePorts können in der Regel nicht Verkehr weiter zu Kopflos
Services. Externen Datenverkehr Eingabe der cluster kann in der Regel nicht sein
weitergeleitet Headless Dienstleistungen. Es ist nicht intuitiv, wie extern
setzen Sie eine Headless Service.
Jetzt, dass wir das problem verstehen besser, lets go zurück zu der Frage: Wie kann ein Headless Service (Punkte, die zu einem einzelnen Mitglied einer stateful-set) extern ausgesetzt?
Lösung Teil 1:
Alle pod im cluster sprechen können, um die Mitglieder der statefulset.
Weil die stateful erzeugen eine kopflose service, mit einem vorhersehbaren innere cluster-DNS-Adresse in der form:
statefulsetname-#.associatedheadlessservice.namespace.svc.cluster.Ort:port
kafka-0.der broker.kafka.svc.cluster.Ort:9092
kafka-1.der broker.kafka.svc.cluster.Ort:9092
kafka-2.der broker.kafka.svc.cluster.Ort:9092
broker.kafka.svc.cluster.Ort:9092, kann auch verwendet werden, zu finden, um die immer einer verfügbar ist.
Lösung Teil 2:
Sie ermöglichen den externen Datenverkehr zu sprechen, um die Mitglieder der stateful gesetzt, durch die Einführung einer 2. service akzeptieren kann, der externe Verkehr, und dann umleiten von traffic von diesem service zu den Kopflosen service, kann nur akzeptieren, internet-Verkehr.
Für jeden pod in die Stateful-ein Service des Typ ExternalName mit einem Virtuellen Statischen ClusterIP-Adresse verwaltet von Kube-Proxy erstellt wird. Jeder dieser ExternalName Leistungen Punkte/leitet Datenverkehr auf eine vorhersehbare statische innere cluster DNS-Adresse identifiziert, die in Lösung 1, und weil diese ExternalName service hat eine Virtuelle Statische ClusterIP verwaltet über Kube-Proxy, es kann eine Zuordnung von NodePorts zu.
Den Dienst ändern, von einem Kopflosen ClusterIP in eine NodePort würde vorwärts-Anfrage an eine der Knoten auf einem port (30092 in meinem Beispiel) auf port 9042 auf die Kafkas. Sie schlagen würde, einer der Hülsen, die auf zufällige, aber ich denke, das ist in Ordnung.
20dns.yml wird (so ähnlich):
Disclaimer: möglicherweise benötigen Sie bei zwei Diensten. Ein headless für die internen dns-Namen und einen NodePort für den externen Zugriff. Ich habe nicht versucht, dies ist mein selbst.
Aus der kubernetes kafka-Dokumentation: