KAFKA_ADVERTISED_HOST_NAME
或KAFKA_ADVERTISED_LISTENERS
最终在ADVERTISED_HOST_NAME
中设置ADVERTISED_LISTENERS
/ server.properties
属性,无法帮助从kubernetes外部访问kafka簇。 请建议我如何从kubernetes集群外部发布/使用。非常感谢!
答案 0 :(得分:13)
我在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"
除此之外,我配置了两个服务。一个用于内部(无头)和一个用于外部(LoadBalancer)通信。
希望这会节省人们的时间。
答案 1 :(得分:7)
我能够通过以下更改来解决我的问题 -
在YML中使用NodeSelector使kafka pod在kube集群的特定节点上运行。
将KAFKA_ADVERTISED_HOST_NAME
设置为Kube hostName,此Kafka POD已配置为运行(如步骤1中所配置)
使用NodePort公开Kafka服务,并将POD端口设置为与公开的NodePort相同,如下所示 -
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代理答案 2 :(得分:4)
我使用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版本构建Kafka代理泊坞窗图像
我使用了基于您使用的相同图像的自定义构建的Kafka代理图像。您基本上只需要更新cloudtrackinc的图像以使用Kafka版本0.10.1.0,否则它将无法正常工作。只需从cloudertrackinc的图像更新Dockerfile即可使用最新的wurstmeister kafka图像并重建docker镜像。
- FROM wurstmeister/kafka:0.10.1.0
我将每个Kafka经纪商的ADVERTISED_HOST_NAME设置为POD的IP,以便每个经纪人获得一个唯一的网址。
- name: ADVERTISED_HOST_NAME
valueFrom:
fieldRef:
fieldPath: status.podIP
步骤B:设置cp-kafka-rest代理以使用您的Kafka代理群集
Kafka Rest Proxy必须与您的Kafka代理群集在同一群集中运行。
您需要为cp-kafka-rest图像提供两个环境变量,以便运行它。 KAFKA_REST_HOST_NAME和KAFKA_REST_ZOOKEEPER_CONNECT。您可以将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:
type: NodePort or LoadBalancer
ports:
- name: kafka-rest-port
port: 8082
protocol: TCP
您可以使用NodePort或LoadBalancer来使用单个或多个Kafka REST Proxy pod。
使用Kafka REST代理的优点和缺点
优点:
缺点:
因此,如果您能解决上述问题,请尝试一下Kafka Rest Proxy。
答案 3 :(得分:0)
目前看来这是不可能的,kafka的网络架构在这个主题上相当差。新的消费者使用一个代理商列表,它们返回了zookeeper的主机,但不幸的是,它位于不同的网络中,因此无法从本地客户端访问它。 kafka的糟糕部分是,无法指定代理和zookeeper服务器。这可以防止客户端从外部访问系统。
我们使用busybox解决了这个问题,我们在其中安装了与kafka交互的工具。在我们的案例中plunger