Les Solutions jusqu'à présent n'étaient pas tout à fait satisfaisant assez pour moi, donc je vais poster une réponse de ma part. Mes objectifs:
- Les gousses doivent encore être gérée de façon dynamique par le biais d'un StatefulSet autant que possible.
- Créer un service externe par Gousse (j'.e Kafka Courtier) pour Producteur/Consommateur, les clients et d'éviter l'équilibrage de la charge.
- Créer un intérieur sans tête, de service, de sorte que chaque Courtier est en mesure de communiquer les uns avec les autres.
En commençant par Yolean/kubernetes-kafka, la seule chose qui manque est d'exposer le service à l'externe et à deux défis.
- La génération des étiquettes uniques par Courtier en pod, de sorte que nous pouvons créer un service externe pour chacun des Courtier en gousses.
- Raconter les Courtiers de communiquer les uns aux autres en utilisant le Service interne lors de la configuration de Kafka à dire les producteurs/consommateurs de communiquer sur le Service extérieur.
Par gousse d'étiquettes et de services extérieurs:
Pour générer des étiquettes par gousse, cette question a été vraiment utile. En l'utilisant comme un guide, nous avons ajouter la ligne suivante à la 10broker-config.yml init.sh
bien avec:
kubectl label pods ${HOSTNAME} kafka-set-component=${HOSTNAME}
Nous de garder les headless service, mais nous avons également générer un Service externe par gousse à l'aide de l'étiquette (j'ai ajouté à 20dns.yml):
apiVersion: v1
kind: Service
metadata:
name: broker-0
namespace: kafka
spec:
type: NodePort
ports:
- port: 9093
nodePort: 30093
selector:
kafka-set-component: kafka-0
Configurer Kafka interne/externe des auditeurs
J'ai trouvé cette question incroyablement utile en essayant de comprendre comment configurer Kafka.
Cela nécessite à nouveau la mise à jour de l' init.sh
et server.properties
propriétés dans 10broker-config.yml avec les éléments suivants:
Ajouter les éléments suivants à l' server.properties
de mettre à jour les protocoles de sécurité (actuellement à l'aide de PLAINTEXT
):
listener.security.protocol.map=INTERNAL_PLAINTEXT:PLAINTEXT,EXTERNAL_PLAINTEXT:PLAINTEXT
inter.broker.listener.name=INTERNAL_PLAINTEXT
Déterminer dynamiquement l'adresse IP externe et pour le port externe pour chaque Pod dans l' init.sh
:
EXTERNAL_LISTENER_IP=<your external addressable cluster ip>
EXTERNAL_LISTENER_PORT=$((30093 + ${HOSTNAME##*-}))
Puis configurer listeners
et advertised.listeners
IPs pour EXTERNAL_LISTENER
et INTERNAL_LISTENER
(également dans l' init.sh
de la propriété):
sed -i "s/#listeners=PLAINTEXT:\/\/:9092/listeners=INTERNAL_PLAINTEXT:\/\/0.0.0.0:9092,EXTERNAL_PLAINTEXT:\/\/0.0.0.0:9093/" /etc/kafka/server.properties
sed -i "s/#advertised.listeners=PLAINTEXT:\/\/your.host.name:9092/advertised.listeners=INTERNAL_PLAINTEXT:\/\/$HOSTNAME.broker.kafka.svc.cluster.local:9092,EXTERNAL_PLAINTEXT:\/\/$EXTERNAL_LISTENER_IP:$EXTERNAL_LISTENER_PORT/" /etc/kafka/server.properties
Évidemment, ce n'est pas une solution complète pour la production (par exemple portant sur la sécurité pour l'exposition externe des courtiers) et je suis toujours raffinage ma compréhension de la façon de les laisser aussi interne producteurs/consommateurs aussi communiquer avec le courtier.
Cependant, jusqu'à présent, c'est la meilleure approche pour ma compréhension de Kubernetes et Kafka.