Meine Lösung dafür war Verwenden Sie die IP als ID: Trimmen Sie die Punkte und Sie erhalten eine eindeutige ID, die auch außerhalb des Containers zu anderen Containern verfügbar ist.
mit einem Service Sie Zugriff auf die mehrere Container IPs (siehe meine Antwort hier auf, wie dies zu tun bekommen. what's the best way to let kubenetes pods communicate with each other?
so können Sie ihre IDs erhalten, wenn Sie IP-Adressen als eindeutige ID verwenden das einzige Problem ist, dass IDs nicht kontinuierlich ist oder bei 0 beginnen, aber zookeeper/kafka scheint nicht in dem Sinne
EDIT. 1:
die Follow-up betrifft die Konfiguration Zookeeper:
Jeder ZK-Knoten muss die anderen Knoten kennen. Der Kubernetes Discovery Service bekannt von Knoten, die innerhalb eines Service sind, so ist die Idee, einen Service mit den ZK Knoten zu starten.
Dieser Dienst muss gestartet werden, BEVOR der ReplicationController (RC) der Zookeeper-Pods erstellt wird.
Die Inbetriebnahme wird Skript des ZK Container dann müssen:
- Warten auf den Discovery-Dienst des ZK-Service mit seinen Knoten zu füllen (das dauert ein paar Sekunden, denn jetzt ich nur hinzufügen ein Schlaf 10 am Anfang meines Startskriptes, aber zuverlässiger sollten Sie nach dem Service suchen, um mindestens 3 Knoten darin zu haben.)
- nachschlagen die Behälter, die den Service im Entdeckungsservice bilden: wird getan, indem man abfragt die API. Die Umgebungsvariable
KUBERNETES_SERVICE_HOST
ist in jedem Container verfügbar. Der Endpunkt Service Beschreibung zu finden ist dann
URL="http(s)://$USERNAME:[email protected]${KUBERNETES_SERVICE_HOST/api/v1/namespaces/${NAMESPACE}/endpoints/${SERVICE_NAME}"
wo NAMESPACE
default
ist, wenn Sie es sich geändert, und SERVICE_NAME
würde zookeeper sein, wenn Sie Ihren Dienst zookeeper benannt.
Dort erhalten Sie die Beschreibung der Container, die den Dienst bilden, mit ihrer IP in einem "IP" -Feld. Sie tun können:
curl -s $URL | grep '\"ip\"' | awk '{print $2}' | awk -F\" '{print $2}'
die Liste der IP-Adressen im Service zu erhalten. Damit bevölkern die zoo.cfg auf dem Knoten die ID über
Sie die NUTZERNAME und PASSWORT Möglicherweise müssen definiert mit den Endpunkt auf Dienste wie Google Container Motor zu erreichen. Diese müssen in einem Geheimnis Volumen gesetzt werden (siehe doc hier: http://kubernetes.io/v1.0/docs/user-guide/secrets.html)
Sie würden auch verwenden curl -s --insecure
auf Google Container-Engine benötigen, wenn Sie die Mühe durch Hinzufügen der CA cert auf Ihre Schoten
Fügen Sie das Volumen dem Container hinzu, und suchen Sie die Werte aus der Datei. (Im Gegensatz zu dem, was der Doc sagt, setzen Sie nicht die \ n am Ende des Benutzername oder Passwort, wenn Base64-Kodierung: es nur das Leben noch komplizierter machen, wenn diejenigen, Lesen)
EDIT 2:
Eine weitere Sache, die Sie auf den Kafka-Knoten tun müssen, ist, die IP- und Hostnamen zu holen und sie in die Datei/etc/hosts zu schreiben. Kafka scheint die Knoten von Host-Namen kennen zu müssen, und diese werden in Service-Knoten standardmäßig nicht gesetzt
EDIT 3:
Nach viel Versuch und Gedanken unter Verwendung von IP als ID nicht so groß sein kann : Es hängt davon ab, wie Sie den Speicher konfigurieren. für jede Art von verteilter Dienst wie zoekeeper, kafka, mongo, hdfs, möchten Sie vielleicht den leeren Speicher-Typ verwenden, so dass es nur auf diesem Knoten (Montage eines Remote-Speicher Art von besiegt den Zweck der Verteilung dieser Dienste!) emptyDir wird mit den Daten auf demselben Knoten verbunden, daher erscheint es logischer, die NODE-ID (Knoten-IP) als ID zu verwenden, da dann ein Pod, der auf demselben Knoten neu startet, über die Daten verfügt. Das verhindert eine mögliche Beschädigung der Daten (wenn ein neuer Knoten in dasselbe Verzeichnis schreibt, das nicht wirklich leer ist, wer weiß, was passieren kann) und auch bei Kafka, wenn die Broker-ID geändert wird, wird den Brokern eine broker.id zugewiesen , zoekeeper aktualisiert das Thema broker.id nicht und das Thema sieht so aus, als sei es verfügbar, ABER zeigt auf die falsche broker.id und es ist ein Durcheinander.
Bis jetzt muss ich noch herausfinden, wie man den Node IP bekommt, aber ich denke, es ist möglich, in der API nachzuschlagen, indem man die Namen der Service-Pods und dann den Knoten nachschlägt.
EDIT 4
den Knoten IP zu erhalten, können Sie den pod Hostnamen == Namen von der API-Endpunkte erhalten /api/v1/Namespaces/default/Endpunkte/ wie oben erläutert. dann können Sie den Knoten IP aus dem Podname mit /api/v1/Namespaces/default/Hülsen/
PS erhalten: dies durch das Beispiel in der Kubernetes Repo (Beispiel für rethinkdb hier inspiriert: https://github.com/kubernetes/kubernetes/tree/master/examples/rethinkdb
prominent in meinen Recherchen
Gute Idee! Das scheint eine machbare Lösung zu sein! Ich habe es geschafft, alle meine Broker-IDs jetzt über ein Startup-Skript zu geben: BROKER_ID = $ (ip addr | awk '/ inet/&& /eth0/{sub(/\/.*$/,"" ,$2); print $ 2} '| sed -r' s /\.// g ') und: sed -r -i "s/(makler.id) = (. *)/\ 1 = $ BROKER_ID/g" $ KAFKA_HOME/config/server.properties – NegatioN
Ich habe ip = $ (hostname -i) Dann id = $ {ip //./} – MrE
Kann ich auch fragen, wie Sie die Server zu /conf/zoo.cfg hinzufügen? Ein geteiltes Volume, das mit dem Kafka-Service von Kubernetes interagiert? – NegatioN