Kafka auf Kubernetes multi-node
Also mein Ziel hier ist ein cluster von mehreren kafka-Broker in einem Mode verteilt. Aber ich kann nicht sehen den Weg, um den Broker zu wissen, jeder anderen.
Soweit ich das verstanden habe, jeder broker muss mit einer eigenen ID in Ihre config, das kann ich nicht garantieren, oder zu konfigurieren, wenn ich starten Sie den Behälter von kubernetes?
Werden Sie auch brauchen, um die gleiche advertised_host?
Gibt es irgendwelche Parameter, die ich bin fehlt, was müsste geändert werden für die Knoten gegenseitig zu entdecken?
Wäre es sinnvoll einen solchen Konfiguration am Ende der Dockerfile mit einem Skript? Und/oder ein gemeinsames Volumen?
Ich bin versucht derzeit, dies zu tun mit der spotify/kafka-Bild, das hat eine vorkonfigurierte Tierpfleger+kafka Kombination, auf Vanille Kubernetes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Lösung für dieses wurde zu verwenden Sie die IP-Adresse als ID: schneiden Sie die Punkte und Sie erhalten eine eindeutige ID, die auch außerhalb der container in andere Container.
Mit Service können Sie den Zugriff auf die mehrere Container s-IPs (siehe meine Antwort hier auf, wie dies zu tun:
was ist der beste Weg zu lassen kubenetes pods untereinander kommunizieren?
so können Sie Ihre IDs, wenn Sie einen nutzen IPs als eindeutige ID.
Das einzige Problem ist, dass die IDs sind nicht fortlaufend oder bei 0 beginnen, aber Tierpfleger /kafka scheinen nicht in den Sinn.
EDIT 1:
Den follow-up betrifft konfigurieren Tierpfleger:
Jeder ZK-Knoten kennen muss, der die anderen Knoten. Die Kubernetes-discovery-Dienst knowns von Knoten, die innerhalb einer Service so ist die Idee, starten Sie eine Service mit dem ZK-Knoten.
Dieser Dienst muss gestartet werden, BEVOR die Erstellung der ReplicationController (RC) der Tierpfleger Hülsen.
Start-up-Skript von der ZK-container müssen dann:
dies geschieht durch die Abfrage der API.
die
KUBERNETES_SERVICE_HOST
Umgebungsvariable ist in jedem container.Den Endpunkt zu finden, die service-Beschreibung ist dann
URL="http(s)://$USERNAME:$PASSWORD@${KUBERNETES_SERVICE_HOST/api/v1/namespaces/${NAMESPACE}/endpoints/${SERVICE_NAME}"
wo
NAMESPACE
istdefault
es sei denn, Sie ändern es, undSERVICE_NAME
wäre Tierpfleger wenn Sie Ihren Namen service Tierpfleger.dort bekommen Sie die Beschreibung der Behälter-formung der Service, mit dem Ihre ip in eine "ip" - Feld.
Sie tun kann:
um die Liste der IP-Adressen in den Dienst.
Mit, dass, bevölkern den zoo.cfg auf den Knoten mit der ID oben definiert
Müssen Sie möglicherweise die BENUTZERNAME und PASSWORT erreichen Sie den Endpunkt auf Dienste wie google container Motor. Diese müssen in einem Geheimnis Volumen (siehe doc hier: http://kubernetes.io/v1.0/docs/user-guide/secrets.html )
Würden Sie auch verwenden müssen
curl -s --insecure
auf Google Container Engine, es sei denn, Sie gehen durch die Mühe der Zugabe der CA-cert, um Ihre HülsenIm Grunde fügen Sie die Lautstärke auf den container, und suchen Sie die Werte aus der Datei. (im Gegensatz zu dem, was der doc sagt, NICHT das \n am Ende von Benutzername oder Passwort als base64-Codierung: es ist einfach machen dein Leben kompliziert, wenn Sie mit der Lektüre dieser)
EDIT 2:
Andere Sache, die Sie tun müssen, auf die Kafka-Knoten ist die IP und den Hostnamen, und setzen Sie Sie in die Datei /etc/hosts.
Kafka scheint zu müssen, um zu wissen, die Knoten-Hostnamen ein, und diese werden nicht gesetzt, innerhalb der service-Knoten standardmäßig
EDIT 3:
Nach viel Versuch und Gedanken, die die Verwendung von IP als eine ID darf nicht so groß sein: es hängt davon ab, wie Sie konfigurieren die Lagerung.
für jegliche Art von verteilten service-wie Tierpfleger, kafka, mongo, hdfs, möchten Sie vielleicht die Verwendung der emptyDir Art der Lagerung, so ist es nur auf diesem Knoten (Montage eines remote storage Art von Niederlagen den Zweck der Verteilung dieser Dienste!)
emptyDir reload wird mit den Daten auf dem gleichen Knoten, so scheint es logischer, mit der KNOTEN-ID (Knoten-IP) wie die ID, weil dann eine Hülse, neu gestartet, auf dem gleichen Knoten wird die Daten auch haben.
Sie vermeiden mögliche Beschädigung von Daten (falls der neue Knoten beginnt, schreiben in der gleichen dir, dass ist nicht wirklich leer, wer weiß, was passieren kann) - und auch bei Kafka, der die Themen vergeben werden, die ein broker.id, wenn der broker-id ändert, Tierpfleger, aktualisiert nicht das Thema broker.id und dem Thema aussieht, ist es verfügbar, ABER die Punkte an den falschen broker.id und es ist eine Schweinerei.
Bisher habe ich noch nicht gefunden, wie man den Knoten IP zwar nicht, aber ich denke, es ist möglich zu nachschlagen in der API durch einen Blick in die service-Hülsen-Namen und dann auf den Knoten, der Sie bereitgestellt werden.
BEARBEITEN 4
Um die IP-Knoten, können Sie den pod hostname == Namen aus der API-Endpunkte
/api/v1/namespaces/default/Endpunkte/
wie oben erläutert.
dann können Sie die Knoten-IP aus dem pod Namen mit
/api/v1/namespaces/default/pods/
PS: dies ist inspiriert durch das Beispiel in den Kubernetes-repo (Beispiel für rethinkdb hier: https://github.com/kubernetes/kubernetes/tree/master/examples/rethinkdb
Anschauen
https://github.com/CloudTrackInc/kubernetes-kafka
Es ermöglicht das starten Kafka in kubernetes-und support-Skalierung und die automatische extanding.
Dies zeigt sich prominent in meinen Recherchen enthält aber ziemlich veraltete Informationen. So aktualisieren Sie diese mit einer moderneren Lösung, die Sie verwenden sollten ein StatefulSet Einsatz, generiert Hülsen, die einen integer-Zähler anstelle eines hash in Ihrem Namen, wie zB. kafka-controller-0.
Dies ist natürlich der hostname, also von daher ist es einfach, zu extrahieren, eine Feste, unveränderliche Makler-ID mit awk:
Den beliebtesten Container für Kafka in diesen Tagen eine broker-ID-Befehl.
Ich Tat dies mit docker-Komponieren (Die Differenz für Kubernetes wäre, dass Sie würde übergeben Sie die ID über Ihren service.yaml und habe 2 Dienste):
Config:
sh: