Mon objectif ici est donc de mettre en place un cluster de plusieurs courtiers kafka de manière distribuée. Mais je ne vois pas comment rendre les courtiers conscients les uns des autres.
Autant que je sache, chaque courtier a besoin d'un identifiant distinct dans sa configuration, ce que je ne peux pas garantir ou configurer si je lance les conteneurs à partir de kubernetes?
Ils ont également besoin d'avoir le même advertised_host?
Y a-t-il des paramètres qui me manquent et qui auraient besoin d'être modifiés pour que les nœuds se découvrent?
Serait-il viable de faire une telle configuration à la fin du fichier Dockerfile avec un script? Et/ou un volume partagé?
J'essaie actuellement de faire cela avec Spotify/kafka-image, qui possède une combinaison préconfigurée zookeeper + kafka sur Vanilla Kubernetes.
Cela apparaît clairement dans mes recherches, mais contient des informations obsolètes. Pour mettre à jour cela avec une solution plus moderne, vous devez utiliser un déploiement StatefulSet , qui générera des pods ayant un compteur entier au lieu d'un hachage dans leur nom, par exemple. kafka-controller-0.
Il s’agit bien entendu du nom d’hôte, il est donc simple d’extraire un ID de courtier invariant à l’aide de awk:
hostname | awk -F'-' '{print $3}'
Les conteneurs les plus populaires disponibles pour Kafka ces jours-ci ont une commande ID de courtier.
Regardez https://github.com/CloudTrackInc/kubernetes-kafka Il permet de démarrer Kafka dans kubernetes et de prendre en charge sa mise à l'échelle et son auto-extension.
Je l'ai fait avec docker-compose (la différence pour Kubernetes serait que vous transmettiez l'ID via votre service.yaml et que vous disposiez de 2 services):
kafka1:
build: kafka-0.8.1/
ports:
- 9092
links:
- zookeeper
environment:
- ID=1
kafka2:
build: kafka-0.8.1/
ports:
- 9092
links:
- zookeeper
environment:
- ID=2
Config:
broker.id=${ID}
port=9092
advertised.Host.name=${Host}
advertised.port=9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/kafka/kafka-logs-${ID}
num.partitions=200
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false
zookeeper.connect=${DOCKER_ZOOKEEPER_1_PORT_2181_TCP_ADDR}:${DOCKER_ZOOKEEPER_1_PORT_2181_TCP_PORT}
zookeeper.connection.timeout.ms=6000
sh:
#!/bin/bash
echo "Running config"
export Host=`grep $HOSTNAME /etc/hosts | awk '{print $1}'`
export ID=${ID:?}
Perl -p -i -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < /broker.template > $KAFKA_HOME/config/server.properties
echo "Done"
echo "starting kafka with:"
echo "$KAFKA_HOME/config/server.properties"
echo ""
cat $KAFKA_HOME/config/server.properties
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties