-
我在Kubernetes集群中部署并运行了Kafka . 我正在使用码头中心的这个图像 - https://hub.docker.com/r/cloudtrackinc/kubernetes-kafka/
-
我的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_ADVERTISED_HOST_NAME
或KAFKA_ADVERTISED_LISTENERS
最终在server.properties
中设置了ADVERTISED_HOST_NAME
/ADVERTISED_LISTENERS
属性,这无助于从kubernetes集群外部访问kafka .
请建议我如何从kubernetes集群外部发布/使用 . 非常感谢!
4 回答
我在AWS上从k8s群集外部访问kafka时遇到了同样的问题 . 我设法通过使用版本0.10.2支持多个接口的kafka侦听器功能来解决此问题 .
这是我如何配置kafka容器 .
除此之外,我配置了两个服务 . 一个用于内部(无头)和一个用于外部(LoadBalancer)通信 .
希望这会节省人们的时间 .
通过进行以下更改,我能够解决我的问题 -
在YML中使用NodeSelector使kafka pod在kube集群的特定节点上运行 .
将
KAFKA_ADVERTISED_HOST_NAME
设置为Kube hostName,此Kafka POD已配置为运行(如步骤1中所配置)使用NodePort公开Kafka服务并将POD端口设置为与公开的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
Step A: Build a Kafka broker docker image using latest Kafka version
我使用了基于您使用的相同图像的自定义构建的Kafka代理图像 . 您基本上只需要更新cloudtrackinc的图像以使用Kafka版本0.10.1.0,否则它将无法正常工作 . 只需从cloudertrackinc的图像更新Dockerfile即可使用最新的wurstmeister kafka图像并重建docker镜像 .
我将每个Kafka代理的ADVERTISED_HOST_NAME设置为POD的IP,以便每个代理获得一个唯一的URL .
Step B: Setup cp-kafka-rest proxy to use your Kafka broker cluster
Kafka Rest代理必须与Kafka代理群集在同一群集中运行 .
您需要至少为cp-kafka-rest映像提供两个环境变量才能运行它 . KAFKA_REST_HOST_NAME和KAFKA_REST_ZOOKEEPER_CONNECT . 您可以将KAFKA_REST_HOST_NAME设置为使用POD的IP .
Step C: Expose the Kafka REST proxy as a service
spec: type: NodePort or LoadBalancer ports: - name: kafka-rest-port port: 8082 protocol: TCP
您可以使用NodePort或LoadBalancer来使用单个或多个Kafka REST Proxy pod .
Pros and Cons of using Kafka REST proxy
优点:
您可以轻松扩展Kafka代理群集
您不必在集群外部公开Kakfa代理
您可以将loadbalancer与Proxy配合使用 .
您可以使用任何类型的客户端来访问Kafka群集(即curl) . 重量很轻 .
缺点:
Kakfa集群顶部的另一个组件/层 .
在代理窗格中创建了使用者 . 这需要由REST客户端跟踪 .
性能不理想:REST而不是本机Kafka协议 . 虽然如果部署多个代理,这可能会有所帮助 . 我不会将此设置用于大量流量 . 对于低容量消息流量,这可能没问题 .
因此,如果您能解决上述问题,请尝试使用Kafka Rest Proxy .
目前看来这是不可能的,kafka的网络架构在这个主题上相当差 . 新的消费者使用一个代理商列表,它们返回了zookeeper的主机,但不幸的是,它位于不同的网络中,因此无法从本地客户端访问它 . kafka的不良部分是,无法指定代理和zookeeper服务器 . 这可以防止客户端从外部访问系统 .
我们使用busybox解决了这个问题,我们在其中安装了与kafka交互的工具 . 在我们的案例中plunger