KAFKA_ADVERTISED_Host_NAME
またはKAFKA_ADVERTISED_LISTENERS
in Kafka最終的に設定されるRC YML ADVERTISED_Host_NAME
/ADVERTISED_LISTENERS
プロパティserver.properties
どちらも、kubernetesクラスターの外部からkafka=)にアクセスするのに役立ちません。Kubernetesクラスターの外部からどのように公開/消費できるかを提案してください。どうもありがとう!
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)通信用です。
うまくいけば、これは人々の時間を節約するでしょう。
次の変更を行うことで問題を解決できました-
YMLでNodeSelectorを使用してkafka=ポッドをkubeクラスターの特定のノードで実行します。
セットする KAFKA_ADVERTISED_Host_NAME
to Kube hostName where Kafka POD on run on on(step 1で設定したとおり)
公開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ブローカーにアクセスできます
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の使用の長所と短所
長所:
短所:
したがって、上記の問題に対処できる場合は、Kafka Rest Proxyを試してみてください。
これは現時点では可能ではないようです。kafkaのネットワークアーキテクチャは、このトピックに関してはかなり貧弱です。新しいコンシューマはブローカーのリストを使用します。ブローカーは、飼育係のホストを返しますが、残念ながら、これは別のネットワークにあるため、ローカルクライアントから到達できません。kafkaの悪いところは、ブローカーとzookeeperサーバーを指定できないことです。これにより、クライアントが外部からシステムにアクセスするのを防ぎます。
当面は、kafkaと対話するためのツールをインストールしたbusyboxを使用してこれを回避しました。私たちの場合 プランジャー