Kubernetes集群中的Kafka-如何发布/使用来自Kubernetes集群外部的消息 我已经在Kubernetes集群中部署并运行了Kafka。我正在使用docker hub中的此图像- 我的kubernetes集群中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有相应的服务zoo1、zoo2、zoo3和Kafka-1、Kafka-2和Kafka-3在运行。我可以从kubernetes集群内部发布/消费,但我不能从kubernetes集群外部发布/消费,即从外部机器(不属于kubernetes集群)发布/消费 我能够从外部机器访问kube节点-基本上我可以使用name/ip ping它们 我没有使用任何外部负载平衡器,但我有一个DNS,可以解析我的外部机器和kube节点 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用 在KAFKA RC YML中设置KAFKA_advised_HOST_NAME或KAFKA_advised_侦听器,最终在服务器中设置advised_HOST_NAMEadvised_侦听器属性。属性都无助于从kubernetes集群外部访问KAFKA
请建议如何从kubernetes群集外部发布/消费。多谢 这在目前看来是不可能的,卡夫卡的网络架构在这个话题上相当糟糕。新消费者使用一个代理列表,该列表返回zookeeper的主机,但不幸的是,该主机位于不同的网络中,因此无法从本地客户端访问该主机。卡夫卡最糟糕的部分是,无法指定代理和zookeeper服务器。这会阻止客户端从外部访问系统Kubernetes集群中的Kafka-如何发布/使用来自Kubernetes集群外部的消息 我已经在Kubernetes集群中部署并运行了Kafka。我正在使用docker hub中的此图像- 我的kubernetes集群中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有相应的服务zoo1、zoo2、zoo3和Kafka-1、Kafka-2和Kafka-3在运行。我可以从kubernetes集群内部发布/消费,但我不能从kubernetes集群外部发布/消费,即从外部机器(不属于kubernetes集群)发布/消费 我能够从外部机器访问kube节点-基本上我可以使用name/ip ping它们 我没有使用任何外部负载平衡器,但我有一个DNS,可以解析我的外部机器和kube节点 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用 在KAFKA RC YML中设置KAFKA_advised_HOST_NAME或KAFKA_advised_侦听器,最终在服务器中设置advised_HOST_NAMEadvised_侦听器属性。属性都无助于从kubernetes集群外部访问KAFKA,docker,apache-kafka,kubernetes,Docker,Apache Kafka,Kubernetes,请建议如何从kubernetes群集外部发布/消费。多谢 这在目前看来是不可能的,卡夫卡的网络架构在这个话题上相当糟糕。新消费者使用一个代理列表,该列表返回zookeeper的主机,但不幸的是,该主机位于不同的网络中,因此无法从本地客户端访问该主机。卡夫卡最糟糕的部分是,无法指定代理和zookeeper服务器。这会阻止客户端从外部访问系统 我们使用一个busybox暂时解决了这个问题,在那里我们安装了与卡夫卡交互的工具。在我们的例子中,我使用Confluent的Kafka REST代理图像解决了
我们使用一个busybox暂时解决了这个问题,在那里我们安装了与卡夫卡交互的工具。在我们的例子中,我使用Confluent的Kafka REST代理图像解决了这个问题 REST代理的文档如下所示: 步骤A:使用最新的卡夫卡版本构建卡夫卡经纪人docker映像 我使用了一个基于您使用的相同图像的定制Kafka代理图像。基本上,您只需要更新cloudtrackinc的映像以使用Kafka版本0.10.1.0,否则它将无法工作。只需从cloudertrackinc的映像更新Dockerfile,以使用最新的wurstmeister kafka映像并重建docker映像
- FROM wurstmeister/kafka:0.10.1.0
我将每个Kafka代理的广告主机名设置为POD的IP,这样每个代理都会获得一个唯一的URL
- name: ADVERTISED_HOST_NAME
valueFrom:
fieldRef:
fieldPath: status.podIP
步骤B:设置cp kafka rest代理以使用kafka代理群集
Kafka Rest代理必须与Kafka代理集群在同一集群中运行
您需要至少为cp kafka rest映像提供两个环境变量,使其能够运行。卡夫卡休息室休息室主机名和卡夫卡休息室动物园管理员连接。您可以将KAFKA_REST_HOST_NAME设置为使用POD的IP
- 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:
类型:节点端口或负载平衡器
端口:
-名称:卡夫卡休息港
端口:8082
协议:TCP
您可以使用NodePort或LoadBalancer来利用单个或多个Kafka REST代理吊舱
使用卡夫卡REST代理的利弊
优点:
因此,如果您可以接受上述问题,那么请尝试使用Kafka Rest代理。我可以通过执行以下更改来解决我的问题-
KAFKA_advised_HOST_NAME
设置为Kube主机名,该KAFKA POD已配置为在其上运行(如步骤1中所配置)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代理。在AWS上,从k8s群集外部访问Kafka时,我遇到了相同的问题。我通过使用0.10.2版支持多接口的kafka侦听器功能来解决这个问题 下面是我如何配置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"
除此之外,我还配置了两个服务。一个用于内部(无头)通信,一个用于外部(负载平衡器)通信
希望这能节省人们的时间。谢谢@Dag是的,在kubernetes运行的卡夫卡集群位于不同的西北部。但是,由于集群计算机和外部计算机都可以由内部DNS服务器解析,是否有一种方法或解决方法可以使发布/使用来自外部计算机的消息成为可能?另外,由于我使用NodePort公开了kafka服务,我可以通过以下方式连接到卡夫卡:但仅从kubernetes集群内的机器n/w连接,从外部机器n/w连接不起作用,尽管我可以从外部机器访问/ping这些kube节点。互联网上的一些资源称,人们使用广告的主机名在AWS/云外部工作可能是因为公共IP…外部负载均衡器dnsThanks@yuqing mai。我还能够使我的初始配置工作。请看我对这个问题的回答。嗨,我想