web-dev-qa-db-ja.com

Kafka Kubernetes Cluster内-Kubernetes Clusterの外部からメッセージをパブリッシュ/消費する方法

  1. 私はKafkaをデプロイしてKubernetesクラスターで実行しています。Dockerハブからこのイメージを使用しています- https://hub.docker.com/r/cloudtrackinc/kubernetes-kafka/
  2. 私のkubernetesクラスターには3つのkubeノードがあります。私は3 Kafkaと3つのzookeeperアプリケーションを実行しており、それに対応してZoo1、Zoo2、Zoo3とkafka-1、kafka-2、kafka-3のサービスを実行しています。公開/ kubernetesクラスターの内部から消費しますが、kubernetesクラスターの外部から、つまりkubernetesクラスターの一部ではない外部マシンから発行/消費できません。
  3. 外部マシンからkubeノードに到達できます-基本的に、name/ipを使用してpingできます。
  4. 外部ロードバランサーを使用していませんが、外部マシンとkubeノードの両方を解決できるDNSを持っています。
  5. NodePortまたはExternalIPを使用してKafkaサービスを公開することは、この場合機能しません。
  6. 設定KAFKA_ADVERTISED_Host_NAMEまたはKAFKA_ADVERTISED_LISTENERS in Kafka最終的に設定されるRC YML ADVERTISED_Host_NAME/ADVERTISED_LISTENERSプロパティserver.propertiesどちらも、kubernetesクラスターの外部からkafka=)にアクセスするのに役立ちません。

Kubernetesクラスターの外部からどのように公開/消費できるかを提案してください。どうもありがとう!

12
Manish Sinha

AWSのk8sクラスターの外部からkafkaにアクセスすることで同じ問題が発生しました。バージョン0.10以降のkafkaリスナー機能を使用して、この問題を解決しました。 2は複数のインターフェースをサポートします。

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"

それとは別に、2つのサービスを構成しました。 1つは内部(ヘッドレス)および1つは外部(LoadBalancer)通信用です。

うまくいけば、これは人々の時間を節約するでしょう。

13
Kamil Wojcik

次の変更を行うことで問題を解決できました-

  1. YMLでNodeSelectorを使用してkafka=ポッドをkubeクラスターの特定のノードで実行します。

  2. セットする KAFKA_ADVERTISED_Host_NAME to Kube hostName where Kafka POD on run on on(step 1で設定したとおり)

  3. 公開Kafka NodePortを使用してサービスを提供し、以下に示すように公開されたNodePortと同じPODポートを設定します-

    spec:
      ports:
        - name: broker-2
          port: **30031**
          targetPort: 9092
          nodePort: **30031**
          protocol: TCP
      selector:
        app: kafka-2
        broker_id: "2"
      type: NodePort
    

これで、Host:exposedPortを使用してkubeクラスターの外部からKafkaブローカーにアクセスできます

7
Manish Sinha

ConfluentのKafka RESTプロキシイメージを使用して、この問題を解決しました。

https://hub.docker.com/r/confluentinc/cp-kafka-rest/

RESTプロキシのドキュメントはこちらです:

http://docs.confluent.io/3.1.2/kafka-rest/docs/index.html

ステップA:最新のKafka versionを使用してKafkaブローカーDockerイメージをビルドします)

私はカスタムビルドを使用しましたKafka使用したのと同じイメージに基づくブローカーイメージ。基本的には、使用するためにcloudtrackincのイメージを更新する必要がありますKafkaバージョン0.10.1.0または最新のwurstmeister kafkaイメージを使用してDockerイメージを再構築するために、cloudertrackincのイメージからDockerfileを更新するだけです。

- FROM wurstmeister/kafka:0.10.1.0

各KafkaブローカーのADVERTISED_Host_NAMEをPODのIPに設定して、各ブローカーが一意のURLを取得するようにしました。

- name: ADVERTISED_Host_NAME
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

ステップB:Kafkaブローカークラスターを使用するようにcp-kafka-restプロキシをセットアップします

Kafka Rest Proxyは、Kafkaブローカークラスターと同じクラスター内で実行する必要があります。

Cp-kafka-restイメージを実行するには、少なくとも2つの環境変数を提供する必要があります。 KAFKA_REST_Host_NAMEおよびKAFKA_REST_ZOOKEEPER_CONNECT。 PAFのIPを使用するようにKAFKA_REST_Host_NAMEを設定できます。

- 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"

ステップC:Kafka RESTサービスとしてのプロキシ

spec: type: NodePort or LoadBalancer ports: - name: kafka-rest-port port: 8082 protocol: TCP

NodePortまたはLoadBalancerを使用して、単一または複数のKafka RESTプロキシポッドを利用できます。

Kafka REST proxyの使用の長所と短所

長所:

  1. Kafkaブローカークラスターを簡単にスケーリングできます
  2. クラスタの外にカクファブローカーを公開する必要はありません
  3. プロキシでロードバランサを使用できます。
  4. すべてのタイプのクライアントを使用してKafkaクラスター(つまり、curl)にアクセスできます)。非常に軽量です。

短所:

  1. Kakfaクラスターの上にある別のコンポーネント/レイヤー。
  2. コンシューマはプロキシポッド内に作成されます。これは、RESTクライアントが追跡する必要があります。
  3. パフォーマンスは理想的ではありません:RESTネイティブの代わりにKafkaプロトコル。複数のプロキシをデプロイする場合、これは少し役立つかもしれません。私はこの設定を使用しません大量のトラフィック。少量のメッセージトラフィックの場合、これで問題ない可能性があります。

したがって、上記の問題に対処できる場合は、Kafka Rest Proxyを試してみてください。

4
yuqing mai

これは現時点では可能ではないようです。kafkaのネットワークアーキテクチャは、このトピックに関してはかなり貧弱です。新しいコンシューマはブローカーのリストを使用します。ブローカーは、飼育係のホストを返しますが、残念ながら、これは別のネットワークにあるため、ローカルクライアントから到達できません。kafkaの悪いところは、ブローカーとzookeeperサーバーを指定できないことです。これにより、クライアントが外部からシステムにアクセスするのを防ぎます。

当面は、kafkaと対話するためのツールをインストールしたbusyboxを使用してこれを回避しました。私たちの場合 プランジャー

0
Dag