首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes集群中的Kafka --如何从Kubernetes集群外部发布/使用消息

Kubernetes集群中的Kafka --如何从Kubernetes集群外部发布/使用消息
EN

Stack Overflow用户
提问于 2017-01-26 06:51:00
回答 5查看 16.8K关注 0票数 13
  1. 我让卡夫卡部署并运行在库伯奈特斯集群中。我使用的图像来自码头枢纽- https://hub.docker.com/r/cloudtrackinc/kubernetes-kafka/
  2. 我有3个kube节点在我的kubernetes集群中。我有3个卡夫卡和3个动物园管理员应用程序运行,我有服务zoo1,zoo2,zoo3和卡夫卡-1,卡夫卡-2和卡夫卡-3运行相应的。我可以从内部发布/消费kubernetes集群,但我不能从kubernetes集群外部发布/消费,即从外部机器发布/消费,而不是kubernetes集群的一部分。
  3. 我能够从外部机器到达kube节点--基本上我可以使用name/ip对它们进行平分。
  4. 我不使用任何外部负载均衡器,但我有一个DNS,可以解决我的外部机器和库贝节点。
  5. 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用。
  6. 在Kafka YML中设置KAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_LISTENERS,最终在server.properties中设置ADVERTISED_HOST_NAME/ADVERTISED_LISTENERS属性,这都无助于从kubernetes集群之外访问kafka。

请建议我如何从kubernetes集群之外发布/消费。非常感谢!

EN

回答 5

Stack Overflow用户

发布于 2017-05-15 15:33:30

在AWS上从k8s集群外部访问kafka时,我也遇到了同样的问题。我设法通过使用kafka listeners特性来解决这个问题,该特性来自0.10.2版本,支持多个接口。

以下是我如何配置kafka容器。

代码语言:javascript
复制
    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)通信。

希望这能节省人们的时间。

票数 18
EN

Stack Overflow用户

发布于 2017-03-09 05:00:56

我可以通过做以下的改变来解决我的问题-

  1. 使用YML中的NodeSelector使卡夫卡荚在kube集群的特定节点上运行。
  2. KAFKA_ADVERTISED_HOST_NAME设置为Kube hostName,其中已将此Kafka配置为在其上运行(如步骤1所配置)
  3. 使用NodePort公开Kafka服务,并设置与公开的NodePort相同的端口,如下所示- 说明:端口:-名称: broker-2端口:**30031** targetPort: 9092 nodePort:**30031**协议: TCP选择器: app: kafka-2 broker_id:"2“类型: NodePort

现在,您可以使用主机:暴露端口从kube集群外部访问Kafka代理程序。

票数 7
EN

Stack Overflow用户

发布于 2017-01-27 07:16:21

我使用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 broker映像,它是基于您使用的相同的图像构建的。基本上,您只需更新cloudtrackinc的映像,就可以使用Kafka版本0.10.1.0,否则它将无法工作。只需从cloudertrackinc的映像中更新Dockerfile,就可以使用最新的wurstmeister图像并重新构建码头映像。

代码语言:javascript
复制
- FROM wurstmeister/kafka:0.10.1.0

我将每个Kafka的ADVERTISED_HOST_NAME设置为POD的IP,这样每个代理都会得到一个唯一的URL。

代码语言:javascript
复制
- name: ADVERTISED_HOST_NAME
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

步骤B:设置cluster代理来使用您的Kafka代理集群

Kafka Rest代理必须在与您的Kafka broker集群相同的集群中运行。

您需要至少为映像提供两个环境变量才能运行。KAFKA_REST_HOST_NAME和KAFKA_REST_ZOOKEEPER_CONNECT.您可以将KAFKA_REST_HOST_NAME设置为使用POD的IP。

代码语言:javascript
复制
- 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:将卡夫卡REST代理公开为服务

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

您可以使用NodePort或LoadBalancer来使用单个或多个Kafka代理荚。

使用卡夫卡REST代理的建议与建议

优点:

  1. 您可以轻松地缩放Kafka broker集群。
  2. 您不必在集群之外公开Kakfa代理。
  3. 您可以在代理中使用负载平衡器。
  4. 您可以使用任何类型的客户端访问Kafka集群(即curl)。重量很轻。

缺点:

  1. Kakfa集群顶部的另一个组件/层。
  2. 消费者是在代理吊舱中创建的。这需要由您的REST客户端来跟踪。
  3. 性能并不理想: REST而不是本地的Kafka协议。尽管如果您部署了多个代理,这可能会有所帮助。我不会将此设置用于大容量的流量。对于低容量的消息流量,这可能是可以的。

因此,如果你能接受上述问题,那么就给卡夫卡Rest代理一个尝试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41868161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档