KAFKA_ADVERTISED_Host_NAME
ou KAFKA_ADVERTISED_LISTENERS
in Kafka RC YML qui définit finalement ADVERTISED_Host_NAME
/ADVERTISED_LISTENERS
propriétés dans server.properties
soit n'aide pas à accéder à kafka depuis l'extérieur du cluster kubernetes.Veuillez suggérer comment puis-je publier/consommer en dehors du cluster kubernetes. Merci beaucoup!
J'ai eu le même problème avec l'accès à kafka depuis l'extérieur du cluster k8s sur AWS. J'ai réussi à résoudre ce problème en utilisant kafka fonction d'écoute qui, à partir de la version 0.10. 2 prend en charge plusieurs interfaces.
voici comment j'ai configuré le conteneur kafka.
ports:
- containerPort: 9092
- containerPort: 9093
env:
- name: KAFKA_ZOOKEEPER_CONNECT
value: "zookeeper:2181"
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
value: "INTERNAL_PLAINTEXT:PLAINTEXT,EXTERNAL_PLAINTEXT:PLAINTEXT"
- name: KAFKA_ADVERTISED_LISTENERS
value: "INTERNAL_PLAINTEXT://kafka-internal-service:9092,EXTERNAL_PLAINTEXT://123.us-east-2.elb.amazonaws.com:9093"
- name: KAFKA_LISTENERS
value: "INTERNAL_PLAINTEXT://0.0.0.0:9092,EXTERNAL_PLAINTEXT://0.0.0.0:9093"
- name: KAFKA_INTER_BROKER_LISTENER_NAME
value: "INTERNAL_PLAINTEXT"
En dehors de cela, j'ai configuré deux services. Un pour la communication interne (sans tête) et un pour la communication externe (LoadBalancer).
Espérons que cela fera gagner du temps aux gens.
J'ai pu résoudre mon problème en effectuant les modifications suivantes -
Utilisation de NodeSelector en YML pour faire fonctionner le module kafka sur un nœud particulier du cluster kube.
Ensemble KAFKA_ADVERTISED_Host_NAME
à Kube hostName où ce Kafka POD a été configuré pour s'exécuter (comme configuré à l'étape 1)
Exposez Kafka Service utilisant NodePort et définissez le port POD comme celui du NodePort exposé comme indiqué ci-dessous -
spec:
ports:
- name: broker-2
port: **30031**
targetPort: 9092
nodePort: **30031**
protocol: TCP
selector:
app: kafka-2
broker_id: "2"
type: NodePort
Maintenant, vous pouvez accéder aux courtiers Kafka de l'extérieur du cluster kube en utilisant Host: exposePort
J'ai résolu ce problème en utilisant Kafka REST proxy image de Confluent).
https://hub.docker.com/r/confluentinc/cp-kafka-rest/
La documentation du proxy REST est ici:
http://docs.confluent.io/3.1.2/kafka-rest/docs/index.html
Étape A: Créer une image Kafka docker broker en utilisant la dernière version Kafka version
J'ai utilisé une image de courtier personnalisée Kafka basée sur la même image que vous avez utilisée. Vous avez simplement besoin de mettre à jour l'image de cloudtrackinc pour utiliser Kafka version 0.10.1.0 ou sinon cela ne fonctionnera pas. Mettez simplement à jour le Dockerfile à partir de l'image de cloudertrackinc pour utiliser la dernière image wurstmeister kafka et reconstruisez l'image docker.
- FROM wurstmeister/kafka:0.10.1.0
J'ai défini le ADVERTISED_Host_NAME pour chaque courtier Kafka sur l'IP du POD afin que chaque courtier obtienne une URL unique.
- name: ADVERTISED_Host_NAME
valueFrom:
fieldRef:
fieldPath: status.podIP
Étape B: configurez le proxy cp-kafka-rest pour utiliser votre cluster de courtiers Kafka
Kafka Rest Proxy doit être exécuté dans le même cluster que votre cluster de courtiers Kafka.
Vous devez fournir au moins deux variables d'environnement à l'image cp-kafka-rest pour qu'elle s'exécute. KAFKA_REST_Host_NAME et KAFKA_REST_ZOOKEEPER_CONNECT. Vous pouvez définir KAFKA_REST_Host_NAME pour utiliser l'IP du POD.
- name: KAFKA_REST_Host_NAME
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: KAFKA_REST_ZOOKEEPER_CONNECT
value: "zookeeper-svc-1:2181,zookeeper-svc-2:2181,zookeeper-svc-3:2181"
Étape C: exposer le Kafka REST proxy en tant que service
spec: type: NodePort or LoadBalancer ports: - name: kafka-rest-port port: 8082 protocol: TCP
Vous pouvez utiliser NodePort ou LoadBalancer pour utiliser un ou plusieurs Kafka REST pods proxy).
Avantages et inconvénients de l'utilisation de Kafka REST proxy
Avantages:
Les inconvénients:
Donc, si vous pouvez vivre avec les problèmes ci-dessus, essayez Kafka Rest Proxy.
Cela ne semble pas être possible pour le moment, l'architecture réseau de kafka est assez médiocre à ce sujet. Le nouveau consommateur utilise une liste de courtiers, qui renvoient l'hôte du gardien de zoo, mais malheureusement c'est dans un réseau différent, donc il n'est pas possible de l'atteindre depuis votre client local. La partie pauvre de kafka est, ce n'est pas possible de spécifier les courtiers ET les serveurs zookeeper. Cela empêche les clients d'accéder au système de l'extérieur.
Nous avons travaillé autour de cela pour le moment en utilisant une busybox, où nous avons installé des outils pour interagir avec kafka. Dans notre cas piston