web-dev-qa-db-fra.com

Kafka dans Kubernetes Cluster - Comment publier / consommer des messages depuis l'extérieur de Kubernetes Cluster

  1. J'ai Kafka déployé et exécuté dans le cluster Kubernetes. J'utilise cette image depuis le docker hub - https://hub.docker.com/r/cloudtrackinc/kubernetes-kafka/
  2. J'ai 3 nœuds kube dans mon cluster kubernetes. J'ai 3 Kafka et 3 applications zookeeper en cours d'exécution et j'ai les services Zoo1, Zoo2, Zoo3 et kafka-1, kafka-2 et kafka-3 qui leur correspondent. Je peux publier/consommer depuis l'intérieur du cluster kubernetes mais je ne suis pas en mesure de publier/consommer depuis l'extérieur du cluster kubernetes, c'est-à-dire depuis une machine externe ne faisant pas partie du cluster kubernetes.
  3. Je suis en mesure d'atteindre les nœuds de kube à partir d'une machine externe - fondamentalement, je peux les cingler en utilisant nom/ip.
  4. Je n'utilise aucun équilibreur de charge externe mais j'ai un DNS qui peut résoudre à la fois ma machine externe et mes nœuds kube.
  5. L'utilisation de NodePort ou ExternalIP pour exposer le service Kafka ne fonctionne pas dans ce cas.
  6. Réglage 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!

12
Manish Sinha

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.

13
Kamil Wojcik

J'ai pu résoudre mon problème en effectuant les modifications suivantes -

  1. Utilisation de NodeSelector en YML pour faire fonctionner le module kafka sur un nœud particulier du cluster kube.

  2. Ensemble KAFKA_ADVERTISED_Host_NAME à Kube hostName où ce Kafka POD a été configuré pour s'exécuter (comme configuré à l'étape 1)

  3. 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

7
Manish Sinha

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:

  1. Vous pouvez facilement faire évoluer Kafka cluster de courtiers
  2. Vous n'avez pas à exposer les courtiers Kakfa en dehors du cluster
  3. Vous pouvez utiliser l'équilibreur de charge avec le proxy.
  4. Vous pouvez utiliser n'importe quel type de client pour accéder au cluster Kafka (c.-à-d. Curl). Très léger.

Les inconvénients:

  1. Un autre composant/couche au-dessus du cluster Kakfa.
  2. Les consommateurs sont créés dans le module proxy. Cela devra être suivi par votre REST client.
  3. Les performances ne sont pas idéales: REST au lieu du protocole natif Kafka protocole. Bien que si vous déployez plusieurs proxys, cela pourrait aider un peu. Je n'utiliserais pas cette configuration pour trafic à volume élevé. Pour le trafic de messages à faible volume, cela peut être correct.

Donc, si vous pouvez vivre avec les problèmes ci-dessus, essayez Kafka Rest Proxy.

4
yuqing mai

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

0
Dag